diff --git a/.next/cache/webpack/client-development/0.pack.gz b/.next/cache/webpack/client-development/0.pack.gz index d3d723c..71b36ac 100644 Binary files a/.next/cache/webpack/client-development/0.pack.gz and b/.next/cache/webpack/client-development/0.pack.gz differ diff --git a/.next/cache/webpack/client-development/1.pack.gz b/.next/cache/webpack/client-development/1.pack.gz index f154d64..f5212ab 100644 Binary files a/.next/cache/webpack/client-development/1.pack.gz and b/.next/cache/webpack/client-development/1.pack.gz differ diff --git a/.next/cache/webpack/client-development/10.pack.gz b/.next/cache/webpack/client-development/10.pack.gz index 786495a..5db7530 100644 Binary files a/.next/cache/webpack/client-development/10.pack.gz and b/.next/cache/webpack/client-development/10.pack.gz differ diff --git a/.next/cache/webpack/client-development/11.pack.gz b/.next/cache/webpack/client-development/11.pack.gz index 296db5c..8c72a6f 100644 Binary files a/.next/cache/webpack/client-development/11.pack.gz and b/.next/cache/webpack/client-development/11.pack.gz differ diff --git a/.next/cache/webpack/client-development/12.pack.gz b/.next/cache/webpack/client-development/12.pack.gz index 6dfbbab..89be20a 100644 Binary files a/.next/cache/webpack/client-development/12.pack.gz and b/.next/cache/webpack/client-development/12.pack.gz differ diff --git a/.next/cache/webpack/client-development/2.pack.gz b/.next/cache/webpack/client-development/2.pack.gz index d6ea627..39e0ea8 100644 Binary files a/.next/cache/webpack/client-development/2.pack.gz and b/.next/cache/webpack/client-development/2.pack.gz differ diff --git a/.next/cache/webpack/client-development/4.pack.gz b/.next/cache/webpack/client-development/4.pack.gz index ba63bbd..b367943 100644 Binary files a/.next/cache/webpack/client-development/4.pack.gz and b/.next/cache/webpack/client-development/4.pack.gz differ diff --git a/.next/cache/webpack/client-development/5.pack.gz b/.next/cache/webpack/client-development/5.pack.gz index 85959a5..22f0323 100644 Binary files a/.next/cache/webpack/client-development/5.pack.gz and b/.next/cache/webpack/client-development/5.pack.gz differ diff --git a/.next/cache/webpack/client-development/6.pack.gz b/.next/cache/webpack/client-development/6.pack.gz index 842be7d..3206321 100644 Binary files a/.next/cache/webpack/client-development/6.pack.gz and b/.next/cache/webpack/client-development/6.pack.gz differ diff --git a/.next/cache/webpack/client-development/7.pack.gz b/.next/cache/webpack/client-development/7.pack.gz index 48bbefc..f5a4bb6 100644 Binary files a/.next/cache/webpack/client-development/7.pack.gz and b/.next/cache/webpack/client-development/7.pack.gz differ diff --git a/.next/cache/webpack/client-development/8.pack.gz b/.next/cache/webpack/client-development/8.pack.gz index 82c32df..b45ead3 100644 Binary files a/.next/cache/webpack/client-development/8.pack.gz and b/.next/cache/webpack/client-development/8.pack.gz differ diff --git a/.next/cache/webpack/client-development/9.pack.gz b/.next/cache/webpack/client-development/9.pack.gz index f234c54..3b57d16 100644 Binary files a/.next/cache/webpack/client-development/9.pack.gz and b/.next/cache/webpack/client-development/9.pack.gz differ diff --git a/.next/cache/webpack/client-development/index.pack.gz b/.next/cache/webpack/client-development/index.pack.gz index a83c6cc..4f39fa0 100644 Binary files a/.next/cache/webpack/client-development/index.pack.gz and b/.next/cache/webpack/client-development/index.pack.gz differ diff --git a/.next/cache/webpack/client-development/index.pack.gz.old b/.next/cache/webpack/client-development/index.pack.gz.old index 60e0deb..b0b3d7f 100644 Binary files a/.next/cache/webpack/client-development/index.pack.gz.old and b/.next/cache/webpack/client-development/index.pack.gz.old differ diff --git a/.next/cache/webpack/server-development/0.pack.gz b/.next/cache/webpack/server-development/0.pack.gz index 417fc3c..63a4a26 100644 Binary files a/.next/cache/webpack/server-development/0.pack.gz and b/.next/cache/webpack/server-development/0.pack.gz differ diff --git a/.next/cache/webpack/server-development/1.pack.gz b/.next/cache/webpack/server-development/1.pack.gz index d24d1d9..a548867 100644 Binary files a/.next/cache/webpack/server-development/1.pack.gz and b/.next/cache/webpack/server-development/1.pack.gz differ diff --git a/.next/cache/webpack/server-development/10.pack.gz b/.next/cache/webpack/server-development/10.pack.gz index 53b2bdd..e21caa8 100644 Binary files a/.next/cache/webpack/server-development/10.pack.gz and b/.next/cache/webpack/server-development/10.pack.gz differ diff --git a/.next/cache/webpack/server-development/12.pack.gz b/.next/cache/webpack/server-development/12.pack.gz new file mode 100644 index 0000000..e9ae890 Binary files /dev/null and b/.next/cache/webpack/server-development/12.pack.gz differ diff --git a/.next/cache/webpack/server-development/2.pack.gz b/.next/cache/webpack/server-development/2.pack.gz index 61f9d26..85ecd59 100644 Binary files a/.next/cache/webpack/server-development/2.pack.gz and b/.next/cache/webpack/server-development/2.pack.gz differ diff --git a/.next/cache/webpack/server-development/3.pack.gz b/.next/cache/webpack/server-development/3.pack.gz index 0a664c1..54245c9 100644 Binary files a/.next/cache/webpack/server-development/3.pack.gz and b/.next/cache/webpack/server-development/3.pack.gz differ diff --git a/.next/cache/webpack/server-development/4.pack.gz b/.next/cache/webpack/server-development/4.pack.gz index a1172fa..e8f48cc 100644 Binary files a/.next/cache/webpack/server-development/4.pack.gz and b/.next/cache/webpack/server-development/4.pack.gz differ diff --git a/.next/cache/webpack/server-development/6.pack.gz b/.next/cache/webpack/server-development/6.pack.gz index 3d7aed0..00e0f38 100644 Binary files a/.next/cache/webpack/server-development/6.pack.gz and b/.next/cache/webpack/server-development/6.pack.gz differ diff --git a/.next/cache/webpack/server-development/7.pack.gz b/.next/cache/webpack/server-development/7.pack.gz index 5363e6b..40a1a28 100644 Binary files a/.next/cache/webpack/server-development/7.pack.gz and b/.next/cache/webpack/server-development/7.pack.gz differ diff --git a/.next/cache/webpack/server-development/8.pack.gz b/.next/cache/webpack/server-development/8.pack.gz index 74a4baa..bb43bcf 100644 Binary files a/.next/cache/webpack/server-development/8.pack.gz and b/.next/cache/webpack/server-development/8.pack.gz differ diff --git a/.next/cache/webpack/server-development/9.pack.gz b/.next/cache/webpack/server-development/9.pack.gz index a00c278..65c33a1 100644 Binary files a/.next/cache/webpack/server-development/9.pack.gz and b/.next/cache/webpack/server-development/9.pack.gz differ diff --git a/.next/cache/webpack/server-development/index.pack.gz b/.next/cache/webpack/server-development/index.pack.gz index a684466..d22db0b 100644 Binary files a/.next/cache/webpack/server-development/index.pack.gz and b/.next/cache/webpack/server-development/index.pack.gz differ diff --git a/.next/cache/webpack/server-development/index.pack.gz.old b/.next/cache/webpack/server-development/index.pack.gz.old index af2f62b..93971d8 100644 Binary files a/.next/cache/webpack/server-development/index.pack.gz.old and b/.next/cache/webpack/server-development/index.pack.gz.old differ diff --git a/.next/server/app-paths-manifest.json b/.next/server/app-paths-manifest.json index 3d903eb..31fcab9 100644 --- a/.next/server/app-paths-manifest.json +++ b/.next/server/app-paths-manifest.json @@ -1,7 +1,7 @@ { "/gunbuilder/admin/merchants/page": "app/gunbuilder/admin/merchants/page.js", "/gunbuilder/page": "app/gunbuilder/page.js", - "/gunbuilder/build/page": "app/gunbuilder/build/page.js", "/gunbuilder/[categoryId]/page": "app/gunbuilder/[categoryId]/page.js", - "/gunbuilder/admin/category-mappings/page": "app/gunbuilder/admin/category-mappings/page.js" + "/gunbuilder/admin/category-mappings/page": "app/gunbuilder/admin/category-mappings/page.js", + "/gunbuilder/[categoryId]/[partId]/page": "app/gunbuilder/[categoryId]/[partId]/page.js" } \ No newline at end of file diff --git a/.next/server/app/_not-found/page.js b/.next/server/app/_not-found/page.js new file mode 100644 index 0000000..2158863 --- /dev/null +++ b/.next/server/app/_not-found/page.js @@ -0,0 +1,155 @@ +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(() => { +var exports = {}; +exports.id = "app/_not-found/page"; +exports.ids = ["app/_not-found/page"]; +exports.modules = { + +/***/ "./action-async-storage.external": +/*!****************************************************************************!*\ + !*** external "next/dist/client/components/action-async-storage.external" ***! + \****************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/action-async-storage.external"); + +/***/ }), + +/***/ "../../client/components/action-async-storage.external": +/*!*******************************************************************************!*\ + !*** external "next/dist/client/components/action-async-storage.external.js" ***! + \*******************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/action-async-storage.external.js"); + +/***/ }), + +/***/ "./request-async-storage.external": +/*!*****************************************************************************!*\ + !*** external "next/dist/client/components/request-async-storage.external" ***! + \*****************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/request-async-storage.external"); + +/***/ }), + +/***/ "../../client/components/request-async-storage.external": +/*!********************************************************************************!*\ + !*** external "next/dist/client/components/request-async-storage.external.js" ***! + \********************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/request-async-storage.external.js"); + +/***/ }), + +/***/ "./static-generation-async-storage.external": +/*!***************************************************************************************!*\ + !*** external "next/dist/client/components/static-generation-async-storage.external" ***! + \***************************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/static-generation-async-storage.external"); + +/***/ }), + +/***/ "../../client/components/static-generation-async-storage.external": +/*!******************************************************************************************!*\ + !*** external "next/dist/client/components/static-generation-async-storage.external.js" ***! + \******************************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/client/components/static-generation-async-storage.external.js"); + +/***/ }), + +/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js": +/*!*************************************************************************!*\ + !*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***! + \*************************************************************************/ +/***/ ((module) => { + +"use strict"; +module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js"); + +/***/ }), + +/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!": +/*!*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***! + \*******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GlobalError: () => (/* reexport default from dynamic */ next_dist_client_components_error_boundary__WEBPACK_IMPORTED_MODULE_2___default.a),\n/* harmony export */ __next_app__: () => (/* binding */ __next_app__),\n/* harmony export */ originalPathname: () => (/* binding */ originalPathname),\n/* harmony export */ pages: () => (/* binding */ pages),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ tree: () => (/* binding */ tree)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_future_route_modules_app_page_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/future/route-modules/app-page/module.compiled */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/module.compiled.js?d969\");\n/* harmony import */ var next_dist_server_future_route_modules_app_page_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_future_route_modules_app_page_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/future/route-kind */ \"(rsc)/./node_modules/next/dist/server/future/route-kind.js\");\n/* harmony import */ var next_dist_client_components_error_boundary__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/client/components/error-boundary */ \"(rsc)/./node_modules/next/dist/client/components/error-boundary.js\");\n/* harmony import */ var next_dist_client_components_error_boundary__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_client_components_error_boundary__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var next_dist_server_app_render_entry_base__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/dist/server/app-render/entry-base */ \"(rsc)/./node_modules/next/dist/server/app-render/entry-base.js\");\n/* harmony import */ var next_dist_server_app_render_entry_base__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_app_render_entry_base__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony reexport (unknown) */ var __WEBPACK_REEXPORT_OBJECT__ = {};\n/* harmony reexport (unknown) */ for(const __WEBPACK_IMPORT_KEY__ in next_dist_server_app_render_entry_base__WEBPACK_IMPORTED_MODULE_3__) if([\"default\",\"tree\",\"pages\",\"GlobalError\",\"originalPathname\",\"__next_app__\",\"routeModule\"].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = () => next_dist_server_app_render_entry_base__WEBPACK_IMPORTED_MODULE_3__[__WEBPACK_IMPORT_KEY__]\n/* harmony reexport (unknown) */ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);\n\"TURBOPACK { transition: next-ssr }\";\n\n\n// We inject the tree and pages here so that we can use them in the route\n// module.\nconst tree = {\n children: [\n '',\n {\n children: [\"/_not-found\", {\n children: ['__PAGE__', {}, {\n page: [\n () => Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! next/dist/client/components/not-found-error */ \"(rsc)/./node_modules/next/dist/client/components/not-found-error.js\", 23)),\n \"next/dist/client/components/not-found-error\"\n ]\n }]\n }, {}]\n },\n {\n 'layout': [() => Promise.resolve(/*! import() eager */).then(__webpack_require__.bind(__webpack_require__, /*! ./app/layout.tsx */ \"(rsc)/./app/layout.tsx\")), \"/Users/sean/Dev/gunbuilder-prototype/app/layout.tsx\"],\n'not-found': [() => Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! next/dist/client/components/not-found-error */ \"(rsc)/./node_modules/next/dist/client/components/not-found-error.js\", 23)), \"next/dist/client/components/not-found-error\"],\n \n }\n ]\n }.children;\nconst pages = [];\n\n\nconst __next_app_require__ = __webpack_require__\nconst __next_app_load_chunk__ = () => Promise.resolve()\nconst originalPathname = \"/_not-found/page\";\nconst __next_app__ = {\n require: __next_app_require__,\n loadChunk: __next_app_load_chunk__\n};\n\n// Create and export the route module that will be consumed.\nconst routeModule = new next_dist_server_future_route_modules_app_page_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppPageRouteModule({\n definition: {\n kind: next_dist_server_future_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_PAGE,\n page: \"/_not-found/page\",\n pathname: \"/_not-found\",\n // The following aren't used in production.\n bundlePath: \"\",\n filename: \"\",\n appPaths: []\n },\n userland: {\n loaderTree: tree\n }\n});\n\n//# sourceMappingURL=app-page.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIuanM/bmFtZT1hcHAlMkZfbm90LWZvdW5kJTJGcGFnZSZwYWdlPSUyRl9ub3QtZm91bmQlMkZwYWdlJmFwcFBhdGhzPSZwYWdlUGF0aD1ub2RlX21vZHVsZXMlMkZuZXh0JTJGZGlzdCUyRmNsaWVudCUyRmNvbXBvbmVudHMlMkZub3QtZm91bmQtZXJyb3IuanMmYXBwRGlyPSUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGYXBwJnBhZ2VFeHRlbnNpb25zPXRzeCZwYWdlRXh0ZW5zaW9ucz10cyZwYWdlRXh0ZW5zaW9ucz1qc3gmcGFnZUV4dGVuc2lvbnM9anMmcm9vdERpcj0lMkZVc2VycyUyRnNlYW4lMkZEZXYlMkZndW5idWlsZGVyLXByb3RvdHlwZSZpc0Rldj10cnVlJnRzY29uZmlnUGF0aD10c2NvbmZpZy5qc29uJmJhc2VQYXRoPSZhc3NldFByZWZpeD0mbmV4dENvbmZpZ091dHB1dD0mcHJlZmVycmVkUmVnaW9uPSZtaWRkbGV3YXJlQ29uZmlnPWUzMCUzRCEiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGFBQWEsc0JBQXNCO0FBQ2lFO0FBQ3JDO0FBQy9EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUNBQXFDO0FBQ3JDO0FBQ0Esc0JBQXNCLDBOQUFnRjtBQUN0RztBQUNBO0FBQ0EsYUFBYTtBQUNiLFdBQVcsSUFBSTtBQUNmLFNBQVM7QUFDVDtBQUNBLHlCQUF5Qiw0SUFBd0Y7QUFDakgsb0JBQW9CLDBOQUFnRjtBQUNwRztBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDdUI7QUFDNkQ7QUFDcEYsNkJBQTZCLG1CQUFtQjtBQUNoRDtBQUNPO0FBQ0E7QUFDUDtBQUNBO0FBQ0E7QUFDdUQ7QUFDdkQ7QUFDTyx3QkFBd0IsOEdBQWtCO0FBQ2pEO0FBQ0EsY0FBYyx5RUFBUztBQUN2QjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0EsQ0FBQzs7QUFFRCIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLz8wZTY0Il0sInNvdXJjZXNDb250ZW50IjpbIlwiVFVSQk9QQUNLIHsgdHJhbnNpdGlvbjogbmV4dC1zc3IgfVwiO1xuaW1wb3J0IHsgQXBwUGFnZVJvdXRlTW9kdWxlIH0gZnJvbSBcIm5leHQvZGlzdC9zZXJ2ZXIvZnV0dXJlL3JvdXRlLW1vZHVsZXMvYXBwLXBhZ2UvbW9kdWxlLmNvbXBpbGVkXCI7XG5pbXBvcnQgeyBSb3V0ZUtpbmQgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9mdXR1cmUvcm91dGUta2luZFwiO1xuLy8gV2UgaW5qZWN0IHRoZSB0cmVlIGFuZCBwYWdlcyBoZXJlIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGVtIGluIHRoZSByb3V0ZVxuLy8gbW9kdWxlLlxuY29uc3QgdHJlZSA9IHtcbiAgICAgICAgY2hpbGRyZW46IFtcbiAgICAgICAgJycsXG4gICAgICAgIHtcbiAgICAgICAgICBjaGlsZHJlbjogW1wiL19ub3QtZm91bmRcIiwge1xuICAgICAgICAgICAgY2hpbGRyZW46IFsnX19QQUdFX18nLCB7fSwge1xuICAgICAgICAgICAgICBwYWdlOiBbXG4gICAgICAgICAgICAgICAgKCkgPT4gaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCJuZXh0L2Rpc3QvY2xpZW50L2NvbXBvbmVudHMvbm90LWZvdW5kLWVycm9yXCIpLFxuICAgICAgICAgICAgICAgIFwibmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL25vdC1mb3VuZC1lcnJvclwiXG4gICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgfSwge31dXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgJ2xheW91dCc6IFsoKSA9PiBpbXBvcnQoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9Vc2Vycy9zZWFuL0Rldi9ndW5idWlsZGVyLXByb3RvdHlwZS9hcHAvbGF5b3V0LnRzeFwiKSwgXCIvVXNlcnMvc2Vhbi9EZXYvZ3VuYnVpbGRlci1wcm90b3R5cGUvYXBwL2xheW91dC50c3hcIl0sXG4nbm90LWZvdW5kJzogWygpID0+IGltcG9ydCgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwibmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL25vdC1mb3VuZC1lcnJvclwiKSwgXCJuZXh0L2Rpc3QvY2xpZW50L2NvbXBvbmVudHMvbm90LWZvdW5kLWVycm9yXCJdLFxuICAgICAgICBcbiAgICAgIH1cbiAgICAgIF1cbiAgICAgIH0uY2hpbGRyZW47XG5jb25zdCBwYWdlcyA9IFtdO1xuZXhwb3J0IHsgdHJlZSwgcGFnZXMgfTtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgR2xvYmFsRXJyb3IgfSBmcm9tIFwibmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL2Vycm9yLWJvdW5kYXJ5XCI7XG5jb25zdCBfX25leHRfYXBwX3JlcXVpcmVfXyA9IF9fd2VicGFja19yZXF1aXJlX19cbmNvbnN0IF9fbmV4dF9hcHBfbG9hZF9jaHVua19fID0gKCkgPT4gUHJvbWlzZS5yZXNvbHZlKClcbmV4cG9ydCBjb25zdCBvcmlnaW5hbFBhdGhuYW1lID0gXCIvX25vdC1mb3VuZC9wYWdlXCI7XG5leHBvcnQgY29uc3QgX19uZXh0X2FwcF9fID0ge1xuICAgIHJlcXVpcmU6IF9fbmV4dF9hcHBfcmVxdWlyZV9fLFxuICAgIGxvYWRDaHVuazogX19uZXh0X2FwcF9sb2FkX2NodW5rX19cbn07XG5leHBvcnQgKiBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9hcHAtcmVuZGVyL2VudHJ5LWJhc2VcIjtcbi8vIENyZWF0ZSBhbmQgZXhwb3J0IHRoZSByb3V0ZSBtb2R1bGUgdGhhdCB3aWxsIGJlIGNvbnN1bWVkLlxuZXhwb3J0IGNvbnN0IHJvdXRlTW9kdWxlID0gbmV3IEFwcFBhZ2VSb3V0ZU1vZHVsZSh7XG4gICAgZGVmaW5pdGlvbjoge1xuICAgICAgICBraW5kOiBSb3V0ZUtpbmQuQVBQX1BBR0UsXG4gICAgICAgIHBhZ2U6IFwiL19ub3QtZm91bmQvcGFnZVwiLFxuICAgICAgICBwYXRobmFtZTogXCIvX25vdC1mb3VuZFwiLFxuICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGFyZW4ndCB1c2VkIGluIHByb2R1Y3Rpb24uXG4gICAgICAgIGJ1bmRsZVBhdGg6IFwiXCIsXG4gICAgICAgIGZpbGVuYW1lOiBcIlwiLFxuICAgICAgICBhcHBQYXRoczogW11cbiAgICB9LFxuICAgIHVzZXJsYW5kOiB7XG4gICAgICAgIGxvYWRlclRyZWU6IHRyZWVcbiAgICB9XG59KTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLXBhZ2UuanMubWFwIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n"); + +/***/ }), + +/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=true!": +/*!********************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=true! ***! + \********************************************************************************************************************************************************************************************************************************/ +/***/ (() => { + + + +/***/ }), + +/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=true!": +/*!**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=true! ***! + \**********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/ +/***/ ((__unused_webpack_module, __unused_webpack_exports, __webpack_require__) => { + +eval("Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/app-router.js */ \"(ssr)/./node_modules/next/dist/client/components/app-router.js\", 23));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/client-page.js */ \"(ssr)/./node_modules/next/dist/client/components/client-page.js\", 23));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/error-boundary.js */ \"(ssr)/./node_modules/next/dist/client/components/error-boundary.js\", 23));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/layout-router.js */ \"(ssr)/./node_modules/next/dist/client/components/layout-router.js\", 23));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/not-found-boundary.js */ \"(ssr)/./node_modules/next/dist/client/components/not-found-boundary.js\", 23));\n;\nPromise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__webpack_require__, /*! ./node_modules/next/dist/client/components/render-from-template-context.js */ \"(ssr)/./node_modules/next/dist/client/components/render-from-template-context.js\", 23));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWZsaWdodC1jbGllbnQtZW50cnktbG9hZGVyLmpzP21vZHVsZXM9JTdCJTIycmVxdWVzdCUyMiUzQSUyMiUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGbm9kZV9tb2R1bGVzJTJGbmV4dCUyRmRpc3QlMkZjbGllbnQlMkZjb21wb25lbnRzJTJGYXBwLXJvdXRlci5qcyUyMiUyQyUyMmlkcyUyMiUzQSU1QiU1RCU3RCZtb2R1bGVzPSU3QiUyMnJlcXVlc3QlMjIlM0ElMjIlMkZVc2VycyUyRnNlYW4lMkZEZXYlMkZndW5idWlsZGVyLXByb3RvdHlwZSUyRm5vZGVfbW9kdWxlcyUyRm5leHQlMkZkaXN0JTJGY2xpZW50JTJGY29tcG9uZW50cyUyRmNsaWVudC1wYWdlLmpzJTIyJTJDJTIyaWRzJTIyJTNBJTVCJTVEJTdEJm1vZHVsZXM9JTdCJTIycmVxdWVzdCUyMiUzQSUyMiUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGbm9kZV9tb2R1bGVzJTJGbmV4dCUyRmRpc3QlMkZjbGllbnQlMkZjb21wb25lbnRzJTJGZXJyb3ItYm91bmRhcnkuanMlMjIlMkMlMjJpZHMlMjIlM0ElNUIlNUQlN0QmbW9kdWxlcz0lN0IlMjJyZXF1ZXN0JTIyJTNBJTIyJTJGVXNlcnMlMkZzZWFuJTJGRGV2JTJGZ3VuYnVpbGRlci1wcm90b3R5cGUlMkZub2RlX21vZHVsZXMlMkZuZXh0JTJGZGlzdCUyRmNsaWVudCUyRmNvbXBvbmVudHMlMkZsYXlvdXQtcm91dGVyLmpzJTIyJTJDJTIyaWRzJTIyJTNBJTVCJTVEJTdEJm1vZHVsZXM9JTdCJTIycmVxdWVzdCUyMiUzQSUyMiUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGbm9kZV9tb2R1bGVzJTJGbmV4dCUyRmRpc3QlMkZjbGllbnQlMkZjb21wb25lbnRzJTJGbm90LWZvdW5kLWJvdW5kYXJ5LmpzJTIyJTJDJTIyaWRzJTIyJTNBJTVCJTVEJTdEJm1vZHVsZXM9JTdCJTIycmVxdWVzdCUyMiUzQSUyMiUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGbm9kZV9tb2R1bGVzJTJGbmV4dCUyRmRpc3QlMkZjbGllbnQlMkZjb21wb25lbnRzJTJGcmVuZGVyLWZyb20tdGVtcGxhdGUtY29udGV4dC5qcyUyMiUyQyUyMmlkcyUyMiUzQSU1QiU1RCU3RCZzZXJ2ZXI9dHJ1ZSEiLCJtYXBwaW5ncyI6IkFBQUEsa09BQWdJO0FBQ2hJO0FBQ0Esb09BQWlJO0FBQ2pJO0FBQ0EsME9BQW9JO0FBQ3BJO0FBQ0Esd09BQW1JO0FBQ25JO0FBQ0Esa1BBQXdJO0FBQ3hJO0FBQ0Esc1FBQWtKIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvPzdiMjUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvVXNlcnMvc2Vhbi9EZXYvZ3VuYnVpbGRlci1wcm90b3R5cGUvbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvY29tcG9uZW50cy9hcHAtcm91dGVyLmpzXCIpO1xuO1xuaW1wb3J0KC8qIHdlYnBhY2tNb2RlOiBcImVhZ2VyXCIgKi8gXCIvVXNlcnMvc2Vhbi9EZXYvZ3VuYnVpbGRlci1wcm90b3R5cGUvbm9kZV9tb2R1bGVzL25leHQvZGlzdC9jbGllbnQvY29tcG9uZW50cy9jbGllbnQtcGFnZS5qc1wiKTtcbjtcbmltcG9ydCgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwiL1VzZXJzL3NlYW4vRGV2L2d1bmJ1aWxkZXItcHJvdG90eXBlL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2NvbXBvbmVudHMvZXJyb3ItYm91bmRhcnkuanNcIik7XG47XG5pbXBvcnQoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9Vc2Vycy9zZWFuL0Rldi9ndW5idWlsZGVyLXByb3RvdHlwZS9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL2xheW91dC1yb3V0ZXIuanNcIik7XG47XG5pbXBvcnQoLyogd2VicGFja01vZGU6IFwiZWFnZXJcIiAqLyBcIi9Vc2Vycy9zZWFuL0Rldi9ndW5idWlsZGVyLXByb3RvdHlwZS9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL25vdC1mb3VuZC1ib3VuZGFyeS5qc1wiKTtcbjtcbmltcG9ydCgvKiB3ZWJwYWNrTW9kZTogXCJlYWdlclwiICovIFwiL1VzZXJzL3NlYW4vRGV2L2d1bmJ1aWxkZXItcHJvdG90eXBlL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2NvbXBvbmVudHMvcmVuZGVyLWZyb20tdGVtcGxhdGUtY29udGV4dC5qc1wiKTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=true!\n"); + +/***/ }), + +/***/ "(rsc)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (\"8e3b978f6080\");\nif (false) {}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvZ2xvYmFscy5jc3MiLCJtYXBwaW5ncyI6Ijs7OztBQUFBLGlFQUFlLGNBQWM7QUFDN0IsSUFBSSxLQUFVLEVBQUUsRUFBdUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2FwcC9nbG9iYWxzLmNzcz9jZDI4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwiOGUzYjk3OGY2MDgwXCJcbmlmIChtb2R1bGUuaG90KSB7IG1vZHVsZS5ob3QuYWNjZXB0KCkgfVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./app/globals.css\n"); + +/***/ }), + +/***/ "(rsc)/./app/layout.tsx": +/*!************************!*\ + !*** ./app/layout.tsx ***! + \************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ RootLayout),\n/* harmony export */ metadata: () => (/* binding */ metadata)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(rsc)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/rsc/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _globals_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./globals.css */ \"(rsc)/./app/globals.css\");\n\n\nconst metadata = {\n title: \"Gunbuilder Prototype | Shadow Standard\",\n description: \"Prototype AR-15 build tool by Shadow Standard.\"\n};\nfunction RootLayout({ children }) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"html\", {\n lang: \"en\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"body\", {\n children: children\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/layout.tsx\",\n lineNumber: 12,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/layout.tsx\",\n lineNumber: 11,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9hcHAvbGF5b3V0LnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBdUI7QUFHaEIsTUFBTUEsV0FBVztJQUN0QkMsT0FBTztJQUNQQyxhQUFhO0FBQ2YsRUFBRTtBQUVhLFNBQVNDLFdBQVcsRUFBRUMsUUFBUSxFQUEyQjtJQUN0RSxxQkFDRSw4REFBQ0M7UUFBS0MsTUFBSztrQkFDVCw0RUFBQ0M7c0JBQU1IOzs7Ozs7Ozs7OztBQUdiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvbGF5b3V0LnRzeD85OTg4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcIi4vZ2xvYmFscy5jc3NcIjtcbmltcG9ydCB0eXBlIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhZGF0YSA9IHtcbiAgdGl0bGU6IFwiR3VuYnVpbGRlciBQcm90b3R5cGUgfCBTaGFkb3cgU3RhbmRhcmRcIixcbiAgZGVzY3JpcHRpb246IFwiUHJvdG90eXBlIEFSLTE1IGJ1aWxkIHRvb2wgYnkgU2hhZG93IFN0YW5kYXJkLlwiLFxufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gUm9vdExheW91dCh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSB7XG4gIHJldHVybiAoXG4gICAgPGh0bWwgbGFuZz1cImVuXCI+XG4gICAgICA8Ym9keT57Y2hpbGRyZW59PC9ib2R5PlxuICAgIDwvaHRtbD5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJtZXRhZGF0YSIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJSb290TGF5b3V0IiwiY2hpbGRyZW4iLCJodG1sIiwibGFuZyIsImJvZHkiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./app/layout.tsx\n"); + +/***/ }) + +}; +; + +// load runtime +var __webpack_require__ = require("../../webpack-runtime.js"); +__webpack_require__.C(exports); +var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId)) +var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next","vendor-chunks/@swc"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader.js?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"))); +module.exports = __webpack_exports__; + +})(); \ No newline at end of file diff --git a/.next/server/app/_not-found/page_client-reference-manifest.js b/.next/server/app/_not-found/page_client-reference-manifest.js new file mode 100644 index 0000000..0c7f1f5 --- /dev/null +++ b/.next/server/app/_not-found/page_client-reference-manifest.js @@ -0,0 +1 @@ +globalThis.__RSC_MANIFEST=(globalThis.__RSC_MANIFEST||{});globalThis.__RSC_MANIFEST["/_not-found/page"]={"moduleLoading":{"prefix":"/_next/","crossOrigin":null},"ssrModuleMapping":{"(app-pages-browser)/./app/gunbuilder/admin/merchants/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/admin/merchants/page.tsx","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/app-router.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/app-router.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/client-page.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/client-page.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/error-boundary.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/error-boundary.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/layout-router.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/layout-router.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/not-found-boundary.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/not-found-boundary.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./node_modules/next/dist/client/components/render-from-template-context.js":{"*":{"id":"(ssr)/./node_modules/next/dist/client/components/render-from-template-context.js","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./app/gunbuilder/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/page.tsx","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/[categoryId]/page.tsx","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./app/gunbuilder/build/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/build/page.tsx","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./app/gunbuilder/[categoryId]/[partId]/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/[categoryId]/[partId]/page.tsx","name":"*","chunks":[],"async":false}},"(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx":{"*":{"id":"(ssr)/./app/gunbuilder/admin/category-mappings/page.tsx","name":"*","chunks":[],"async":false}}},"edgeSSRModuleMapping":{},"clientModules":{"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/merchants/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/admin/merchants/page.tsx","name":"*","chunks":[],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/globals.css":{"id":"(app-pages-browser)/./app/globals.css","name":"*","chunks":["app/layout","static/chunks/app/layout.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/app-router.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/app-router.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/app-router.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/app-router.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/client-page.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/client-page.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/client-page.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/client-page.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/error-boundary.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/error-boundary.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/error-boundary.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/error-boundary.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/layout-router.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/layout-router.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/layout-router.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/layout-router.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/not-found-boundary.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/not-found-boundary.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/not-found-boundary.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/not-found-boundary.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/client/components/render-from-template-context.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/render-from-template-context.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/esm/client/components/render-from-template-context.js":{"id":"(app-pages-browser)/./node_modules/next/dist/client/components/render-from-template-context.js","name":"*","chunks":["app-pages-internals","static/chunks/app-pages-internals.js"],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/page.tsx","name":"*","chunks":[],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx","name":"*","chunks":[],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/build/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/build/page.tsx","name":"*","chunks":[],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/[partId]/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/[categoryId]/[partId]/page.tsx","name":"*","chunks":[],"async":false},"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx":{"id":"(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx","name":"*","chunks":[],"async":false}},"entryCSSFiles":{"/Users/sean/Dev/gunbuilder-prototype/":[],"/Users/sean/Dev/gunbuilder-prototype/app/layout":["static/css/app/layout.css"],"/Users/sean/Dev/gunbuilder-prototype/app/_not-found/page":[]}} \ No newline at end of file diff --git a/.next/server/app/gunbuilder/[categoryId]/[partId]/page.js b/.next/server/app/gunbuilder/[categoryId]/[partId]/page.js index 1dcc896..f2a97ed 100644 --- a/.next/server/app/gunbuilder/[categoryId]/[partId]/page.js +++ b/.next/server/app/gunbuilder/[categoryId]/[partId]/page.js @@ -159,7 +159,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES),\n/* harmony export */ PARTS: () => (/* binding */ PARTS)\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLGFBQXlCO0lBQ3BDO1FBQUVDLElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBaUI7SUFDdEM7UUFBRUQsSUFBSTtRQUFVQyxNQUFNO0lBQVM7SUFDL0I7UUFBRUQsSUFBSTtRQUFhQyxNQUFNO0lBQVk7SUFDckM7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7SUFDN0I7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7Q0FDOUIsQ0FBQztBQUVLLE1BQU1DLFFBQWdCO0lBQzNCO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgeyBpZDogXCJsb3dlclwiLCBuYW1lOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJ1cHBlclwiLCBuYW1lOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJiYXJyZWxcIiwgbmFtZTogXCJCYXJyZWxcIiB9LFxuICB7IGlkOiBcImhhbmRndWFyZFwiLCBuYW1lOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgaWQ6IFwic3RvY2tcIiwgbmFtZTogXCJTdG9ja1wiIH0sXG4gIHsgaWQ6IFwib3B0aWNcIiwgbmFtZTogXCJPcHRpY1wiIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgUEFSVFM6IFBhcnRbXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWFlcm8tbTRlMVwiLFxuICAgIG5hbWU6IFwiTTRFMSBTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJsb3dlclwiLFxuICAgIHByaWNlOiAxMjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1tNGUxXCIsXG4gICAgbm90ZXM6IFwiRm9yZ2VkIDcwNzUtVDYsIHRocmVhZGVkIGJvbHQgY2F0Y2hcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyLXNvbGd3XCIsXG4gICAgbmFtZTogXCJMb3lhbCA5IFN0cmlwcGVkIExvd2VyXCIsXG4gICAgYnJhbmQ6IFwiU29ucyBvZiBMaWJlcnR5IEd1biBXb3Jrc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTg5LjAsXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vc29sZ3ctbG93ZXJcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWFlcm8tZW5oYW5jZWRcIixcbiAgICBuYW1lOiBcIkVuaGFuY2VkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQWVybyBQcmVjaXNpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcInVwcGVyXCIsXG4gICAgcHJpY2U6IDE0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9hZXJvLWVuaGFuY2VkLXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1iY20tbTRcIixcbiAgICBuYW1lOiBcIk00IFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQkNNXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNTkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmNtLW00LXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtY3JpdGVyaW9uLTE2XCIsXG4gICAgbmFtZTogXCIxNlxcXCIgSHlicmlkIEJhcnJlbFwiLFxuICAgIGJyYW5kOiBcIkNyaXRlcmlvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiYmFycmVsXCIsXG4gICAgcHJpY2U6IDI3OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jcml0ZXJpb24tMTZcIixcbiAgICBub3RlczogXCJNaWQtbGVuZ3RoIGdhcywgY2hyb21lLWxpbmVkXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtYmEtMTMtOVwiLFxuICAgIG5hbWU6IFwiMTMuOVxcXCIgSGFuc29uIFBlcmZvcm1hbmNlIFNlcmllc1wiLFxuICAgIGJyYW5kOiBcIkJhbGxpc3RpYyBBZHZhbnRhZ2VcIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyMDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmEtMTMtOVwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctZ2Vpc3NlbGUtbWs4XCIsXG4gICAgbmFtZTogXCJNSzggUmFpbCAxMy41XFxcIlwiLFxuICAgIGJyYW5kOiBcIkdlaXNzZWxlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJoYW5kZ3VhcmRcIixcbiAgICBwcmljZTogMzI0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2dlaXNzZWxlLW1rOFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctY2VudHVyaW9uLWM0XCIsXG4gICAgbmFtZTogXCJDNCBNLUxPSyAxMlxcXCJcIixcbiAgICBicmFuZDogXCJDZW50dXJpb24gQXJtc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDI4NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jZW50dXJpb24tYzRcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrLWI1LWJyYXZvXCIsXG4gICAgbmFtZTogXCJCUkFWTyBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIkI1IFN5c3RlbXNcIixcbiAgICBjYXRlZ29yeUlkOiBcInN0b2NrXCIsXG4gICAgcHJpY2U6IDc0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2I1LWJyYXZvXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1tYWdwdWwtc2xcIixcbiAgICBuYW1lOiBcIk1PRSBTTCBDYXJiaW5lIFN0b2NrXCIsXG4gICAgYnJhbmQ6IFwiTWFncHVsXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA2OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9tYWdwdWwtc2xcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWVvdGVjaC1leHBzM1wiLFxuICAgIG5hbWU6IFwiRVhQUzMgSG9sb2dyYXBoaWMgU2lnaHRcIixcbiAgICBicmFuZDogXCJFT1RFQ0hcIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDc0OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2VvdGVjaC1leHBzM1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWMtaG9sb3N1bi01MDl0XCIsXG4gICAgbmFtZTogXCJIRTUwOVQgUmVkIERvdFwiLFxuICAgIGJyYW5kOiBcIkhvbG9zdW5cIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDM0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ob2xvc3VuLTUwOXRcIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES)\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsImRlc2NyaXB0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); /***/ }), diff --git a/.next/server/app/gunbuilder/[categoryId]/page.js b/.next/server/app/gunbuilder/[categoryId]/page.js index 15b5091..e2dc3d3 100644 --- a/.next/server/app/gunbuilder/[categoryId]/page.js +++ b/.next/server/app/gunbuilder/[categoryId]/page.js @@ -137,7 +137,7 @@ eval("Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__w /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) return {};\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n const roles = CATEGORY_TO_PART_ROLES[categoryId] ?? [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = `${API_BASE_URL}/api/products/gunbuilder${roles.length ? `?${search.toString()}` : \"\"}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n const normalized = data.map((p)=>({\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n }));\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: `Search ${category.name.toLowerCase()}...`,\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: `group relative rounded-md p-3 transition-all duration-200 flex flex-col border ${isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"}`,\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 444,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: `group relative rounded-md p-3 transition-all duration-200 border ${isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"}`,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7QUFnQnBELE1BQU1PLGVBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0Msd0JBQXdCLElBQUk7QUFFMUMsTUFBTUMseUJBQXVEO0lBQzNEQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtBQUNsQjtBQU9BLE1BQU1DLGNBQWM7QUFFTCxTQUFTQztJQUN0QixNQUFNQyxTQUFTcEIsMERBQVNBO0lBQ3hCLE1BQU1xQixhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNyQiwwREFBU0E7SUFFeEIsTUFBTSxDQUFDc0IsVUFBVUMsWUFBWSxHQUFHMUIsK0NBQVFBLENBQVc7SUFDbkQsTUFBTSxDQUFDMkIsT0FBT0MsU0FBUyxHQUFHNUIsK0NBQVFBLENBQVMsRUFBRTtJQUM3QyxNQUFNLENBQUM2QixTQUFTQyxXQUFXLEdBQUc5QiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUMrQixPQUFPQyxTQUFTLEdBQUdoQywrQ0FBUUEsQ0FBZ0I7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sQ0FBQ2lDLGFBQWFDLGVBQWUsR0FBR2xDLCtDQUFRQSxDQUFTO0lBQ3ZELE1BQU0sQ0FBQ21DLFFBQVFDLFVBQVUsR0FBR3BDLCtDQUFRQSxDQUFhO0lBQ2pELE1BQU0sQ0FBQ3FDLGFBQWFDLGVBQWUsR0FBR3RDLCtDQUFRQSxDQUFTO0lBRXZELHVEQUF1RDtJQUN2RCxNQUFN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RCxXQUFVOzs0REFBcUQ7NERBQ2hFcUIsS0FBSzFELEtBQUssQ0FBQzJELE9BQU8sQ0FBQzs7Ozs7OztrRUFFdkIsOERBQUNyQjt3REFBSUQsV0FBVTs7MEVBQ2IsOERBQUNqSCxpREFBSUE7Z0VBQ0hvSCxNQUFNLENBQUMsWUFBWSxFQUFFOUYsV0FBVyxDQUFDLEVBQUVnSCxLQUFLckYsRUFBRSxDQUFDLENBQUM7Z0VBQzVDZ0UsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDTTtnRUFDQ0MsTUFBSztnRUFDTEMsU0FBUyxJQUNQbEMsaUJBQWlCakUsWUFBWWdILEtBQUtyRixFQUFFO2dFQUV0Q2dFLFdBQVcsQ0FBQyxpRkFBaUYsRUFDM0Z4QixhQUNJLHVFQUNBLDZDQUNMLENBQUM7MEVBRURBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG4gIGxvd2VyOiBbXCJsb3dlci1yZWNlaXZlclwiXSxcbiAgb3B0aWM6IFtcIm9wdGljXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG59O1xuXG4vLyBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG4vLyBidWlsZCBzdGF0ZSB0eXBlICsgc3RvcmFnZSBrZXkgKG1hdGNoZXMgL2d1bmJ1aWxkZXIpXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjtcbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5UGFnZSgpIHtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG4gIGNvbnN0IGNhdGVnb3J5SWQgPSBwYXJhbXMuY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcblxuICBjb25zdCBbdmlld01vZGUsIHNldFZpZXdNb2RlXSA9IHVzZVN0YXRlPFZpZXdNb2RlPihcImxpc3RcIik7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG4gIGNvbnN0IFtzZWFyY2hRdWVyeSwgc2V0U2VhcmNoUXVlcnldID0gdXNlU3RhdGU8c3RyaW5nPihcIlwiKTtcblxuICAvLyAgYnVpbGQgc3RhdGUgZm9yIHRoaXMgcGFnZSwgc3luY2VkIHdpdGggbG9jYWxTdG9yYWdlXG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICByZXR1cm4gc3RvcmVkID8gKEpTT04ucGFyc2Uoc3RvcmVkKSBhcyBCdWlsZFN0YXRlKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyAgcGVyc2lzdCBidWlsZCB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgLy8gIGhhbmRsZXIgdG8gdG9nZ2xlIEFkZCAvIFJlbW92ZSBmb3IgdGhpcyBjYXRlZ29yeVxuICBjb25zdCBoYW5kbGVUb2dnbGVQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0SWQ7XG5cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gUmVtb3ZlIGZyb20gYnVpbGRcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQ6IEJ1aWxkU3RhdGUgPSB7IC4uLnByZXYgfTtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbY2F0ZWdvcnlJZF07XG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBidWlsZCBhbmQgbmF2aWdhdGUgYmFjayB0byBtYWluIGd1bmJ1aWxkZXIgcGFnZVxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgfSkpO1xuICAgICAgcm91dGVyLnB1c2goXCIvZ3VuYnVpbGRlclwiKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYXZhaWxhYmxlIGJyYW5kcyBmb3IgZmlsdGVyXG4gIGNvbnN0IGF2YWlsYWJsZUJyYW5kcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIEFycmF5LmZyb20obmV3IFNldChwYXJ0cy5tYXAoKHApID0+IHAuYnJhbmQpKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSxcbiAgICBbcGFydHNdLFxuICApO1xuXG4gIC8vIGZpbHRlcmVkICsgc29ydGVkIHBhcnRzIHdpdGggc2VsZWN0ZWQgcGFydCBwaW5uZWQgdG8gdG9wXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkUXVlcnkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHAubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBicmFuZCA9IHAuYnJhbmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBuYW1lLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkgfHxcbiAgICAgICAgICBicmFuZC5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgY2FzZSBcInByaWNlLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5wcmljZSAtIGIucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmljZS1kZXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBiLnByaWNlIC0gYS5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJyYW5kLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5icmFuZC5sb2NhbGVDb21wYXJlKGIuYnJhbmQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmVsZXZhbmNlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBsZWF2ZSBpbiBiYWNrZW5kIG9yZGVyXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcnQgKGZvciB0aGlzIGNhdGVnb3J5KSB0byB0aGUgdG9wLCBpZiBhbnlcbiAgICBjb25zdCBzZWxlY3RlZElkID0gYnVpbGRbY2F0ZWdvcnlJZF07XG4gICAgaWYgKHNlbGVjdGVkSWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRJZCk7XG4gICAgICBjb25zdCBvdGhlcnMgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkICE9PSBzZWxlY3RlZElkKTtcbiAgICAgIHJlc3VsdCA9IFsuLi5zZWxlY3RlZCwgLi4ub3RoZXJzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbcGFydHMsIGJyYW5kRmlsdGVyLCBzb3J0QnksIGJ1aWxkLCBjYXRlZ29yeUlkLCBzZWFyY2hRdWVyeV0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIFRoZSBBcm1vcnlcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7LyogRmlsdGVyICsgc29ydCB0b29sYmFyICovfVxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMyBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZ3tcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBvZntcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7cGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwicGFydC1zZWFyY2hcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwicGFydC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2hRdWVyeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRTZWFyY2hRdWVyeShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfS4uLmB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIHByLTYgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlYXJjaFF1ZXJ5KFwiXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTEgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIHRleHQtemluYy01MDAgaG92ZXI6dGV4dC16aW5jLTMwMCB0ZXh0LXhzIGxlYWRpbmctbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICDDl1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQnJhbmRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2JyYW5kRmlsdGVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEJyYW5kRmlsdGVyKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgYnJhbmRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVCcmFuZHMubWFwKChiKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e2J9IHZhbHVlPXtifT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtifVxuICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwic29ydC1ieVwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBTb3J0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29ydEJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlIGFzIFNvcnRPcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWxldmFuY2VcIj5SZWxldmFuY2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWFzY1wiPlByaWNlOiBMb3cg4oaSIEhpZ2g8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWRlc2NcIj5QcmljZTogSGlnaCDihpIgTG93PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmFuZC1hc2NcIj5CcmFuZDogQSDihpIgWjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfeKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBlcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBmaWx0ZXJlZFBhcnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSBmb3IgdGhpcyBjYXRlZ29yeSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IHZpZXdNb2RlID09PSBcImNhcmRcIiA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGdyb3VwIHJlbGF0aXZlIHJvdW5kZWQtbWQgcC0zIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItYW1iZXItNDAwLzcwIGJnLWFtYmVyLTQwMC8xMCBzaGFkb3ctWzBfMF8wXzFweF9yZ2JhKDI1MSwxOTEsMzYsMC4yNSldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcm91bmRlZC1tZCBweC0zIHB5LTIgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogSGVhZGVyIHJvdyBmb3IgbGlzdCB2aWV3ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpncmlkIGdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gZ2FwLTQgcHgtMyBwYi0yIHRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QYXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkJyYW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHByLTJcIj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGdyb3VwIHJlbGF0aXZlIHJvdW5kZWQtbWQgcC0zIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBib3JkZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwXCJcbiAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpncmlkIG1kOmdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gbWQ6aXRlbXMtY2VudGVyIG1kOmdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcm91bmRlZC1tZCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJMaW5rIiwidXNlUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkFQSV9CQVNFX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljIiwic3RvY2siLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJyb3V0ZXIiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJzZWFyY2hRdWVyeSIsInNldFNlYXJjaFF1ZXJ5IiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJoYW5kbGVUb2dnbGVQYXJ0IiwicGFydElkIiwiaXNTZWxlY3RlZCIsInByZXYiLCJ1cGRhdGVkIiwicHVzaCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm5vcm1hbGl6ZWRRdWVyeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwic2VsZWN0ZWRJZCIsInNlbGVjdGVkIiwib3RoZXJzIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsInBsYWNlaG9sZGVyIiwic2VsZWN0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/[categoryId]/page.tsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(ssr)/./data/partRoleMappings.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) return {};\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n // FIX: determine which backend partRoles map to this category\n const roles = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.CATEGORY_TO_PART_ROLES[categoryId] ?? [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = `${API_BASE_URL}/api/products/gunbuilder${roles.length ? `?${search.toString()}` : \"\"}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n const normalized = data.map((p)=>({\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n }));\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) return;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 211,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 209,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: `px-3 py-1.5 text-xs font-medium rounded transition-colors ${viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"}`,\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 286,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: `Search ${category.name.toLowerCase()}...`,\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 303,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 330,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 359,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 375,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: `group relative rounded-md p-3 transition-all duration-200 flex flex-col border ${isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"}`,\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 396,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 399,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 415,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 384,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 379,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 436,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 437,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 438,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: `group relative rounded-md p-3 transition-all duration-200 border ${isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"}`,\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 460,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 455,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: `/gunbuilder/${categoryId}/${part.id}`,\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 472,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: `rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap ${isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"}`,\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 471,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 454,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 441,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 282,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 227,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3giLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUMwQjtBQUNIO0FBQ2E7QUFnQmpFLE1BQU1RLGVBQ0pDLFFBQVFDLEdBQUcsQ0FBQ0Msd0JBQXdCLElBQUk7QUFRMUMsTUFBTUMsY0FBYztBQUVMLFNBQVNDO0lBQ3RCLE1BQU1DLFNBQVNWLDBEQUFTQTtJQUN4QixNQUFNVyxhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNYLDBEQUFTQTtJQUV4QixNQUFNLENBQUNZLFVBQVVDLFlBQVksR0FBR2hCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR2xCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDbUIsU0FBU0MsV0FBVyxHQUFHcEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDcUIsT0FBT0MsU0FBUyxHQUFHdEIsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUN1QixhQUFhQyxlQUFlLEdBQUd4QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUN5QixRQUFRQyxVQUFVLEdBQUcxQiwrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUMyQixhQUFhQyxlQUFlLEdBQUc1QiwrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDNkIsT0FBT0MsU0FBUyxHQUFHOUIsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxJQUE2QixFQUFFLE9BQU8sQ0FBQztRQUMzQyxJQUFJO1lBQ0YsTUFBTStCLFNBQVNDLE9BQU9DLFlBQVksQ0FBQ0MsT0FBTyxDQUFDeEI7WUFDM0MsT0FBT3FCLFNBQVVJLEtBQUtDLEtBQUssQ0FBQ0wsVUFBeUIsQ0FBQztRQUN4RCxFQUFFLE9BQU07WUFDTixPQUFPLENBQUM7UUFDVjtJQUNGO0lBRUEsTUFBTU0sV0FBV3RDLDhDQUFPQSxDQUN0QixJ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UyxJQUNQbEMsaUJBQWlCakUsWUFBWWdILEtBQUtyRixFQUFFO2dFQUV0Q2dFLFdBQVcsQ0FBQyxpRkFBaUYsRUFDM0Z4QixhQUNJLHVFQUNBLDZDQUNMLENBQUM7MEVBRURBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB7IENBVEVHT1JZX1RPX1BBUlRfUk9MRVMgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgLy8gRklYOiBkZXRlcm1pbmUgd2hpY2ggYmFja2VuZCBwYXJ0Um9sZXMgbWFwIHRvIHRoaXMgY2F0ZWdvcnlcbiAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsIkFQSV9CQVNFX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJyb3V0ZXIiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJzZWFyY2hRdWVyeSIsInNldFNlYXJjaFF1ZXJ5IiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJoYW5kbGVUb2dnbGVQYXJ0IiwicGFydElkIiwiaXNTZWxlY3RlZCIsInByZXYiLCJ1cGRhdGVkIiwicHVzaCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm5vcm1hbGl6ZWRRdWVyeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwic2VsZWN0ZWRJZCIsInNlbGVjdGVkIiwib3RoZXJzIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsInBsYWNlaG9sZGVyIiwic2VsZWN0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/[categoryId]/page.tsx\n"); /***/ }), @@ -148,7 +148,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES),\n/* harmony export */ PARTS: () => (/* binding */ PARTS)\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLGFBQXlCO0lBQ3BDO1FBQUVDLElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBaUI7SUFDdEM7UUFBRUQsSUFBSTtRQUFVQyxNQUFNO0lBQVM7SUFDL0I7UUFBRUQsSUFBSTtRQUFhQyxNQUFNO0lBQVk7SUFDckM7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7SUFDN0I7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7Q0FDOUIsQ0FBQztBQUVLLE1BQU1DLFFBQWdCO0lBQzNCO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgeyBpZDogXCJsb3dlclwiLCBuYW1lOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJ1cHBlclwiLCBuYW1lOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJiYXJyZWxcIiwgbmFtZTogXCJCYXJyZWxcIiB9LFxuICB7IGlkOiBcImhhbmRndWFyZFwiLCBuYW1lOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgaWQ6IFwic3RvY2tcIiwgbmFtZTogXCJTdG9ja1wiIH0sXG4gIHsgaWQ6IFwib3B0aWNcIiwgbmFtZTogXCJPcHRpY1wiIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgUEFSVFM6IFBhcnRbXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWFlcm8tbTRlMVwiLFxuICAgIG5hbWU6IFwiTTRFMSBTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJsb3dlclwiLFxuICAgIHByaWNlOiAxMjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1tNGUxXCIsXG4gICAgbm90ZXM6IFwiRm9yZ2VkIDcwNzUtVDYsIHRocmVhZGVkIGJvbHQgY2F0Y2hcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyLXNvbGd3XCIsXG4gICAgbmFtZTogXCJMb3lhbCA5IFN0cmlwcGVkIExvd2VyXCIsXG4gICAgYnJhbmQ6IFwiU29ucyBvZiBMaWJlcnR5IEd1biBXb3Jrc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTg5LjAsXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vc29sZ3ctbG93ZXJcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWFlcm8tZW5oYW5jZWRcIixcbiAgICBuYW1lOiBcIkVuaGFuY2VkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQWVybyBQcmVjaXNpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcInVwcGVyXCIsXG4gICAgcHJpY2U6IDE0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9hZXJvLWVuaGFuY2VkLXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1iY20tbTRcIixcbiAgICBuYW1lOiBcIk00IFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQkNNXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNTkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmNtLW00LXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtY3JpdGVyaW9uLTE2XCIsXG4gICAgbmFtZTogXCIxNlxcXCIgSHlicmlkIEJhcnJlbFwiLFxuICAgIGJyYW5kOiBcIkNyaXRlcmlvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiYmFycmVsXCIsXG4gICAgcHJpY2U6IDI3OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jcml0ZXJpb24tMTZcIixcbiAgICBub3RlczogXCJNaWQtbGVuZ3RoIGdhcywgY2hyb21lLWxpbmVkXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtYmEtMTMtOVwiLFxuICAgIG5hbWU6IFwiMTMuOVxcXCIgSGFuc29uIFBlcmZvcm1hbmNlIFNlcmllc1wiLFxuICAgIGJyYW5kOiBcIkJhbGxpc3RpYyBBZHZhbnRhZ2VcIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyMDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmEtMTMtOVwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctZ2Vpc3NlbGUtbWs4XCIsXG4gICAgbmFtZTogXCJNSzggUmFpbCAxMy41XFxcIlwiLFxuICAgIGJyYW5kOiBcIkdlaXNzZWxlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJoYW5kZ3VhcmRcIixcbiAgICBwcmljZTogMzI0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2dlaXNzZWxlLW1rOFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctY2VudHVyaW9uLWM0XCIsXG4gICAgbmFtZTogXCJDNCBNLUxPSyAxMlxcXCJcIixcbiAgICBicmFuZDogXCJDZW50dXJpb24gQXJtc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDI4NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jZW50dXJpb24tYzRcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrLWI1LWJyYXZvXCIsXG4gICAgbmFtZTogXCJCUkFWTyBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIkI1IFN5c3RlbXNcIixcbiAgICBjYXRlZ29yeUlkOiBcInN0b2NrXCIsXG4gICAgcHJpY2U6IDc0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2I1LWJyYXZvXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1tYWdwdWwtc2xcIixcbiAgICBuYW1lOiBcIk1PRSBTTCBDYXJiaW5lIFN0b2NrXCIsXG4gICAgYnJhbmQ6IFwiTWFncHVsXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA2OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9tYWdwdWwtc2xcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWVvdGVjaC1leHBzM1wiLFxuICAgIG5hbWU6IFwiRVhQUzMgSG9sb2dyYXBoaWMgU2lnaHRcIixcbiAgICBicmFuZDogXCJFT1RFQ0hcIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDc0OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2VvdGVjaC1leHBzM1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWMtaG9sb3N1bi01MDl0XCIsXG4gICAgbmFtZTogXCJIRTUwOVQgUmVkIERvdFwiLFxuICAgIGJyYW5kOiBcIkhvbG9zdW5cIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDM0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ob2xvc3VuLTUwOXRcIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES)\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsImRlc2NyaXB0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); + +/***/ }), + +/***/ "(ssr)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: () => (/* binding */ CATEGORY_TO_PART_ROLES),\n/* harmony export */ PART_ROLE_TO_CATEGORY: () => (/* binding */ PART_ROLE_TO_CATEGORY)\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, [categoryId, roles])=>{\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwQkFBMEI7QUFDbkIsTUFBTUEseUJBQXVEO0lBQ2xFLGtCQUFrQjtJQUNsQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtJQUNqQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxPQUFPO1FBQUM7S0FBUTtJQUNoQkMsT0FBTztRQUFDO0tBQVE7SUFFaEIsa0JBQWtCO0lBQ2xCQyxTQUFTO1FBQUM7UUFBVztLQUFjO0lBQ25DQyxNQUFNO1FBQUM7UUFBZTtLQUFPO0lBQzdCQyxRQUFRO1FBQUM7UUFBVTtLQUFrQjtJQUNyQ0MsZUFBZTtRQUFDO0tBQWlCO0lBRWpDLGtCQUFrQjtJQUNsQkMsZUFBZTtRQUFDO0tBQWlCO0lBQ2pDQyxLQUFLO1FBQUM7UUFBTztLQUFxQjtJQUNsQ0MsVUFBVTtRQUFDO0tBQVk7SUFDdkJDLFNBQVM7UUFBQztLQUFXO0lBQ3JCQyxjQUFjO1FBQUM7UUFBaUI7UUFBZTtLQUFRO0lBQ3ZEQyxZQUFZO1FBQUM7S0FBYTtBQUM1QixFQUFFO0FBRUYsdUNBQXVDO0FBQ2hDLE1BQU1DLHdCQUFvREMsT0FDOURDLE9BQU8sQ0FBQ3ZCLHdCQUNSd0IsTUFBTSxDQUFDLENBQUNDLEtBQUssQ0FBQ0MsWUFBWUMsTUFBTTtJQUMvQixLQUFLLE1BQU1DLFFBQVFELE1BQU87UUFDeEJGLEdBQUcsQ0FBQ0csS0FBSyxHQUFHRjtJQUNkO0lBQ0EsT0FBT0Q7QUFDVCxHQUFHLENBQUMsR0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cz9jNjI0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gQ2F0ZWdvcnlJZCAtPiBwYXJ0Um9sZXNcbmV4cG9ydCBjb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICAvLyBDT1JFIC8gRVhJU1RJTkdcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxuICBsb3dlcjogW1wibG93ZXItcmVjZWl2ZXJcIl0sXG4gIG9wdGljOiBbXCJvcHRpY1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuXG4gIC8vIE5FVyBMT1dFUiBQQVJUU1xuICB0cmlnZ2VyOiBbXCJ0cmlnZ2VyXCIsIFwidHJpZ2dlci1raXRcIl0sXG4gIGdyaXA6IFtcInBpc3RvbC1ncmlwXCIsIFwiZ3JpcFwiXSxcbiAgc2FmZXR5OiBbXCJzYWZldHlcIiwgXCJzYWZldHktc2VsZWN0b3JcIl0sXG4gIGNvbXBsZXRlTG93ZXI6IFtcImNvbXBsZXRlLWxvd2VyXCJdLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBjb21wbGV0ZVVwcGVyOiBbXCJjb21wbGV0ZS11cHBlclwiXSxcbiAgYmNnOiBbXCJiY2dcIiwgXCJib2x0LWNhcnJpZXItZ3JvdXBcIl0sXG4gIGdhc0Jsb2NrOiBbXCJnYXMtYmxvY2tcIl0sXG4gIGdhc1R1YmU6IFtcImdhcy10dWJlXCJdLFxuICBtdXp6bGVEZXZpY2U6IFtcIm11enpsZS1kZXZpY2VcIiwgXCJjb21wZW5zYXRvclwiLCBcImJyYWtlXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxufTtcblxuLy8gSW52ZXJ0IHRvIGdldCBwYXJ0Um9sZSAtPiBDYXRlZ29yeUlkXG5leHBvcnQgY29uc3QgUEFSVF9ST0xFX1RPX0NBVEVHT1JZOiBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPiA9IE9iamVjdFxuICAuZW50cmllcyhDQVRFR09SWV9UT19QQVJUX1JPTEVTKVxuICAucmVkdWNlKChhY2MsIFtjYXRlZ29yeUlkLCByb2xlc10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgIGFjY1tyb2xlXSA9IGNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4pOyJdLCJuYW1lcyI6WyJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljIiwic3RvY2siLCJ0cmlnZ2VyIiwiZ3JpcCIsInNhZmV0eSIsImNvbXBsZXRlTG93ZXIiLCJjb21wbGV0ZVVwcGVyIiwiYmNnIiwiZ2FzQmxvY2siLCJnYXNUdWJlIiwibXV6emxlRGV2aWNlIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/partRoleMappings.ts\n"); /***/ }), diff --git a/.next/server/app/gunbuilder/admin/category-mappings/page.js b/.next/server/app/gunbuilder/admin/category-mappings/page.js index 623dc4e..d03e0a3 100644 --- a/.next/server/app/gunbuilder/admin/category-mappings/page.js +++ b/.next/server/app/gunbuilder/admin/category-mappings/page.js @@ -137,7 +137,7 @@ eval("Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__w /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryMappingsPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\n// Keep this in sync with your backend `partRole` values\nconst PART_ROLE_OPTIONS = [\n {\n value: \"\",\n label: \"— Unmapped —\"\n },\n {\n value: \"upper-receiver\",\n label: \"Upper Receiver\"\n },\n {\n value: \"barrel\",\n label: \"Barrel\"\n },\n {\n value: \"handguard\",\n label: \"Handguard\"\n },\n {\n value: \"charging-handle\",\n label: \"Charging Handle\"\n },\n {\n value: \"buffer-kit\",\n label: \"Buffer Kit\"\n },\n {\n value: \"lower-parts-kit\",\n label: \"Lower Parts Kit\"\n },\n {\n value: \"sight\",\n label: \"Sight / Optic\"\n },\n {\n value: \"lower-receiver\",\n label: \"Lower Receiver\"\n },\n {\n value: \"optic\",\n label: \"Optic\"\n },\n {\n value: \"stock\",\n label: \"Stock\"\n },\n {\n value: \"other\",\n label: \"Other / Ignore\"\n }\n];\nfunction CategoryMappingsPage() {\n const [merchants, setMerchants] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [selectedMerchantId, setSelectedMerchantId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [mappings, setMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loadingMappings, setLoadingMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [saving, setSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [successMessage, setSuccessMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [showOnlyUnmapped, setShowOnlyUnmapped] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const sortedMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n // Mapped rows first, then unmapped; within each group, alpha by rawCategory\n return [\n ...mappings\n ].sort((a, b)=>{\n const aMapped = !!a.mappedPartRole;\n const bMapped = !!b.mappedPartRole;\n if (aMapped !== bMapped) {\n return aMapped ? -1 : 1; // mapped first\n }\n return a.rawCategory.localeCompare(b.rawCategory);\n });\n }, [\n mappings\n ]);\n const visibleMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>showOnlyUnmapped ? sortedMappings.filter((m)=>!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyUnmapped\n ]);\n // Load merchants\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n async function fetchMerchants() {\n try {\n const res = await fetch(`${API_BASE_URL}/admin/merchants`);\n if (!res.ok) {\n throw new Error(`Failed to load merchants (${res.status})`);\n }\n const data = await res.json();\n setMerchants(data);\n // Auto-select the first merchant if you want\n if (data.length > 0 && selectedMerchantId === null) {\n setSelectedMerchantId(data[0].id);\n }\n } catch (err) {\n console.error(err);\n setError(err.message ?? \"Failed to load merchants\");\n }\n }\n fetchMerchants();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Load mappings for selected merchant\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!selectedMerchantId) return;\n const controller = new AbortController();\n async function fetchMappings() {\n try {\n setLoadingMappings(true);\n setError(null);\n setSuccessMessage(null);\n const url = `${API_BASE_URL}/admin/merchant-category-mappings?merchantId=${selectedMerchantId}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load mappings (${res.status})`);\n }\n const data = await res.json();\n setMappings(data);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n console.error(err);\n setError(err.message ?? \"Failed to load mappings\");\n } finally{\n setLoadingMappings(false);\n }\n }\n fetchMappings();\n return ()=>controller.abort();\n }, [\n selectedMerchantId\n ]);\n const handleChangePartRole = (rawCategory, newRole)=>{\n setMappings((prev)=>prev.map((m)=>m.rawCategory === rawCategory ? {\n ...m,\n mappedPartRole: newRole || null\n } : m));\n };\n const handleSave = async ()=>{\n if (!selectedMerchantId) return;\n setSaving(true);\n setError(null);\n setSuccessMessage(null);\n try {\n // Save each mapping in parallel\n const requests = mappings.map((m)=>{\n const payload = {\n merchantId: selectedMerchantId,\n rawCategory: m.rawCategory,\n mappedPartRole: m.mappedPartRole\n };\n return fetch(`${API_BASE_URL}/admin/merchant-category-mappings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n });\n const responses = await Promise.all(requests);\n const failed = responses.filter((r)=>!r.ok);\n if (failed.length > 0) {\n throw new Error(`Some mappings failed to save (${failed.length})`);\n }\n setSuccessMessage(\"Mappings saved. Re-run the import to apply changes.\");\n } catch (err) {\n console.error(err);\n setError(err.message ?? \"Failed to save mappings\");\n } finally{\n setSaving(false);\n }\n };\n const selectedMerchantName = merchants.find((m)=>m.id === selectedMerchantId)?.name ?? \"—\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-5xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-3 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard / Admin\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 195,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: \"Merchant Category Mapping\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 198,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Normalize each merchant's category names into your internal part roles (upper, barrel, handguard, etc.). Unmapped categories will be skipped during import until they are mapped here.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 201,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 194,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block text-xs font-semibold text-zinc-400 mb-1\",\n children: \"Select Merchant\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 209,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100\",\n value: selectedMerchantId ?? \"\",\n onChange: (e)=>setSelectedMerchantId(e.target.value ? Number(e.target.value) : null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"— Choose merchant —\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 221,\n columnNumber: 15\n }, this),\n merchants.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: m.id,\n children: m.name\n }, m.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 223,\n columnNumber: 17\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 212,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 208,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 193,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-red-500/60 bg-red-500/10 px-3 py-2 text-xs text-red-200\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 233,\n columnNumber: 13\n }, this),\n successMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs text-emerald-200\",\n children: successMessage\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n !selectedMerchantId ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Choose a merchant above to view category mappings.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this) : loadingMappings ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: [\n \"Loading mappings for \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 249,\n columnNumber: 36\n }, this),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this) : mappings.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No category rows yet for this merchant. Once you run an import, discovered categories will appear here automatically.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 252,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex items-center justify-between gap-3 text-xs text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n \"Mappings for\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 261,\n columnNumber: 19\n }, this),\n \".\",\n \" \",\n \"Set a part role for each raw category. Unmapped categories will be skipped by the importer.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 259,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"inline-flex items-center gap-1 text-[0.7rem] text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n className: \"h-3 w-3 rounded border-zinc-600 bg-zinc-900\",\n checked: showOnlyUnmapped,\n onChange: (e)=>setShowOnlyUnmapped(e.target.checked)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 266,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Show only unmapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 272,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 265,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 258,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 text-xs uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Raw Category\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 280,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Mapped Part Role\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 281,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 282,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 279,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 278,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: visibleMappings.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-900 last:border-b-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-zinc-200\",\n children: m.rawCategory\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 291,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-2 py-1 text-xs text-zinc-100\",\n value: m.mappedPartRole ?? \"\",\n onChange: (e)=>handleChangePartRole(m.rawCategory, e.target.value),\n children: PART_ROLE_OPTIONS.map((opt)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: opt.value,\n children: opt.label\n }, opt.value, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 306,\n columnNumber: 31\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 295,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 294,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-sm\",\n children: m.mappedPartRole ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-emerald-500/10 px-2 py-0.5 text-[0.7rem] font-medium text-emerald-300\",\n children: \"Mapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 314,\n columnNumber: 29\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-zinc-700/40 px-2 py-0.5 text-[0.7rem] font-medium text-zinc-300\",\n children: \"Unmapped / Ignored\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 318,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 312,\n columnNumber: 25\n }, this)\n ]\n }, m.rawCategory, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 287,\n columnNumber: 23\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 285,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 277,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 276,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleSave,\n disabled: saving,\n className: \"rounded-md bg-amber-400 px-4 py-2 text-sm font-semibold text-black hover:bg-amber-300 disabled:opacity-50\",\n children: saving ? \"Saving…\" : \"Save Mappings\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 330,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 329,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 231,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 192,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 191,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFcUQ7QUFFckQsTUFBTUcsZUFDSkMsUUFBUUMsR0FBRyxDQUFDQyx3QkFBd0IsSUFBSTtBQXFCMUMsd0RBQXdEO0FBQ3hELE1BQU1DLG9CQUFvQjtJQUN4QjtRQUFFQyxPQUFPO1FBQUlDLE9BQU87SUFBZTtJQUNuQztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBVUMsT0FBTztJQUFTO0lBQ25DO1FBQUVELE9BQU87UUFBYUMsT0FBTztJQUFZO0lBQ3pDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQWE7SUFDM0M7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBZ0I7SUFDekM7UUFBRUQsT0FBTztRQUFrQkMsT0FBTztJQUFpQjtJQUNuRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBaUI7Q0FDM0M7QUFFYyxTQUFTQztJQUN0QixNQUFNLENBQUNDLFdBQVdDLGFBQWEsR0FBR1gsK0NBQVFBLENBQWEsRUFBRTtJQUN6RCxNQUFNLENBQUNZLG9CQUFvQkMsc0JBQXNCLEdBQUdiLCtDQUFRQSxDQUMxRDtJQUVGLE1BQU0sQ0FBQ2MsVUFBVUMsWUFBWSxHQUFHZiwrQ0FBUUEsQ0FBWSxFQUFFO0lBQ3RELE1BQU0sQ0FBQ2dCLGlCQUFpQkMsbUJBQW1CLEdBQUdqQiwrQ0FBUUEsQ0FBQztJQUN2RCxNQUFNLENBQUNrQixRQUFRQyxVQUFVLEdBQUduQiwrQ0FBUUEsQ0FBQztJQUNyQyxNQUFNLENBQUNvQixPQUFPQyxTQUFTLEdBQUdyQiwrQ0FBUUEsQ0FBZ0I7SUFDbEQsTUFBTSxDQUFDc0IsZ0JBQWdCQyxrQkFBa0IsR0FBR3ZCLCtDQUFRQSxDQUFnQjtJQUNwRSxNQUFNLENBQUN3QixrQkFBa0JDLG9CQUFvQixHQUFHekIsK0NBQVFBLENBQUM7SUFFekQsTUFBTTBCLGlCQUFpQnpCLDhDQUFPQSxDQUFDO1FBQzdCLDRFQUE0RTtRQUM1RSxPQUFPO2VBQUlhO1NBQVMsQ0FBQ2EsSUFBSSxDQUFDLENBQUNDLEdBQUdDO1lBQzVCLE1BQU1DLFVBQVUsQ0FBQyxDQUFDRixFQUFFRyxjQUFjO1lBQ2xDLE1BQU1DLFVBQVUsQ0FBQyxDQUFDSCxFQUFFRSxjQUFjO1lBRWxDLElBQUlELFlBQVlFLFNBQVM7Z0JBQ3ZCLE9BQU9GLFVBQVUsQ0FBQyxJQUFJLEdBQUcsZUFBZTtZQUMxQztZQUVBLE9BQU9GLEVBQUVLLFdBQVcsQ0FBQ0MsYUFBYSxDQUFDTCxFQUFFSSxXQUFXO1FBQ2xEO0lBQ0YsR0FBRztRQUFDbkI7S0FBUztJQUViLE1BQU1xQixrQkFBa0JsQyw4Q0FBT0EsQ0FDN0IsSUFDRXVCLG1CQUNJRSxlQUFlVSxNQUFNLENBQUMsQ0FBQ0MsSUFBTSxDQUFDQSxFQUFFTixjQUFjLElBQzlDTCxnQkFDTjtRQUFDQTtRQUFnQkY7S0FBaUI7SUFHcEMsaUJBQWlCO0lBQ2pCekIsZ0RBQVNBLENBQUM7UUFDUixlQUFldUM7WUFDYixJQUFJO2dCQUNGLE1BQU1DLE1BQU0sTUFBTUMsTUFBTSxDQUFDLEVBQUV0QyxhQUFhLGdCQUFnQixDQUFDO2dCQUN6RCxJQUFJLENBQUNxQyxJQUFJRSxFQUFFLEVBQUU7b0JBQ1gsTUFBTSxJQUFJQyxNQUFNLENBQUMsMEJBQTBCLEVBQUVILElBQUlJLE1BQU0sQ0FBQyxDQUFDLENBQUM7Z0JBQzVEO2dCQUNBLE1BQU1DLE9BQW1CLE1BQU1MLElBQUlNLElBQUk7Z0JBQ3ZDbEMsYUFBYWlDO2dCQUViLDZDQUE2QztnQkFDN0MsSUFBSUEsS0FBS0UsTUFBTSxHQUFHLEtBQUtsQyx1QkFBdUIsTUFBTTtvQkFDbERDLHNCQUFzQitCLElBQUksQ0FBQyxFQUFFLENBQUNHLEVBQUU7Z0JBQ2xDO1lBQ0YsRUFBRSxPQUFPQyxLQUFVO2dCQUNqQkMsUUFBUTdCLEtBQUssQ0FBQzRCO2dCQUNkM0IsU0FBUzJCLElBQUlFLE9BQU8sSUFBSTtZQUMxQjtRQUNGO1FBRUFaO0lBQ0EsdURBQXVEO0lBQ3pELEdBQUcsRUFBRTtJQUVMLHNDQUFzQztJQUN0Q3ZDLGdEQUFTQSxDQUFDO1FBQ1IsSUFBSSxDQUFDYSxvQkFBb0I7UUFFekIsTUFBTXVDLGFBQWEsSUFBSUM7UUFFdkIsZUFBZUM7WUFDYixJQUFJO2dCQUNGcEMsbUJBQW1CO2dCQUNuQkksU0FBUztnQkFDVEUsa0JBQWtCO2dCQUVsQixNQUFNK0IsTUFBTSxDQUFDLEVBQUVwRCxhQUFhLDZDQUE2QyxFQUFFVSxtQkFBbUIsQ0FBQztnQkFDL0YsTUFBTTJCLE1BQU0sTUFBTUMsTUFBTWMsS0FBSztvQkFBRUMsUUFBUUosV0FBV0ksTUFBTTtnQkFBQztnQkFFekQsSUFBSSxDQUFDaEIsSUFBSUUsRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSUMsTUFBTSxDQUFDLHlCQUF5QixFQUFFSCxJQUFJSSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMzRDtnQkFFQSxNQUFNQyxPQUFRLE1BQU1MLElBQUlNLElBQUk7Z0JBQzVCOUIsWUFBWTZCO1lBQ2QsRUFBRSxPQUFPSSxLQUFVO2dCQUNqQixJQUFJQSxJQUFJUSxJQUFJLEtBQUssY0FBYztnQkFDL0JQLFFBQVE3QixLQUFLLENBQUM0QjtnQkFDZDNCLFNBQVMyQixJQUFJRSxPQUFPLElBQUk7WUFDMUIsU0FBVTtnQkFDUmpDLG1CQUFtQjtZQUNyQjtRQUNGO1FBRUFvQztRQUVBLE9BQU8sSUFBTUYsV0FBV00sS0FBSztJQUMvQixHQUFHO1FBQUM3QztLQUFtQjtJQUV2QixNQUFNOEMsdUJBQXVCLENBQUN6QixhQUFxQjBCO1FBQ2pENUMsWUFBWSxDQUFDNkMsT0FDWEEsS0FBS0MsR0FBRyxDQUFDLENBQUN4QixJQUNSQSxFQUFFSixXQUFXLEtBQUtBLGNBQ2Q7b0JBQUUsR0FBR0ksQ0FBQztvQkFBRU4sZ0JBQWdCNEIsV0FBVztnQkFBSyxJQUN4Q3RCO0lBR1Y7SUFFQSxNQUFNeUIsYUFBYTtRQUNqQixJQUFJLENBQUNsRCxvQkFBb0I7UUFDekJPLFVBQVU7UUFDVkUsU0FBUztRQUNURSxrQkFBa0I7UUFFbEIsSUFBSTtZQUNGLGdDQUFnQztZQUNoQyxNQUFNd0MsV0FBZ0NqRCxTQUFTK0MsR0FBRyxDQUFDLENBQUN4QjtnQkFDbEQsTUFBTTJCLFVBQXlCO29CQUM3QkMsWUFBWXJEO29CQUNacUIsYUFBYUksRUFBRUosV0FBVztvQkFDMUJGLGdCQUFnQk0sRUFBRU4sY0FBYztnQkFDbEM7Z0JBRUEsT0FBT1MsTUFBTSxDQUFDLEVBQUV0QyxhQUFhLGlDQUFpQyxDQUFDLEVBQUU7b0JBQy9EZ0UsUUFBUTtvQkFDUkMsU0FBUzt3QkFDUCxnQkFBZ0I7b0JBQ2xCO29CQUNBQyxNQUFNQyxLQUFLQyxTQUFTLENBQUNOO2dCQUN2QjtZQUNGO1lBRUEsTUFBTU8sWUFBWSxNQUFNQyxRQUFRQyxHQUFHLENBQUNWO1lBQ3BDLE1BQU1XLFNBQVNILFVBQVVuQyxNQUFNLENBQUMsQ0FBQ3VDLElBQU0sQ0FBQ0EsRUFBRWxDLEVBQUU7WUFFNUMsSUFBSWlDLE9BQU81QixNQUFNLEdBQUcsR0FBRztnQkFDckIsTUFBTSxJQUFJSixNQUFNLENBQUMsOEJBQThCLEVBQUVnQyxPQUFPNUIsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNuRTtZQUVBdkIsa0JBQWtCO1FBQ3BCLEVBQUUsT0FBT3lCLEtBQVU7WUFDakJDLFFBQVE3QixLQUFLLENBQUM0QjtZQUNkM0IsU0FBUzJCLElBQUlFLE9BQU8sSUFBSTtRQUMxQixTQUFVO1lBQ1IvQixVQUFVO1FBQ1o7SUFDRjtJQUVBLE1BQU15RCx1QkFDSmxFLFVBQVVtRSxJQUFJLENBQUMsQ0FBQ3hDLElBQU1BLEVBQUVVLEVBQUUsS0FBS25DLHFCQUFxQjRDLFFBQVE7SUFFOUQscUJBQ0UsOERBQUNzQjtRQUFLQyxXQUFVO2tCQUNkLDRFQUFDQztZQUFJRCxXQUFVOzs4QkFDYiw4REFBQ0U7b0JBQU9GLFdBQVU7O3NDQUNoQiw4REFBQ0M7OzhDQUNDLDhEQUFDRTtvQ0FBRUgsV0FBVTs4Q0FBaUU7Ozs7Ozs4Q0FHOUUsOERBQUNJO29DQUFHSixXQUFVOzhDQUF5RDs7Ozs7OzhDQUd2RSw4REFBQ0c7b0NBQUVILFdBQVU7OENBQXNDOzs7Ozs7Ozs7Ozs7c0NBT3JELDhEQUFDQzs0QkFBSUQsV0FBVTs7OENBQ2IsOERBQUN2RTtvQ0FBTXVFLFdBQVU7OENBQWlEOzs7Ozs7OENBR2xFLDhEQUFDSztvQ0FDQ0wsV0FBVTtvQ0FDVnhFLE9BQU9LLHNCQUFzQjtvQ0FDN0J5RSxVQUFVLENBQUNDLElBQ1R6RSxzQkFDRXlFLEVBQUVDLE1BQU0sQ0FBQ2hGLEtBQUssR0FBR2lGLE9BQU9GLEVBQUVDLE1BQU0sQ0FBQ2hGLEtBQUssSUFBSTs7c0RBSTlDLDhEQUFDa0Y7NENBQU9sRixPQUFNO3NEQUFHOzs7Ozs7d0NBQ2hCRyxVQUFVbUQsR0FBRyxDQUFDLENBQUN4QixrQkFDZCw4REFBQ29EO2dEQUFrQmxGLE9BQU84QixFQUFFVSxFQUFFOzBEQUMzQlYsRUFBRW1CLElBQUk7K0NBREluQixFQUFFVSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkFRekIsOERBQUMyQztvQkFBUVgsV0FBVTs7d0JBQ2hCM0QsdUJBQ0MsOERBQUM0RDs0QkFBSUQsV0FBVTtzQ0FDWjNEOzs7Ozs7d0JBR0pFLGdDQUNDLDhEQUFDMEQ7NEJBQUlELFdBQVU7c0NBQ1p6RDs7Ozs7O3dCQUlKLENBQUNWLG1DQUNBLDhEQUFDc0U7NEJBQUVILFdBQVU7c0NBQXdCOzs7OzttQ0FHbkMvRCxnQ0FDRiw4REFBQ2tFOzRCQUFFSCxXQUFVOztnQ0FBd0I7OENBQ2QsOERBQUNZO29DQUFLWixXQUFVOzhDQUFpQkg7Ozs7OztnQ0FBNEI7Ozs7OzttQ0FFbEY5RCxTQUFTZ0MsTUFBTSxLQUFLLGtCQUN0Qiw4REFBQ29DOzRCQUFFSCxXQUFVO3NDQUF3Qjs7Ozs7aURBS3JDOzs4Q0FDRSw4REFBQ0M7b0NBQUlELFdBQVU7O3NEQUNiLDhEQUFDQzs7Z0RBQUk7Z0RBQ1U7OERBQ2IsOERBQUNXO29EQUFLWixXQUFVOzhEQUFpQkg7Ozs7OztnREFBNEI7Z0RBQUU7Z0RBQUk7Ozs7Ozs7c0RBSXJFLDhEQUFDcEU7NENBQU11RSxXQUFVOzs4REFDZiw4REFBQ2E7b0RBQ0NDLE1BQUs7b0RBQ0xkLFdBQVU7b0RBQ1ZlLFNBQVN0RTtvREFDVDZELFVBQVUsQ0FBQ0MsSUFBTTdELG9CQUFvQjZELEVBQUVDLE1BQU0sQ0FBQ08sT0FBTzs7Ozs7OzhEQUV2RCw4REFBQ0g7OERBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0FJViw4REFBQ1g7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUNnQjt3Q0FBTWhCLFdBQVU7OzBEQUNmLDhEQUFDaUI7MERBQ0MsNEVBQUNDO29EQUFHbEIsV0FBVTs7c0VBQ1osOERBQUNtQjs0REFBR25CLFdBQVU7c0VBQXNCOzs7Ozs7c0VBQ3BDLDhEQUFDbUI7NERBQUduQixXQUFVO3NFQUFzQjs7Ozs7O3NFQUNwQyw4REFBQ21COzREQUFHbkIsV0FBVTtzRUFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzBEQUd4Qyw4REFBQ29COzBEQUNFaEUsZ0JBQWdCMEIsR0FBRyxDQUFDLENBQUN4QixrQkFDcEIsOERBQUM0RDt3REFFQ2xCLFdBQVU7OzBFQUVWLDhEQUFDcUI7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRUosV0FBVzs7Ozs7OzBFQUVoQiw4REFBQ21FO2dFQUFHckIsV0FBVTswRUFDWiw0RUFBQ0s7b0VBQ0NMLFdBQVU7b0VBQ1Z4RSxPQUFPOEIsRUFBRU4sY0FBYyxJQUFJO29FQUMzQnNELFVBQVUsQ0FBQ0MsSUFDVDVCLHFCQUNFckIsRUFBRUosV0FBVyxFQUNicUQsRUFBRUMsTUFBTSxDQUFDaEYsS0FBSzs4RUFJakJELGtCQUFrQnVELEdBQUcsQ0FBQyxDQUFDd0Msb0JBQ3RCLDhEQUFDWjs0RUFBdUJsRixPQUFPOEYsSUFBSTlGLEtBQUs7c0ZBQ3JDOEYsSUFBSTdGLEtBQUs7MkVBREM2RixJQUFJOUYsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OzBFQU01Qiw4REFBQzZGO2dFQUFHckIsV0FBVTswRUFDWDFDLEVBQUVOLGNBQWMsaUJBQ2YsOERBQUM0RDtvRUFBS1osV0FBVTs4RUFBaUg7Ozs7O3lGQUlqSSw4REFBQ1k7b0VBQUtaLFdBQVU7OEVBQTJHOzs7Ozs7Ozs7Ozs7dURBOUIxSDFDLEVBQUVKLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0F5QzVCLDhEQUFDK0M7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUN1Qjt3Q0FDQ1QsTUFBSzt3Q0FDTFUsU0FBU3pDO3dDQUNUMEMsVUFBVXRGO3dDQUNWNkQsV0FBVTtrREFFVDdELFNBQVMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIE1lcmNoYW50ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIE1hcHBpbmcgPSB7XG4gIGlkOiBudW1iZXIgfCBudWxsOyAgICAgICAgICAgLy8gbWlnaHQgYmUgbnVsbCBpZiBqdXN0IGNyZWF0ZWQgY2xpZW50LXNpZGVcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFVwc2VydFJlcXVlc3QgPSB7XG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHlvdXIgYmFja2VuZCBgcGFydFJvbGVgIHZhbHVlc1xuY29uc3QgUEFSVF9ST0xFX09QVElPTlMgPSBbXG4gIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIuKAlCBVbm1hcHBlZCDigJRcIiB9LFxuICB7IHZhbHVlOiBcInVwcGVyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJiYXJyZWxcIiwgbGFiZWw6IFwiQmFycmVsXCIgfSxcbiAgeyB2YWx1ZTogXCJoYW5kZ3VhcmRcIiwgbGFiZWw6IFwiSGFuZGd1YXJkXCIgfSxcbiAgeyB2YWx1ZTogXCJjaGFyZ2luZy1oYW5kbGVcIiwgbGFiZWw6IFwiQ2hhcmdpbmcgSGFuZGxlXCIgfSxcbiAgeyB2YWx1ZTogXCJidWZmZXIta2l0XCIsIGxhYmVsOiBcIkJ1ZmZlciBLaXRcIiB9LFxuICB7IHZhbHVlOiBcImxvd2VyLXBhcnRzLWtpdFwiLCBsYWJlbDogXCJMb3dlciBQYXJ0cyBLaXRcIiB9LFxuICB7IHZhbHVlOiBcInNpZ2h0XCIsIGxhYmVsOiBcIlNpZ2h0IC8gT3B0aWNcIiB9LFxuICB7IHZhbHVlOiBcImxvd2VyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJvcHRpY1wiLCBsYWJlbDogXCJPcHRpY1wiIH0sXG4gIHsgdmFsdWU6IFwic3RvY2tcIiwgbGFiZWw6IFwiU3RvY2tcIiB9LFxuICB7IHZhbHVlOiBcIm90aGVyXCIsIGxhYmVsOiBcIk90aGVyIC8gSWdub3JlXCIgfSxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5TWFwcGluZ3NQYWdlKCkge1xuICBjb25zdCBbbWVyY2hhbnRzLCBzZXRNZXJjaGFudHNdID0gdXNlU3RhdGU8TWVyY2hhbnRbXT4oW10pO1xuICBjb25zdCBbc2VsZWN0ZWRNZXJjaGFudElkLCBzZXRTZWxlY3RlZE1lcmNoYW50SWRdID0gdXNlU3RhdGU8bnVtYmVyIHwgbnVsbD4oXG4gICAgbnVsbCxcbiAgKTtcbiAgY29uc3QgW21hcHBpbmdzLCBzZXRNYXBwaW5nc10gPSB1c2VTdGF0ZTxNYXBwaW5nW10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmdNYXBwaW5ncywgc2V0TG9hZGluZ01hcHBpbmdzXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3N1Y2Nlc3NNZXNzYWdlLCBzZXRTdWNjZXNzTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Nob3dPbmx5VW5tYXBwZWQsIHNldFNob3dPbmx5VW5tYXBwZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IHNvcnRlZE1hcHBpbmdzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gTWFwcGVkIHJvd3MgZmlyc3QsIHRoZW4gdW5tYXBwZWQ7IHdpdGhpbiBlYWNoIGdyb3VwLCBhbHBoYSBieSByYXdDYXRlZ29yeVxuICAgIHJldHVybiBbLi4ubWFwcGluZ3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFNYXBwZWQgPSAhIWEubWFwcGVkUGFydFJvbGU7XG4gICAgICBjb25zdCBiTWFwcGVkID0gISFiLm1hcHBlZFBhcnRSb2xlO1xuXG4gICAgICBpZiAoYU1hcHBlZCAhPT0gYk1hcHBlZCkge1xuICAgICAgICByZXR1cm4gYU1hcHBlZCA/IC0xIDogMTsgLy8gbWFwcGVkIGZpcnN0XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLnJhd0NhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5yYXdDYXRlZ29yeSk7XG4gICAgfSk7XG4gIH0sIFttYXBwaW5nc10pO1xuXG4gIGNvbnN0IHZpc2libGVNYXBwaW5ncyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIHNob3dPbmx5VW5tYXBwZWRcbiAgICAgICAgPyBzb3J0ZWRNYXBwaW5ncy5maWx0ZXIoKG0pID0+ICFtLm1hcHBlZFBhcnRSb2xlKVxuICAgICAgICA6IHNvcnRlZE1hcHBpbmdzLFxuICAgIFtzb3J0ZWRNYXBwaW5ncywgc2hvd09ubHlVbm1hcHBlZF0sXG4gICk7XG5cbiAgLy8gTG9hZCBtZXJjaGFudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaE1lcmNoYW50cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnRzYCk7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YTogTWVyY2hhbnRbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIHNldE1lcmNoYW50cyhkYXRhKTtcblxuICAgICAgICAvLyBBdXRvLXNlbGVjdCB0aGUgZmlyc3QgbWVyY2hhbnQgaWYgeW91IHdhbnRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1lcmNoYW50SWQgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoZGF0YVswXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHNcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZXJjaGFudHMoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBMb2FkIG1hcHBpbmdzIGZvciBzZWxlY3RlZCBtZXJjaGFudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNYXBwaW5ncygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3M/bWVyY2hhbnRJZD0ke3NlbGVjdGVkTWVyY2hhbnRJZH1gO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3MgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIE1hcHBpbmdbXTtcbiAgICAgICAgc2V0TWFwcGluZ3MoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtYXBwaW5nc1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNYXBwaW5ncygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW3NlbGVjdGVkTWVyY2hhbnRJZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVBhcnRSb2xlID0gKHJhd0NhdGVnb3J5OiBzdHJpbmcsIG5ld1JvbGU6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcHBpbmdzKChwcmV2KSA9PlxuICAgICAgcHJldi5tYXAoKG0pID0+XG4gICAgICAgIG0ucmF3Q2F0ZWdvcnkgPT09IHJhd0NhdGVnb3J5XG4gICAgICAgICAgPyB7IC4uLm0sIG1hcHBlZFBhcnRSb2xlOiBuZXdSb2xlIHx8IG51bGwgfVxuICAgICAgICAgIDogbSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG4gICAgc2V0U2F2aW5nKHRydWUpO1xuICAgIHNldEVycm9yKG51bGwpO1xuICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhdmUgZWFjaCBtYXBwaW5nIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCByZXF1ZXN0czogUHJvbWlzZTxSZXNwb25zZT5bXSA9IG1hcHBpbmdzLm1hcCgobSkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBVcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1lcmNoYW50SWQ6IHNlbGVjdGVkTWVyY2hhbnRJZCxcbiAgICAgICAgICByYXdDYXRlZ29yeTogbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICBtYXBwZWRQYXJ0Um9sZTogbS5tYXBwZWRQYXJ0Um9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9hZG1pbi9tZXJjaGFudC1jYXRlZ29yeS1tYXBwaW5nc2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3BvbnNlcy5maWx0ZXIoKHIpID0+ICFyLm9rKTtcblxuICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU29tZSBtYXBwaW5ncyBmYWlsZWQgdG8gc2F2ZSAoJHtmYWlsZWQubGVuZ3RofSlgKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3VjY2Vzc01lc3NhZ2UoXCJNYXBwaW5ncyBzYXZlZC4gUmUtcnVuIHRoZSBpbXBvcnQgdG8gYXBwbHkgY2hhbmdlcy5cIik7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIHNhdmUgbWFwcGluZ3NcIik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkTWVyY2hhbnROYW1lID1cbiAgICBtZXJjaGFudHMuZmluZCgobSkgPT4gbS5pZCA9PT0gc2VsZWN0ZWRNZXJjaGFudElkKT8ubmFtZSA/PyBcIuKAlFwiO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTV4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmQgLyBBZG1pblxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBNZXJjaGFudCBDYXRlZ29yeSBNYXBwaW5nXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgTm9ybWFsaXplIGVhY2ggbWVyY2hhbnQmYXBvcztzIGNhdGVnb3J5IG5hbWVzIGludG8geW91ciBpbnRlcm5hbFxuICAgICAgICAgICAgICBwYXJ0IHJvbGVzICh1cHBlciwgYmFycmVsLCBoYW5kZ3VhcmQsIGV0Yy4pLiBVbm1hcHBlZCBjYXRlZ29yaWVzXG4gICAgICAgICAgICAgIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgaW1wb3J0IHVudGlsIHRoZXkgYXJlIG1hcHBlZCBoZXJlLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMCBtYi0xXCI+XG4gICAgICAgICAgICAgIFNlbGVjdCBNZXJjaGFudFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRNZXJjaGFudElkID8/IFwiXCJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoXG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA/IE51bWJlcihlLnRhcmdldC52YWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+4oCUIENob29zZSBtZXJjaGFudCDigJQ8L29wdGlvbj5cbiAgICAgICAgICAgICAge21lcmNoYW50cy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17bS5pZH0gdmFsdWU9e20uaWR9PlxuICAgICAgICAgICAgICAgICAge20ubmFtZX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1yZWQtNTAwLzYwIGJnLXJlZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1yZWQtMjAwXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItZW1lcmFsZC01MDAvNjAgYmctZW1lcmFsZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1lbWVyYWxkLTIwMFwiPlxuICAgICAgICAgICAgICB7c3VjY2Vzc01lc3NhZ2V9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgeyFzZWxlY3RlZE1lcmNoYW50SWQgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgQ2hvb3NlIGEgbWVyY2hhbnQgYWJvdmUgdG8gdmlldyBjYXRlZ29yeSBtYXBwaW5ncy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbG9hZGluZ01hcHBpbmdzID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgbWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPuKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBtYXBwaW5ncy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgTm8gY2F0ZWdvcnkgcm93cyB5ZXQgZm9yIHRoaXMgbWVyY2hhbnQuIE9uY2UgeW91IHJ1biBhbiBpbXBvcnQsXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQgY2F0ZWdvcmllcyB3aWxsIGFwcGVhciBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIE1hcHBpbmdzIGZvcntcIiBcIn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPi57XCIgXCJ9XG4gICAgICAgICAgICAgICAgICBTZXQgYSBwYXJ0IHJvbGUgZm9yIGVhY2ggcmF3IGNhdGVnb3J5LiBVbm1hcHBlZCBjYXRlZ29yaWVzIHdpbGxcbiAgICAgICAgICAgICAgICAgIGJlIHNraXBwZWQgYnkgdGhlIGltcG9ydGVyLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgdGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctMyByb3VuZGVkIGJvcmRlci16aW5jLTYwMCBiZy16aW5jLTkwMFwiXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Nob3dPbmx5VW5tYXBwZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2hvd09ubHlVbm1hcHBlZChlLnRhcmdldC5jaGVja2VkKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93IG9ubHkgdW5tYXBwZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwibWluLXctZnVsbCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgdGV4dC14cyB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+UmF3IENhdGVnb3J5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPk1hcHBlZCBQYXJ0IFJvbGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHt2aXNpYmxlTWFwcGluZ3MubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy05MDAgbGFzdDpib3JkZXItYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXppbmMtMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAgcHgtMiBweS0xIHRleHQteHMgdGV4dC16aW5jLTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e20ubWFwcGVkUGFydFJvbGUgPz8gXCJcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2VQYXJ0Um9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1BBUlRfUk9MRV9PUFRJT05TLm1hcCgob3B0KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0LnZhbHVlfSB2YWx1ZT17b3B0LnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29wdC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLm1hcHBlZFBhcnRSb2xlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctZW1lcmFsZC01MDAvMTAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LWVtZXJhbGQtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBiZy16aW5jLTcwMC80MCBweC0yIHB5LTAuNSB0ZXh0LVswLjdyZW1dIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubWFwcGVkIC8gSWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTYXZlfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NhdmluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYmctYW1iZXItNDAwIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDAgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3NhdmluZyA/IFwiU2F2aW5n4oCmXCIgOiBcIlNhdmUgTWFwcGluZ3NcIn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlTWVtbyIsIkFQSV9CQVNFX1VSTCIsInByb2Nlc3MiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJQQVJUX1JPTEVfT1BUSU9OUyIsInZhbHVlIiwibGFiZWwiLCJDYXRlZ29yeU1hcHBpbmdzUGFnZSIsIm1lcmNoYW50cyIsInNldE1lcmNoYW50cyIsInNlbGVjdGVkTWVyY2hhbnRJZCIsInNldFNlbGVjdGVkTWVyY2hhbnRJZCIsIm1hcHBpbmdzIiwic2V0TWFwcGluZ3MiLCJsb2FkaW5nTWFwcGluZ3MiLCJzZXRMb2FkaW5nTWFwcGluZ3MiLCJzYXZpbmciLCJzZXRTYXZpbmciLCJlcnJvciIsInNldEVycm9yIiwic3VjY2Vzc01lc3NhZ2UiLCJzZXRTdWNjZXNzTWVzc2FnZSIsInNob3dPbmx5VW5tYXBwZWQiLCJzZXRTaG93T25seVVubWFwcGVkIiwic29ydGVkTWFwcGluZ3MiLCJzb3J0IiwiYSIsImIiLCJhTWFwcGVkIiwibWFwcGVkUGFydFJvbGUiLCJiTWFwcGVkIiwicmF3Q2F0ZWdvcnkiLCJsb2NhbGVDb21wYXJlIiwidmlzaWJsZU1hcHBpbmdzIiwiZmlsdGVyIiwibSIsImZldGNoTWVyY2hhbnRzIiwicmVzIiwiZmV0Y2giLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJsZW5ndGgiLCJpZCIsImVyciIsImNvbnNvbGUiLCJtZXNzYWdlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoTWFwcGluZ3MiLCJ1cmwiLCJzaWduYWwiLCJuYW1lIiwiYWJvcnQiLCJoYW5kbGVDaGFuZ2VQYXJ0Um9sZSIsIm5ld1JvbGUiLCJwcmV2IiwibWFwIiwiaGFuZGxlU2F2ZSIsInJlcXVlc3RzIiwicGF5bG9hZCIsIm1lcmNoYW50SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwiZmFpbGVkIiwiciIsInNlbGVjdGVkTWVyY2hhbnROYW1lIiwiZmluZCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoZWFkZXIiLCJwIiwiaDEiLCJzZWxlY3QiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJOdW1iZXIiLCJvcHRpb24iLCJzZWN0aW9uIiwic3BhbiIsImlucHV0IiwidHlwZSIsImNoZWNrZWQiLCJ0YWJsZSIsInRoZWFkIiwidHIiLCJ0aCIsInRib2R5IiwidGQiLCJvcHQiLCJidXR0b24iLCJvbkNsaWNrIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/admin/category-mappings/page.tsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ CategoryMappingsPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\n// Keep this in sync with your backend `partRole` values\nconst PART_ROLE_OPTIONS = [\n {\n value: \"\",\n label: \"— Unmapped —\"\n },\n // Lower / fire control\n {\n value: \"lower-receiver\",\n label: \"Lower Receiver\"\n },\n {\n value: \"lower-parts-kit\",\n label: \"Lower Parts Kit\"\n },\n {\n value: \"trigger\",\n label: \"Trigger / Trigger Kit\"\n },\n {\n value: \"pistol-grip\",\n label: \"Pistol Grip\"\n },\n {\n value: \"safety-selector\",\n label: \"Safety Selector\"\n },\n // Upper\n {\n value: \"upper-receiver\",\n label: \"Upper Receiver\"\n },\n {\n value: \"barrel\",\n label: \"Barrel\"\n },\n {\n value: \"handguard\",\n label: \"Handguard\"\n },\n {\n value: \"gas-system\",\n label: \"Gas System / Gas Block\"\n },\n {\n value: \"muzzle-device\",\n label: \"Muzzle Device\"\n },\n {\n value: \"suppressor\",\n label: \"Suppressor\"\n },\n // Furniture / sights / optics\n {\n value: \"stock\",\n label: \"Stock\"\n },\n {\n value: \"buffer-kit\",\n label: \"Buffer Kit\"\n },\n {\n value: \"charging-handle\",\n label: \"Charging Handle\"\n },\n {\n value: \"sight\",\n label: \"Iron / Backup Sight\"\n },\n {\n value: \"optic\",\n label: \"Optic\"\n },\n {\n value: \"other\",\n label: \"Other / Ignore\"\n }\n];\nfunction CategoryMappingsPage() {\n const [merchants, setMerchants] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [selectedMerchantId, setSelectedMerchantId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [mappings, setMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loadingMappings, setLoadingMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [saving, setSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [successMessage, setSuccessMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [showOnlyUnmapped, setShowOnlyUnmapped] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const sortedMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n // Mapped rows first, then unmapped; within each group, alpha by rawCategory\n return [\n ...mappings\n ].sort((a, b)=>{\n const aMapped = !!a.mappedPartRole;\n const bMapped = !!b.mappedPartRole;\n if (aMapped !== bMapped) {\n return aMapped ? -1 : 1; // mapped first\n }\n return a.rawCategory.localeCompare(b.rawCategory);\n });\n }, [\n mappings\n ]);\n const visibleMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>showOnlyUnmapped ? sortedMappings.filter((m)=>!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyUnmapped\n ]);\n // Load merchants\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n async function fetchMerchants() {\n try {\n const res = await fetch(`${API_BASE_URL}/admin/merchants`);\n if (!res.ok) {\n throw new Error(`Failed to load merchants (${res.status})`);\n }\n const data = await res.json();\n setMerchants(data);\n // Auto-select the first merchant if you want\n if (data.length > 0 && selectedMerchantId === null) {\n setSelectedMerchantId(data[0].id);\n }\n } catch (err) {\n console.error(err);\n setError(err.message ?? \"Failed to load merchants\");\n }\n }\n fetchMerchants();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Load mappings for selected merchant\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!selectedMerchantId) return;\n const controller = new AbortController();\n async function fetchMappings() {\n try {\n setLoadingMappings(true);\n setError(null);\n setSuccessMessage(null);\n const url = `${API_BASE_URL}/admin/merchant-category-mappings?merchantId=${selectedMerchantId}`;\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load mappings (${res.status})`);\n }\n const data = await res.json();\n setMappings(data);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n console.error(err);\n setError(err.message ?? \"Failed to load mappings\");\n } finally{\n setLoadingMappings(false);\n }\n }\n fetchMappings();\n return ()=>controller.abort();\n }, [\n selectedMerchantId\n ]);\n const handleChangePartRole = (rawCategory, newRole)=>{\n setMappings((prev)=>prev.map((m)=>m.rawCategory === rawCategory ? {\n ...m,\n mappedPartRole: newRole || null\n } : m));\n };\n const handleSave = async ()=>{\n if (!selectedMerchantId) return;\n setSaving(true);\n setError(null);\n setSuccessMessage(null);\n try {\n // Save each mapping in parallel\n const requests = mappings.map((m)=>{\n const payload = {\n merchantId: selectedMerchantId,\n rawCategory: m.rawCategory,\n mappedPartRole: m.mappedPartRole\n };\n return fetch(`${API_BASE_URL}/admin/merchant-category-mappings`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n });\n const responses = await Promise.all(requests);\n const failed = responses.filter((r)=>!r.ok);\n if (failed.length > 0) {\n throw new Error(`Some mappings failed to save (${failed.length})`);\n }\n setSuccessMessage(\"Mappings saved. Re-run the import to apply changes.\");\n } catch (err) {\n console.error(err);\n setError(err.message ?? \"Failed to save mappings\");\n } finally{\n setSaving(false);\n }\n };\n const selectedMerchantName = merchants.find((m)=>m.id === selectedMerchantId)?.name ?? \"—\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-5xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-3 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard / Admin\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 206,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: \"Merchant Category Mapping\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 209,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Normalize each merchant's category names into your internal part roles (upper, barrel, handguard, etc.). Unmapped categories will be skipped during import until they are mapped here.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 212,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 205,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block text-xs font-semibold text-zinc-400 mb-1\",\n children: \"Select Merchant\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 220,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100\",\n value: selectedMerchantId ?? \"\",\n onChange: (e)=>setSelectedMerchantId(e.target.value ? Number(e.target.value) : null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"— Choose merchant —\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 232,\n columnNumber: 15\n }, this),\n merchants.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: m.id,\n children: m.name\n }, m.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 234,\n columnNumber: 17\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 219,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 204,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-red-500/60 bg-red-500/10 px-3 py-2 text-xs text-red-200\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n successMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs text-emerald-200\",\n children: successMessage\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 249,\n columnNumber: 13\n }, this),\n !selectedMerchantId ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Choose a merchant above to view category mappings.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this) : loadingMappings ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: [\n \"Loading mappings for \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 260,\n columnNumber: 36\n }, this),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this) : mappings.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No category rows yet for this merchant. Once you run an import, discovered categories will appear here automatically.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex items-center justify-between gap-3 text-xs text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n \"Mappings for\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 272,\n columnNumber: 19\n }, this),\n \".\",\n \" \",\n \"Set a part role for each raw category. Unmapped categories will be skipped by the importer.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 270,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"inline-flex items-center gap-1 text-[0.7rem] text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n className: \"h-3 w-3 rounded border-zinc-600 bg-zinc-900\",\n checked: showOnlyUnmapped,\n onChange: (e)=>setShowOnlyUnmapped(e.target.checked)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 277,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Show only unmapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 283,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 276,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 269,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 text-xs uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Raw Category\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 291,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Mapped Part Role\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 292,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 293,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 290,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 289,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: visibleMappings.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-900 last:border-b-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-zinc-200\",\n children: m.rawCategory\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 302,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-2 py-1 text-xs text-zinc-100\",\n value: m.mappedPartRole ?? \"\",\n onChange: (e)=>handleChangePartRole(m.rawCategory, e.target.value),\n children: PART_ROLE_OPTIONS.map((opt)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: opt.value,\n children: opt.label\n }, opt.value, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 317,\n columnNumber: 31\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 306,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 305,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-sm\",\n children: m.mappedPartRole ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-emerald-500/10 px-2 py-0.5 text-[0.7rem] font-medium text-emerald-300\",\n children: \"Mapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 325,\n columnNumber: 29\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-zinc-700/40 px-2 py-0.5 text-[0.7rem] font-medium text-zinc-300\",\n children: \"Unmapped / Ignored\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 329,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 323,\n columnNumber: 25\n }, this)\n ]\n }, m.rawCategory, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 298,\n columnNumber: 23\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 296,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 287,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleSave,\n disabled: saving,\n className: \"rounded-md bg-amber-400 px-4 py-2 text-sm font-semibold text-black hover:bg-amber-300 disabled:opacity-50\",\n children: saving ? \"Saving…\" : \"Save Mappings\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 340,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 203,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 202,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFcUQ7QUFFckQsTUFBTUcsZUFDSkMsUUFBUUMsR0FBRyxDQUFDQyx3QkFBd0IsSUFBSTtBQXFCMUMsd0RBQXdEO0FBQ3hELE1BQU1DLG9CQUFvQjtJQUN4QjtRQUFFQyxPQUFPO1FBQUlDLE9BQU87SUFBZTtJQUNuQyx1QkFBdUI7SUFDdkI7UUFBRUQsT0FBTztRQUFrQkMsT0FBTztJQUFpQjtJQUNuRDtRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBQ3JEO1FBQUVELE9BQU87UUFBV0MsT0FBTztJQUF3QjtJQUNuRDtRQUFFRCxPQUFPO1FBQWVDLE9BQU87SUFBYztJQUM3QztRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBRXJELFFBQVE7SUFDUjtRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBVUMsT0FBTztJQUFTO0lBQ25DO1FBQUVELE9BQU87UUFBYUMsT0FBTztJQUFZO0lBQ3pDO1FBQUVELE9BQU87UUFBY0MsT0FBTztJQUF5QjtJQUN2RDtRQUFFRCxPQUFPO1FBQWlCQyxPQUFPO0lBQWdCO0lBQ2pEO1FBQUVELE9BQU87UUFBY0MsT0FBTztJQUFhO0lBRTNDLDhCQUE4QjtJQUM5QjtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQWNDLE9BQU87SUFBYTtJQUMzQztRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBQ3JEO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFzQjtJQUMvQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBaUI7Q0FDM0M7QUFFYyxTQUFTQztJQUN0QixNQUFNLENBQUNDLFdBQVdDLGFBQWEsR0FBR1gsK0NBQVFBLENBQWEsRUFBRTtJ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Qiw4REFBQ21FO2dFQUFHckIsV0FBVTswRUFDWiw0RUFBQ0s7b0VBQ0NMLFdBQVU7b0VBQ1Z4RSxPQUFPOEIsRUFBRU4sY0FBYyxJQUFJO29FQUMzQnNELFVBQVUsQ0FBQ0MsSUFDVDVCLHFCQUNFckIsRUFBRUosV0FBVyxFQUNicUQsRUFBRUMsTUFBTSxDQUFDaEYsS0FBSzs4RUFJakJELGtCQUFrQnVELEdBQUcsQ0FBQyxDQUFDd0Msb0JBQ3RCLDhEQUFDWjs0RUFBdUJsRixPQUFPOEYsSUFBSTlGLEtBQUs7c0ZBQ3JDOEYsSUFBSTdGLEtBQUs7MkVBREM2RixJQUFJOUYsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OzBFQU01Qiw4REFBQzZGO2dFQUFHckIsV0FBVTswRUFDWDFDLEVBQUVOLGNBQWMsaUJBQ2YsOERBQUM0RDtvRUFBS1osV0FBVTs4RUFBaUg7Ozs7O3lGQUlqSSw4REFBQ1k7b0VBQUtaLFdBQVU7OEVBQTJHOzs7Ozs7Ozs7Ozs7dURBOUIxSDFDLEVBQUVKLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0F5QzVCLDhEQUFDK0M7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUN1Qjt3Q0FDQ1QsTUFBSzt3Q0FDTFUsU0FBU3pDO3dDQUNUMEMsVUFBVXRGO3dDQUNWNkQsV0FBVTtrREFFVDdELFNBQVMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIE1lcmNoYW50ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIE1hcHBpbmcgPSB7XG4gIGlkOiBudW1iZXIgfCBudWxsOyAgICAgICAgICAgLy8gbWlnaHQgYmUgbnVsbCBpZiBqdXN0IGNyZWF0ZWQgY2xpZW50LXNpZGVcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFVwc2VydFJlcXVlc3QgPSB7XG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHlvdXIgYmFja2VuZCBgcGFydFJvbGVgIHZhbHVlc1xuY29uc3QgUEFSVF9ST0xFX09QVElPTlMgPSBbXG4gIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIuKAlCBVbm1hcHBlZCDigJRcIiB9LFxuICAvLyBMb3dlciAvIGZpcmUgY29udHJvbFxuICB7IHZhbHVlOiBcImxvd2VyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1wYXJ0cy1raXRcIiwgbGFiZWw6IFwiTG93ZXIgUGFydHMgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJ0cmlnZ2VyXCIsIGxhYmVsOiBcIlRyaWdnZXIgLyBUcmlnZ2VyIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwicGlzdG9sLWdyaXBcIiwgbGFiZWw6IFwiUGlzdG9sIEdyaXBcIiB9LFxuICB7IHZhbHVlOiBcInNhZmV0eS1zZWxlY3RvclwiLCBsYWJlbDogXCJTYWZldHkgU2VsZWN0b3JcIiB9LFxuXG4gIC8vIFVwcGVyXG4gIHsgdmFsdWU6IFwidXBwZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcImJhcnJlbFwiLCBsYWJlbDogXCJCYXJyZWxcIiB9LFxuICB7IHZhbHVlOiBcImhhbmRndWFyZFwiLCBsYWJlbDogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IHZhbHVlOiBcImdhcy1zeXN0ZW1cIiwgbGFiZWw6IFwiR2FzIFN5c3RlbSAvIEdhcyBCbG9ja1wiIH0sXG4gIHsgdmFsdWU6IFwibXV6emxlLWRldmljZVwiLCBsYWJlbDogXCJNdXp6bGUgRGV2aWNlXCIgfSxcbiAgeyB2YWx1ZTogXCJzdXBwcmVzc29yXCIsIGxhYmVsOiBcIlN1cHByZXNzb3JcIiB9LFxuXG4gIC8vIEZ1cm5pdHVyZSAvIHNpZ2h0cyAvIG9wdGljc1xuICB7IHZhbHVlOiBcInN0b2NrXCIsIGxhYmVsOiBcIlN0b2NrXCIgfSxcbiAgeyB2YWx1ZTogXCJidWZmZXIta2l0XCIsIGxhYmVsOiBcIkJ1ZmZlciBLaXRcIiB9LFxuICB7IHZhbHVlOiBcImNoYXJnaW5nLWhhbmRsZVwiLCBsYWJlbDogXCJDaGFyZ2luZyBIYW5kbGVcIiB9LFxuICB7IHZhbHVlOiBcInNpZ2h0XCIsIGxhYmVsOiBcIklyb24gLyBCYWNrdXAgU2lnaHRcIiB9LFxuICB7IHZhbHVlOiBcIm9wdGljXCIsIGxhYmVsOiBcIk9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJvdGhlclwiLCBsYWJlbDogXCJPdGhlciAvIElnbm9yZVwiIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeU1hcHBpbmdzUGFnZSgpIHtcbiAgY29uc3QgW21lcmNoYW50cywgc2V0TWVyY2hhbnRzXSA9IHVzZVN0YXRlPE1lcmNoYW50W10+KFtdKTtcbiAgY29uc3QgW3NlbGVjdGVkTWVyY2hhbnRJZCwgc2V0U2VsZWN0ZWRNZXJjaGFudElkXSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFttYXBwaW5ncywgc2V0TWFwcGluZ3NdID0gdXNlU3RhdGU8TWFwcGluZ1tdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nTWFwcGluZ3MsIHNldExvYWRpbmdNYXBwaW5nc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzdWNjZXNzTWVzc2FnZSwgc2V0U3VjY2Vzc01lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzaG93T25seVVubWFwcGVkLCBzZXRTaG93T25seVVubWFwcGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBzb3J0ZWRNYXBwaW5ncyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIE1hcHBlZCByb3dzIGZpcnN0LCB0aGVuIHVubWFwcGVkOyB3aXRoaW4gZWFjaCBncm91cCwgYWxwaGEgYnkgcmF3Q2F0ZWdvcnlcbiAgICByZXR1cm4gWy4uLm1hcHBpbmdzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTWFwcGVkID0gISFhLm1hcHBlZFBhcnRSb2xlO1xuICAgICAgY29uc3QgYk1hcHBlZCA9ICEhYi5tYXBwZWRQYXJ0Um9sZTtcblxuICAgICAgaWYgKGFNYXBwZWQgIT09IGJNYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuIGFNYXBwZWQgPyAtMSA6IDE7IC8vIG1hcHBlZCBmaXJzdFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5yYXdDYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIucmF3Q2F0ZWdvcnkpO1xuICAgIH0pO1xuICB9LCBbbWFwcGluZ3NdKTtcblxuICBjb25zdCB2aXNpYmxlTWFwcGluZ3MgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBzaG93T25seVVubWFwcGVkXG4gICAgICAgID8gc29ydGVkTWFwcGluZ3MuZmlsdGVyKChtKSA9PiAhbS5tYXBwZWRQYXJ0Um9sZSlcbiAgICAgICAgOiBzb3J0ZWRNYXBwaW5ncyxcbiAgICBbc29ydGVkTWFwcGluZ3MsIHNob3dPbmx5VW5tYXBwZWRdLFxuICApO1xuXG4gIC8vIExvYWQgbWVyY2hhbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXJjaGFudHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50c2ApO1xuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGE6IE1lcmNoYW50W10gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRNZXJjaGFudHMoZGF0YSk7XG5cbiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IG1lcmNoYW50IGlmIHlvdSB3YW50XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRNZXJjaGFudElkID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKGRhdGFbMF0uaWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWVyY2hhbnRzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgLy8gTG9hZCBtYXBwaW5ncyBmb3Igc2VsZWN0ZWQgbWVyY2hhbnRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoTWFwcGluZ3MoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3ModHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50LWNhdGVnb3J5LW1hcHBpbmdzP21lcmNoYW50SWQ9JHtzZWxlY3RlZE1lcmNoYW50SWR9YDtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1hcHBpbmdzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyBNYXBwaW5nW107XG4gICAgICAgIHNldE1hcHBpbmdzKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3NcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3MoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWFwcGluZ3MoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtzZWxlY3RlZE1lcmNoYW50SWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2VQYXJ0Um9sZSA9IChyYXdDYXRlZ29yeTogc3RyaW5nLCBuZXdSb2xlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRNYXBwaW5ncygocHJldikgPT5cbiAgICAgIHByZXYubWFwKChtKSA9PlxuICAgICAgICBtLnJhd0NhdGVnb3J5ID09PSByYXdDYXRlZ29yeVxuICAgICAgICAgID8geyAuLi5tLCBtYXBwZWRQYXJ0Um9sZTogbmV3Um9sZSB8fCBudWxsIH1cbiAgICAgICAgICA6IG0sXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2F2ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuICAgIHNldFNhdmluZyh0cnVlKTtcbiAgICBzZXRFcnJvcihudWxsKTtcbiAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTYXZlIGVhY2ggbWFwcGluZyBpbiBwYXJhbGxlbFxuICAgICAgY29uc3QgcmVxdWVzdHM6IFByb21pc2U8UmVzcG9uc2U+W10gPSBtYXBwaW5ncy5tYXAoKG0pID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogVXBzZXJ0UmVxdWVzdCA9IHtcbiAgICAgICAgICBtZXJjaGFudElkOiBzZWxlY3RlZE1lcmNoYW50SWQsXG4gICAgICAgICAgcmF3Q2F0ZWdvcnk6IG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgbWFwcGVkUGFydFJvbGU6IG0ubWFwcGVkUGFydFJvbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3NgLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG4gICAgICBjb25zdCBmYWlsZWQgPSByZXNwb25zZXMuZmlsdGVyKChyKSA9PiAhci5vayk7XG5cbiAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvbWUgbWFwcGluZ3MgZmFpbGVkIHRvIHNhdmUgKCR7ZmFpbGVkLmxlbmd0aH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKFwiTWFwcGluZ3Mgc2F2ZWQuIFJlLXJ1biB0aGUgaW1wb3J0IHRvIGFwcGx5IGNoYW5nZXMuXCIpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBzYXZlIG1hcHBpbmdzXCIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzZWxlY3RlZE1lcmNoYW50TmFtZSA9XG4gICAgbWVyY2hhbnRzLmZpbmQoKG0pID0+IG0uaWQgPT09IHNlbGVjdGVkTWVyY2hhbnRJZCk/Lm5hbWUgPz8gXCLigJRcIjtcblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy01eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNiBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWVuZCBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkIC8gQWRtaW5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgTWVyY2hhbnQgQ2F0ZWdvcnkgTWFwcGluZ1xuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgIE5vcm1hbGl6ZSBlYWNoIG1lcmNoYW50JmFwb3M7cyBjYXRlZ29yeSBuYW1lcyBpbnRvIHlvdXIgaW50ZXJuYWxcbiAgICAgICAgICAgICAgcGFydCByb2xlcyAodXBwZXIsIGJhcnJlbCwgaGFuZGd1YXJkLCBldGMuKS4gVW5tYXBwZWQgY2F0ZWdvcmllc1xuICAgICAgICAgICAgICB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIGltcG9ydCB1bnRpbCB0aGV5IGFyZSBtYXBwZWQgaGVyZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtemluYy00MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgTWVyY2hhbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0zIHB5LTIgdGV4dC1zbSB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkTWVyY2hhbnRJZCA/PyBcIlwifVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKFxuICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUgPyBOdW1iZXIoZS50YXJnZXQudmFsdWUpIDogbnVsbCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPuKAlCBDaG9vc2UgbWVyY2hhbnQg4oCUPC9vcHRpb24+XG4gICAgICAgICAgICAgIHttZXJjaGFudHMubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e20uaWR9IHZhbHVlPXttLmlkfT5cbiAgICAgICAgICAgICAgICAgIHttLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItcmVkLTUwMC82MCBiZy1yZWQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtcmVkLTIwMFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtzdWNjZXNzTWVzc2FnZSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgcm91bmRlZCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzYwIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtZW1lcmFsZC0yMDBcIj5cbiAgICAgICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHshc2VsZWN0ZWRNZXJjaGFudElkID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIENob29zZSBhIG1lcmNoYW50IGFib3ZlIHRvIHZpZXcgY2F0ZWdvcnkgbWFwcGluZ3MuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGxvYWRpbmdNYXBwaW5ncyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIG1hcHBpbmdzIGZvciA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj7igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbWFwcGluZ3MubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIE5vIGNhdGVnb3J5IHJvd3MgeWV0IGZvciB0aGlzIG1lcmNoYW50LiBPbmNlIHlvdSBydW4gYW4gaW1wb3J0LFxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGNhdGVnb3JpZXMgd2lsbCBhcHBlYXIgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zIHRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICBNYXBwaW5ncyBmb3J7XCIgXCJ9XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj4ue1wiIFwifVxuICAgICAgICAgICAgICAgICAgU2V0IGEgcGFydCByb2xlIGZvciBlYWNoIHJhdyBjYXRlZ29yeS4gVW5tYXBwZWQgY2F0ZWdvcmllcyB3aWxsXG4gICAgICAgICAgICAgICAgICBiZSBza2lwcGVkIGJ5IHRoZSBpbXBvcnRlci5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTMgcm91bmRlZCBib3JkZXItemluYy02MDAgYmctemluYy05MDBcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzaG93T25seVVubWFwcGVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNob3dPbmx5VW5tYXBwZWQoZS50YXJnZXQuY2hlY2tlZCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvdyBvbmx5IHVubWFwcGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtODAwIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlJhdyBDYXRlZ29yeTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB5LTIgdGV4dC1sZWZ0IHByLTRcIj5NYXBwZWQgUGFydCBSb2xlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlN0YXR1czwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7dmlzaWJsZU1hcHBpbmdzLm1hcCgobSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtOTAwIGxhc3Q6Ym9yZGVyLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC16aW5jLTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTIgcHktMSB0ZXh0LXhzIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXttLm1hcHBlZFBhcnRSb2xlID8/IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlUGFydFJvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQQVJUX1JPTEVfT1BUSU9OUy5tYXAoKG9wdCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdC52YWx1ZX0gdmFsdWU9e29wdC52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHQubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5tYXBwZWRQYXJ0Um9sZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTIgcHktMC41IHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC1lbWVyYWxkLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctemluYy03MDAvNDAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbm1hcHBlZCAvIElnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2F2ZX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzYXZpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJnLWFtYmVyLTQwMCBweC00IHB5LTIgdGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwIGRpc2FibGVkOm9wYWNpdHktNTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzYXZpbmcgPyBcIlNhdmluZ+KAplwiIDogXCJTYXZlIE1hcHBpbmdzXCJ9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZU1lbW8iLCJBUElfQkFTRV9VUkwiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX09QVElPTlMiLCJ2YWx1ZSIsImxhYmVsIiwiQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UiLCJtZXJjaGFudHMiLCJzZXRNZXJjaGFudHMiLCJzZWxlY3RlZE1lcmNoYW50SWQiLCJzZXRTZWxlY3RlZE1lcmNoYW50SWQiLCJtYXBwaW5ncyIsInNldE1hcHBpbmdzIiwibG9hZGluZ01hcHBpbmdzIiwic2V0TG9hZGluZ01hcHBpbmdzIiwic2F2aW5nIiwic2V0U2F2aW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInN1Y2Nlc3NNZXNzYWdlIiwic2V0U3VjY2Vzc01lc3NhZ2UiLCJzaG93T25seVVubWFwcGVkIiwic2V0U2hvd09ubHlVbm1hcHBlZCIsInNvcnRlZE1hcHBpbmdzIiwic29ydCIsImEiLCJiIiwiYU1hcHBlZCIsIm1hcHBlZFBhcnRSb2xlIiwiYk1hcHBlZCIsInJhd0NhdGVnb3J5IiwibG9jYWxlQ29tcGFyZSIsInZpc2libGVNYXBwaW5ncyIsImZpbHRlciIsIm0iLCJmZXRjaE1lcmNoYW50cyIsInJlcyIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibGVuZ3RoIiwiaWQiLCJlcnIiLCJjb25zb2xlIiwibWVzc2FnZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaE1hcHBpbmdzIiwidXJsIiwic2lnbmFsIiwibmFtZSIsImFib3J0IiwiaGFuZGxlQ2hhbmdlUGFydFJvbGUiLCJuZXdSb2xlIiwicHJldiIsIm1hcCIsImhhbmRsZVNhdmUiLCJyZXF1ZXN0cyIsInBheWxvYWQiLCJtZXJjaGFudElkIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzcG9uc2VzIiwiUHJvbWlzZSIsImFsbCIsImZhaWxlZCIsInIiLCJzZWxlY3RlZE1lcmNoYW50TmFtZSIsImZpbmQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaGVhZGVyIiwicCIsImgxIiwic2VsZWN0Iiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwiTnVtYmVyIiwib3B0aW9uIiwic2VjdGlvbiIsInNwYW4iLCJpbnB1dCIsInR5cGUiLCJjaGVja2VkIiwidGFibGUiLCJ0aGVhZCIsInRyIiwidGgiLCJ0Ym9keSIsInRkIiwib3B0IiwiYnV0dG9uIiwib25DbGljayIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/admin/category-mappings/page.tsx\n"); /***/ }), diff --git a/.next/server/app/gunbuilder/build/page.js b/.next/server/app/gunbuilder/build/page.js index 416a39f..18fac0e 100644 --- a/.next/server/app/gunbuilder/build/page.js +++ b/.next/server/app/gunbuilder/build/page.js @@ -148,7 +148,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES),\n/* harmony export */ PARTS: () => (/* binding */ PARTS)\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLGFBQXlCO0lBQ3BDO1FBQUVDLElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBaUI7SUFDdEM7UUFBRUQsSUFBSTtRQUFVQyxNQUFNO0lBQVM7SUFDL0I7UUFBRUQsSUFBSTtRQUFhQyxNQUFNO0lBQVk7SUFDckM7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7SUFDN0I7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7Q0FDOUIsQ0FBQztBQUVLLE1BQU1DLFFBQWdCO0lBQzNCO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgeyBpZDogXCJsb3dlclwiLCBuYW1lOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJ1cHBlclwiLCBuYW1lOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJiYXJyZWxcIiwgbmFtZTogXCJCYXJyZWxcIiB9LFxuICB7IGlkOiBcImhhbmRndWFyZFwiLCBuYW1lOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgaWQ6IFwic3RvY2tcIiwgbmFtZTogXCJTdG9ja1wiIH0sXG4gIHsgaWQ6IFwib3B0aWNcIiwgbmFtZTogXCJPcHRpY1wiIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgUEFSVFM6IFBhcnRbXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWFlcm8tbTRlMVwiLFxuICAgIG5hbWU6IFwiTTRFMSBTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJsb3dlclwiLFxuICAgIHByaWNlOiAxMjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1tNGUxXCIsXG4gICAgbm90ZXM6IFwiRm9yZ2VkIDcwNzUtVDYsIHRocmVhZGVkIGJvbHQgY2F0Y2hcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyLXNvbGd3XCIsXG4gICAgbmFtZTogXCJMb3lhbCA5IFN0cmlwcGVkIExvd2VyXCIsXG4gICAgYnJhbmQ6IFwiU29ucyBvZiBMaWJlcnR5IEd1biBXb3Jrc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTg5LjAsXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vc29sZ3ctbG93ZXJcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWFlcm8tZW5oYW5jZWRcIixcbiAgICBuYW1lOiBcIkVuaGFuY2VkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQWVybyBQcmVjaXNpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcInVwcGVyXCIsXG4gICAgcHJpY2U6IDE0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9hZXJvLWVuaGFuY2VkLXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1iY20tbTRcIixcbiAgICBuYW1lOiBcIk00IFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQkNNXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNTkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmNtLW00LXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtY3JpdGVyaW9uLTE2XCIsXG4gICAgbmFtZTogXCIxNlxcXCIgSHlicmlkIEJhcnJlbFwiLFxuICAgIGJyYW5kOiBcIkNyaXRlcmlvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiYmFycmVsXCIsXG4gICAgcHJpY2U6IDI3OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jcml0ZXJpb24tMTZcIixcbiAgICBub3RlczogXCJNaWQtbGVuZ3RoIGdhcywgY2hyb21lLWxpbmVkXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtYmEtMTMtOVwiLFxuICAgIG5hbWU6IFwiMTMuOVxcXCIgSGFuc29uIFBlcmZvcm1hbmNlIFNlcmllc1wiLFxuICAgIGJyYW5kOiBcIkJhbGxpc3RpYyBBZHZhbnRhZ2VcIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyMDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmEtMTMtOVwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctZ2Vpc3NlbGUtbWs4XCIsXG4gICAgbmFtZTogXCJNSzggUmFpbCAxMy41XFxcIlwiLFxuICAgIGJyYW5kOiBcIkdlaXNzZWxlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJoYW5kZ3VhcmRcIixcbiAgICBwcmljZTogMzI0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2dlaXNzZWxlLW1rOFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctY2VudHVyaW9uLWM0XCIsXG4gICAgbmFtZTogXCJDNCBNLUxPSyAxMlxcXCJcIixcbiAgICBicmFuZDogXCJDZW50dXJpb24gQXJtc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDI4NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jZW50dXJpb24tYzRcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrLWI1LWJyYXZvXCIsXG4gICAgbmFtZTogXCJCUkFWTyBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIkI1IFN5c3RlbXNcIixcbiAgICBjYXRlZ29yeUlkOiBcInN0b2NrXCIsXG4gICAgcHJpY2U6IDc0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2I1LWJyYXZvXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1tYWdwdWwtc2xcIixcbiAgICBuYW1lOiBcIk1PRSBTTCBDYXJiaW5lIFN0b2NrXCIsXG4gICAgYnJhbmQ6IFwiTWFncHVsXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA2OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9tYWdwdWwtc2xcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWVvdGVjaC1leHBzM1wiLFxuICAgIG5hbWU6IFwiRVhQUzMgSG9sb2dyYXBoaWMgU2lnaHRcIixcbiAgICBicmFuZDogXCJFT1RFQ0hcIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDc0OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2VvdGVjaC1leHBzM1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWMtaG9sb3N1bi01MDl0XCIsXG4gICAgbmFtZTogXCJIRTUwOVQgUmVkIERvdFwiLFxuICAgIGJyYW5kOiBcIkhvbG9zdW5cIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDM0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ob2xvc3VuLTUwOXRcIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES),\n/* harmony export */ PARTS: () => (/* binding */ PARTS)\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n// This is old and can probably be deleted\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuLy8gVGhpcyBpcyBvbGQgYW5kIGNhbiBwcm9iYWJseSBiZSBkZWxldGVkXG5leHBvcnQgY29uc3QgUEFSVFM6IFBhcnRbXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWFlcm8tbTRlMVwiLFxuICAgIG5hbWU6IFwiTTRFMSBTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJsb3dlclwiLFxuICAgIHByaWNlOiAxMjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1tNGUxXCIsXG4gICAgbm90ZXM6IFwiRm9yZ2VkIDcwNzUtVDYsIHRocmVhZGVkIGJvbHQgY2F0Y2hcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyLXNvbGd3XCIsXG4gICAgbmFtZTogXCJMb3lhbCA5IFN0cmlwcGVkIExvd2VyXCIsXG4gICAgYnJhbmQ6IFwiU29ucyBvZiBMaWJlcnR5IEd1biBXb3Jrc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTg5LjAsXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vc29sZ3ctbG93ZXJcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWFlcm8tZW5oYW5jZWRcIixcbiAgICBuYW1lOiBcIkVuaGFuY2VkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQWVybyBQcmVjaXNpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcInVwcGVyXCIsXG4gICAgcHJpY2U6IDE0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9hZXJvLWVuaGFuY2VkLXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1iY20tbTRcIixcbiAgICBuYW1lOiBcIk00IFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQkNNXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNTkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmNtLW00LXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtY3JpdGVyaW9uLTE2XCIsXG4gICAgbmFtZTogXCIxNlxcXCIgSHlicmlkIEJhcnJlbFwiLFxuICAgIGJyYW5kOiBcIkNyaXRlcmlvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiYmFycmVsXCIsXG4gICAgcHJpY2U6IDI3OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jcml0ZXJpb24tMTZcIixcbiAgICBub3RlczogXCJNaWQtbGVuZ3RoIGdhcywgY2hyb21lLWxpbmVkXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtYmEtMTMtOVwiLFxuICAgIG5hbWU6IFwiMTMuOVxcXCIgSGFuc29uIFBlcmZvcm1hbmNlIFNlcmllc1wiLFxuICAgIGJyYW5kOiBcIkJhbGxpc3RpYyBBZHZhbnRhZ2VcIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyMDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmEtMTMtOVwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctZ2Vpc3NlbGUtbWs4XCIsXG4gICAgbmFtZTogXCJNSzggUmFpbCAxMy41XFxcIlwiLFxuICAgIGJyYW5kOiBcIkdlaXNzZWxlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJoYW5kZ3VhcmRcIixcbiAgICBwcmljZTogMzI0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2dlaXNzZWxlLW1rOFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctY2VudHVyaW9uLWM0XCIsXG4gICAgbmFtZTogXCJDNCBNLUxPSyAxMlxcXCJcIixcbiAgICBicmFuZDogXCJDZW50dXJpb24gQXJtc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDI4NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jZW50dXJpb24tYzRcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrLWI1LWJyYXZvXCIsXG4gICAgbmFtZTogXCJCUkFWTyBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIkI1IFN5c3RlbXNcIixcbiAgICBjYXRlZ29yeUlkOiBcInN0b2NrXCIsXG4gICAgcHJpY2U6IDc0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2I1LWJyYXZvXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1tYWdwdWwtc2xcIixcbiAgICBuYW1lOiBcIk1PRSBTTCBDYXJiaW5lIFN0b2NrXCIsXG4gICAgYnJhbmQ6IFwiTWFncHVsXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA2OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9tYWdwdWwtc2xcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWVvdGVjaC1leHBzM1wiLFxuICAgIG5hbWU6IFwiRVhQUzMgSG9sb2dyYXBoaWMgU2lnaHRcIixcbiAgICBicmFuZDogXCJFT1RFQ0hcIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDc0OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2VvdGVjaC1leHBzM1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWMtaG9sb3N1bi01MDl0XCIsXG4gICAgbmFtZTogXCJIRTUwOVQgUmVkIERvdFwiLFxuICAgIGJyYW5kOiBcIkhvbG9zdW5cIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDM0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ob2xvc3VuLTUwOXRcIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiUEFSVFMiLCJicmFuZCIsImNhdGVnb3J5SWQiLCJwcmljZSIsImFmZmlsaWF0ZVVybCIsIm5vdGVzIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); /***/ }), diff --git a/.next/server/app/gunbuilder/page.js b/.next/server/app/gunbuilder/page.js index 065be4e..7c4267f 100644 --- a/.next/server/app/gunbuilder/page.js +++ b/.next/server/app/gunbuilder/page.js @@ -137,7 +137,7 @@ eval("Promise.resolve(/*! import() eager */).then(__webpack_require__.t.bind(__w /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GunbuilderPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(ssr)/./components/CategoryColumn.tsx\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts and core controls.\",\n categoryIds: [\n \"lower\",\n \"lowerParts\",\n \"stock\",\n \"buffer\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, handguard, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"barrel\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n return {};\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`${API_BASE_URL}/api/products/gunbuilder?platform=AR-15`, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (false) {}\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map(([categoryId, partId])=>parts.find((p)=>p.id === partId && p.categoryId === categoryId)).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 226,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 222,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 231,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 221,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 220,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 240,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 244,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 243,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 246,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 239,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 256,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 254,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 238,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 295,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 299,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 294,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 293,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 312,\n columnNumber: 29\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 27\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 306,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 281,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 268,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 338,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 356,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 362,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 361,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 367,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 372,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 355,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 343,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: `block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors ${selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"}`,\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (false) {}\n },\n disabled: selectedParts.length === 0,\n className: `w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors ${selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"}`,\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 394,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 411,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 383,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 266,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 424,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 429,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 433,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 423,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 419,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 442,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 446,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 449,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 450,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 445,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 441,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 236,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 219,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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a0RBSUosOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBUVIsOERBQUNWO3dCQUFRUCxXQUFVOzswQ0FDakIsOERBQUNVO2dDQUFHVixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ2M7Z0NBQUdkLFdBQVU7O2tEQUNaLDhEQUFDaUI7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1oQiIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5Q29sdW1uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtblwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbi8vIE1hcCBiYWNrZW5kIHBhcnRSb2xlIHRvIHlvdXIgZXhpc3RpbmcgQ2F0ZWdvcnlJZCB2YWx1ZXMuXG5jb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0ge1xuICBcInVwcGVyLXJlY2VpdmVyXCI6IFwidXBwZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBiYXJyZWw6IFwiYmFycmVsXCIgYXMgQ2F0ZWdvcnlJZCxcbiAgaGFuZGd1YXJkOiBcImhhbmRndWFyZFwiIGFzIENhdGVnb3J5SWQsXG4gIFwiY2hhcmdpbmctaGFuZGxlXCI6IFwiY2hhcmdpbmdIYW5kbGVcIiBhcyBDYXRlZ29yeUlkLFxuICBcImJ1ZmZlci1raXRcIjogXCJidWZmZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBcImxvd2VyLXBhcnRzLWtpdFwiOiBcImxvd2VyUGFydHNcIiBhcyBDYXRlZ29yeUlkLFxuICBzaWdodDogXCJzaWdodHNcIiBhcyBDYXRlZ29yeUlkLFxuICBcImxvd2VyLXJlY2VpdmVyXCI6IFwibG93ZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBvcHRpYzogXCJvcHRpY1wiIGFzIENhdGVnb3J5SWQsXG4gIHN0b2NrOiBcInN0b2NrXCIgYXMgQ2F0ZWdvcnlJZCxcbn07XG5cbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+OyAvLyBjYXRlZ29yeUlkIC0+IHBhcnRJZFxuXG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG4vLyBHcm91cCBjYXRlZ29yaWVzIGludG8gbG9naWNhbCBzZWN0aW9ucy5cbi8vXG4vLyBJTVBPUlRBTlQ6XG4vLyBUaGVzZSBJRHMgbXVzdCBtYXRjaCB0aGUgaWRzIHlvdSBoYXZlIGluIENBVEVHT1JJRVMuXG4vLyBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3Qgd2lsbCBqdXN0IGJlIHNraXBwZWQuXG5jb25zdCBDQVRFR09SWV9HUk9VUFM6IHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNhdGVnb3J5SWRzOiBDYXRlZ29yeUlkW107XG59W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV2ZXJ5dGhpbmcgZnJvbSB0aGUgc2VyaWFsaXplZCBsb3dlciB0byBzbWFsbCBwYXJ0cyBhbmQgY29yZSBjb250cm9scy5cIixcbiAgICBjYXRlZ29yeUlkczogW1wibG93ZXJcIiwgXCJsb3dlclBhcnRzXCIsIFwic3RvY2tcIiwgXCJidWZmZXJcIl0gYXMgQ2F0ZWdvcnlJZFtdLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJVcHBlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCYXJyZWwsIHVwcGVyLCBoYW5kZ3VhcmQsIGFuZCB0aGUgcGFydHMgdGhhdCBrZWVwIHRoZSByaWZsZSBjeWNsaW5nLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcInVwcGVyXCIsXG4gICAgICBcImJhcnJlbFwiLFxuICAgICAgXCJoYW5kZ3VhcmRcIixcbiAgICAgIFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICAgIFwic2lnaHRzXCIsXG4gICAgICBcIm9wdGljXCIsXG4gICAgXSBhcyBDYXRlZ29yeUlkW10sXG4gIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHdW5idWlsZGVyUGFnZSgpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXNlU2VhcmNoUGFyYW1zKCk7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaFByb2R1Y3RzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlcj9wbGF0Zm9ybT1BUi0xNWAsXG4gICAgICAgICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGFcbiAgICAgICAgICAubWFwKChwKTogUGFydCB8IG51bGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZCA9IFBBUlRfUk9MRV9UT19DQVRFR09SWVtwLnBhcnRSb2xlXTtcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAvLyBTa2lwIGFueSBwYXJ0cyB3ZSBkb24ndCBrbm93IGhvdyB0byBtYXAgeWV0XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpZDogU3RyaW5nKHAuaWQpLCAvLyBBTFdBWVMgc3RyaW5nXG4gICAgICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIFBhcnQgPT4gcCAhPT0gbnVsbCk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaFByb2R1Y3RzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSGFuZGxlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgZm9yIHBhcnQgc2VsZWN0aW9uICg/c2VsZWN0PXVwcGVyOjE2NSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RQYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJzZWxlY3RcIik7XG4gICAgaWYgKHNlbGVjdFBhcmFtKSB7XG4gICAgICBjb25zdCBbY2F0ZWdvcnlJZCwgcGFydElkXSA9IHNlbGVjdFBhcmFtLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjYXRlZ29yeUlkICYmIHBhcnRJZCAmJiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpKSB7XG4gICAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBbY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZXIucmVwbGFjZShcIi9ndW5idWlsZGVyXCIsIHsgc2Nyb2xsOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzZWFyY2hQYXJhbXMsIHJvdXRlcl0pO1xuXG4gIC8vIFBlcnNpc3QgYnVpbGQgc3RhdGUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICBjb25zdCBwYXJ0c0J5Q2F0ZWdvcnk6IFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBlZCA9IHt9IGFzIFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+O1xuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgQ0FURUdPUklFUykge1xuICAgICAgZ3JvdXBlZFtjYXRlZ29yeS5pZF0gPSBwYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwKSA9PiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5LmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwZWQ7XG4gIH0sIFtwYXJ0c10pO1xuXG4gIGNvbnN0IHNlbGVjdGVkUGFydHM6IFBhcnRbXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZClcbiAgICAgIC5tYXAoKFtjYXRlZ29yeUlkLCBwYXJ0SWRdKSA9PlxuICAgICAgICBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBwYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeUlkKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgUGFydFtdO1xuICB9LCBbYnVpbGQsIHBhcnRzXSk7XG5cbiAgY29uc3QgdG90YWxQcmljZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gc2VsZWN0ZWRQYXJ0cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5wcmljZSwgMCksXG4gICAgW3NlbGVjdGVkUGFydHNdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gVXNlIGdyb3VwIG9yZGVyaW5nIGZvciB0aGUgc3VtbWFyeSBhcyB3ZWxsXG4gIGNvbnN0IHN1bW1hcnlDYXRlZ29yeU9yZGVyOiBDYXRlZ29yeUlkW10gPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBDQVRFR09SWV9HUk9VUFMuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLmNhdGVnb3J5SWRzKS5maWx0ZXIoXG4gICAgICAgIChpZCkgPT4gQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBpZCksXG4gICAgICApLFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYW1iZXItNTAwLzIwIGJnLWFtYmVyLTUwMC81XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBmbGV4IG1heC13LTZ4bCBmbGV4LWNvbCBnYXAtMSBweC00IHB5LTIgdGV4dC1bMC43NXJlbV0gdGV4dC1hbWJlci0xMDAgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJvdW5kZWQtc20gYmctYW1iZXItNTAwLzIwIHB4LTIgcHktMC41IHRleHQtWzAuNjVyZW1dIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE4ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIEVhcmx5IEFjY2VzcyBCZXRhXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gdGV4dC1hbWJlci0xMDAvOTAgbWQ6aW5saW5lXCI+XG4gICAgICAgICAgICAgIFlvdSZhcG9zO3JlIHVzaW5nIGFuIGVhcmx5LWFjY2VzcyBwcm90b3R5cGUgb2YgVGhlIEFybW9yeS4gRGF0YSxcbiAgICAgICAgICAgICAgcHJpY2luZywgYW5kIGF2YWlsYWJsZSBwYXJ0cyBhcmUgc3RpbGwgZXZvbHZpbmcuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0xMDAvOTAgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICBFYXJseS1hY2Nlc3MgcHJvdG90eXBlLiBEYXRhIGFuZCBwcmljaW5nIG1heSBjaGFuZ2UuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgVGhlIEFybW9yeTogPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5FYXJseSBBY2Nlc3M8L3NwYW4+XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgRXhwbG9yZSBjb21wb25lbnRzIGZyb20gdHJ1c3RlZCBicmFuZHMsIGNob29zZSBvbmUgcGFydCBwZXJcbiAgICAgICAgICAgICAgY2F0ZWdvcnksIHRyYWNrIGxpdmUgcHJpY2VzLCBhbmQgd2F0Y2ggeW91ciB0b3RhbCBidWlsZCBjb3N0XG4gICAgICAgICAgICAgIHVwZGF0ZSBhcyB5b3UgZ28uIFRoaXMgZWFybHktYWNjZXNzIGJ1aWxkZXIga2VlcHMgeW91ciBzZXR1cCBzYXZlZFxuICAgICAgICAgICAgICBsb2NhbGx5IHNvIHlvdSBjYW4gY29tZSBiYWNrIGFuZCByZWZpbmUgaXQgYW55dGltZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMyBtZDptdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMFwiPkN1cnJlbnQgYnVpbGQgdG90YWw8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICAke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RofSAvIHtDQVRFR09SSUVTLmxlbmd0aH0gY2F0ZWdvcmllcyBmaWxsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogTGF5b3V0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbGc6Z3JpZC1jb2xzLVszZnIsMS4yNWZyXVwiPlxuICAgICAgICAgIHsvKiBDYXRlZ29yaWVzL3BhcnRzICovfVxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgICB7bG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIExvYWRpbmcgcGFydHMgZnJvbSBiYWNrZW5k4oCmXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7ZXJyb3IgJiYgIWxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMFwiPlxuICAgICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZyBhbmQgQ09SUyBpc1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAgICB7Q0FURUdPUllfR1JPVVBTLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2F0ZWdvcmllcyA9IENBVEVHT1JJRVMuZmlsdGVyKChjKSA9PlxuICAgICAgICAgICAgICAgICAgICBncm91cC5jYXRlZ29yeUlkcy5pbmNsdWRlcyhjLmlkIGFzIENhdGVnb3J5SWQpLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtncm91cC5pZH0gY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGp1c3RpZnktYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMCBtdC0xIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0yIG1kOnAtMyBiZy16aW5jLTk1MC82MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXtjYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0SWQ9e2J1aWxkW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0UGFydD17KHBhcnRJZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIHsvKiBCdWlsZCBTdW1tYXJ5ICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBWaWV3IHlvdXIgYnVpbGQgYnJlYWtkb3duIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkNhdGVnb3J5Q29sdW1uIiwiQVBJX0JBU0VfVVJMIiwicHJvY2VzcyIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsImJhcnJlbCIsImhhbmRndWFyZCIsInNpZ2h0Iiwib3B0aWMiLCJzdG9jayIsIlNUT1JBR0VfS0VZIiwiQ0FURUdPUllfR1JPVVBTIiwiaWQiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwiY2F0ZWdvcnlJZHMiLCJHdW5idWlsZGVyUGFnZSIsInNlYXJjaFBhcmFtcyIsInJvdXRlciIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaFByb2R1Y3RzIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsImNhdGVnb3J5SWQiLCJwYXJ0Um9sZSIsIlN0cmluZyIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJ1cmwiLCJidXlVcmwiLCJub3RlcyIsImZpbHRlciIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNlbGVjdFBhcmFtIiwiZ2V0IiwicGFydElkIiwic3BsaXQiLCJzb21lIiwiYyIsInByZXYiLCJ1cGRhdGVkIiwic2V0SXRlbSIsInN0cmluZ2lmeSIsInJlcGxhY2UiLCJzY3JvbGwiLCJwYXJ0c0J5Q2F0ZWdvcnkiLCJncm91cGVkIiwiY2F0ZWdvcnkiLCJzZWxlY3RlZFBhcnRzIiwiT2JqZWN0IiwiZW50cmllcyIsImZpbmQiLCJCb29sZWFuIiwidG90YWxQcmljZSIsInJlZHVjZSIsInN1bSIsImhhbmRsZVNlbGVjdFBhcnQiLCJzdW1tYXJ5Q2F0ZWdvcnlPcmRlciIsImZsYXRNYXAiLCJncm91cCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJzcGFuIiwiaGVhZGVyIiwiaDEiLCJ0b0ZpeGVkIiwibGVuZ3RoIiwic2VjdGlvbiIsImdyb3VwQ2F0ZWdvcmllcyIsImluY2x1ZGVzIiwiaDIiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImFzaWRlIiwidWwiLCJjYXQiLCJwYXJ0IiwibGkiLCJocmVmIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJyZW1vdmVJdGVtIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/page.tsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ GunbuilderPage)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(ssr)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(ssr)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(ssr)/./components/CategoryColumn.tsx\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(ssr)/./data/partRoleMappings.ts\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \n\n\n\n\n\n\nconst API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n return {};\n });\n const [layoutMode, setLayoutMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"cards\");\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(`${API_BASE_URL}/api/products/gunbuilder?platform=AR-15`, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(`Failed to load products (${res.status})`);\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__.PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: p.price ?? 0,\n imageUrl: p.mainImageUrl ?? undefined,\n url: p.buyUrl ?? undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n setError(err.message ?? \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (false) {}\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map(([categoryId, partId])=>parts.find((p)=>p.id === partId && p.categoryId === categoryId)).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 227,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 230,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 226,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 235,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 225,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 224,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 248,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 247,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 250,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 243,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 260,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"Choose one part per category. Switch layouts to browse by cards or a tighter list view.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"inline-flex items-center rounded-md border border-zinc-700 bg-zinc-900/70 text-[0.7rem]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"cards\"),\n className: `px-2.5 py-1 rounded-l-md border-r border-zinc-700 transition-colors ${layoutMode === \"cards\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"}`,\n children: \"Card view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"list\"),\n className: `px-2.5 py-1 rounded-r-md transition-colors ${layoutMode === \"list\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"}`,\n children: \"List view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 289,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 277,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 273,\n columnNumber: 13\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 303,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 328,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 327,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 326,\n columnNumber: 23\n }, this),\n layoutMode === \"cards\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 346,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 342,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 340,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60 flex flex-col md:flex-row md:items-start md:justify-between gap-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 364,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 358,\n columnNumber: 25\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 325,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 314,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 415,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 414,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 413,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 396,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: `block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors ${selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"}`,\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 437,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (false) {}\n },\n disabled: selectedParts.length === 0,\n className: `w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors ${selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"}`,\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 464,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 436,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 473,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 478,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 482,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 486,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 476,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 472,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 495,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 499,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 500,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 501,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 502,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 503,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 498,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 494,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 240,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 223,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUNnQztBQUNUO0FBRVM7QUFDRztBQWFoRSxNQUFNUyxlQUNKQyxRQUFRQyxHQUFHLENBQUNDLHdCQUF3QixJQUFJO0FBSzFDLE1BQU1DLGNBQWM7QUFFcEIsMENBQTBDO0FBQzFDLEVBQUU7QUFDRixhQUFhO0FBQ2IsdURBQXVEO0FBQ3ZELG9EQUFvRDtBQUNwRCxNQUFNQyxrQkFLQTtJQUNKO1FBQ0VDLElBQUk7UUFDSkMsT0FBTztRQUNQQyxhQUNFO1FBQ0ZDLGFBQWE7WUFDWDtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1NBQ0Q7SUFDSDtJQUNBO1FBQ0VILElBQUk7UUFDSkMsT0FBTztRQUNQQyxhQUNFO1FBQ0ZDLGFBQWE7WUFDWDtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0NBQ0Q7QUFFYyxTQUFTQztJQUN0QixNQUFNQyxlQUFlaEIsZ0VBQWVBO0lBQ3BDLE1BQU1pQixTQUFTaEIsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR3RCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDdUIsU0FBU0MsV0FBVyxHQUFHeEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDeUIsT0FBT0MsU0FBUyxHQUFHMUIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQzJCLE9BQU9DLFNBQVMsR0FBRzVCLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksS0FBNkIsRUFBRSxFQVNsQztRQUNELE9BQU8sQ0FBQztJQUNWO0lBQ0EsTUFBTSxDQUFDa0MsWUFBWUMsY0FBYyxHQUFHbkMsK0NBQVFBLENBQW1CO0lBRS9EQyxnREFBU0EsQ0FBQztRQUNSLE1BQU1tQyxhQUFhLElBQUlDO1FBRXZCLGVBQWVDO1lBQ2IsSUFBSTtnQkFDRmQsV0FBVztnQkFDWEUsU0FBUztnQkFFVCxNQUFNYSxNQUFNLE1BQU1DLE1BQ2hCLENBQUMsRUFBRWhDLGFBQWEsdUNBQXVDLENBQUMsRUFDeEQ7b0JBQUVpQyxRQUFRTCxXQUFXSyxNQUFNO2dCQUFDO2dCQUc5QixJQUFJLENBQUNGLElBQUlHLEVBQUUsRUFBRTtvQkFDWCxNQUFNLElBQUlDLE1BQU0sQ0FBQyx5QkFBeUIsRUFBRUosSUFBSUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDM0Q7Z0JBRUEsTUFBTUMsT0FBbUMsTUFBTU4sSUFBSU8sSUFBSTtnQkFFdkQsTUFBTUMsYUFBcUJGLEtBQ3hCRyxHQUFHLENBQUMsQ0FBQ0M7b0JBQ0osTUFBTUMsYUFBYTNDLHlFQUFxQixDQUFDMEMsRUFBRUUsUUFBUSxDQUFDO29CQUNwRCxJQUFJLENBQUNELFlBQVk7d0JBQ2YsOENBQThDO3dCQUM5QyxPQUFPO29CQUNUO29CQUVBLE9BQU87d0JBQ0xwQyxJQUFJc0MsT0FBT0gsRUFBRW5DLEVBQUU7d0JBQ2ZvQzt3QkFDQUcsTUFBTUosRUFBRUksSUFBSTt3QkFDWkMsT0FBT0wsRUFBRUssS0FBSzt3QkFDZEMsT0FBT04sRUFBRU0sS0FBSyxJQUFJO3dCQUNsQkMsVUFBVVAsRUFBRVEsWUFBWSxJQUFJQzt3QkFDNUJDLEtBQUtWLEVBQUVXLE1BQU0sSUFBSUY7d0JBQ2pCRyxPQUFPSDtvQkFDVDtnQkFDRixHQUNDSSxNQUFNLENBQUMsQ0FBQ2IsSUFBaUJBLE1BQU07Z0JBRWxDM0IsU0FBU3lCO1lBQ1gsRUFBRSxPQUFPZ0IsS0FBVTtnQkFDakIsSUFBSUEsSUFBSVYsSUFBSSxLQUFLLGNBQWM7Z0JBQy9CM0IsU0FBU3FDLElBQUlDLE9BQU8sSUFBSTtZQUMxQixTQUFVO2dCQUNSeEMsV0FBVztZQUNiO1FBQ0Y7UUFFQWM7UUFFQSxPQUFPLElBQU1GLFdBQVc2QixLQUFLO0lBQy9CLEdBQUcsRUFBRTtJQUVMLG9FQUFvRTtJQUNwRWhFLGdEQUFTQSxDQUFDO1FBQ1IsTUFBTWlFLGNBQWMvQyxhQUFhZ0QsR0FBRyxDQUFDO1FBQ3JDLElBQUlELGFBQWE7WUFDZixNQUFNLENBQUNoQixZQUFZa0IsT0FBTyxHQUFHRixZQUFZRyxLQUFLLENBQUM7WUFDL0MsSUFBSW5CLGNBQWNrQixVQUFVL0QsNkRBQVVBLENBQUNpRSxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRXpELEVBQUUsS0FBS29DLGFBQWE7Z0JBQ3ZFdEIsU0FBUyxDQUFDNEM7b0JBQ1IsTUFBTUMsVUFBVTt3QkFDZCxHQUFHRCxJQUFJO3dCQUNQLENBQUN0QixXQUF5QixFQUFFa0I7b0JBQzlCO29CQUNBLElBQUksS0FBNkIsRUFBRSxFQUVsQztvQkFDRCxPQUFPSztnQkFDVDtnQkFFQXJELE9BQU93RCxPQUFPLENBQUMsZUFBZTtvQkFBRUMsUUFBUTtnQkFBTTtZQUNoRDtRQUNGO0lBQ0YsR0FBRztRQUFDMUQ7UUFBY0M7S0FBTztJQUV6QiwwREFBMEQ7SUFDMURuQixnREFBU0EsQ0FBQztRQUNSLElBQUksS0FBNkIsRUFBRSxFQUVsQztJQUNILEdBQUc7UUFBQzBCO0tBQU07SUFFVixNQUFNbUQsa0JBQThDL0UsOENBQU9BLENBQUM7UUFDMUQsTUFBTWdGLFVBQVUsQ0FBQztRQUNqQixLQUFLLE1BQU1DLFlBQVkzRSw2REFBVUEsQ0FBRTtZQUNqQzBFLE9BQU8sQ0FBQ0MsU0FBU2xFLEVBQUUsQ0FBQyxHQUFHTyxNQUFNeUMsTUFBTSxDQUNqQyxDQUFDYixJQUFNQSxFQUFFQyxVQUFVLEtBQUs4QixTQUFTbEUsRUFBRTtRQUV2QztRQUNBLE9BQU9pRTtJQUNULEdBQUc7UUFBQzFEO0tBQU07SUFFVixNQUFNNEQsZ0JBQXdCbEYsOENBQU9BLENBQUM7UUFDcEMsT0FBT21GLE9BQU9DLE9BQU8sQ0FBQ3hELE9BQ25CcUIsR0FBRyxDQUFDLENBQUMsQ0FBQ0UsWUFBWWtCLE9BQU8sR0FDeEIvQyxNQUFNK0QsSUFBSSxDQUFDLENBQUNuQyxJQUFNQSxFQUFFbkMsRUFBRSxLQUFLc0QsVUFBVW5CLEVBQUVDLFVBQVUsS0FBS0EsYUFFdkRZLE1BQU0sQ0FBQ3VCO0lBQ1osR0FBRztRQUFDMUQ7UUFBT047S0FBTTtJQUVqQixNQUFNaUUsYUFBYXZGLDhDQUFPQSxDQUN4QixJQUFNa0YsY0FBY00sTUFBTSxDQUFDLENBQUNDLEtBQUt2QyxJQUFNdUMsTUFBTXZDLEVBQUVNLEtBQUssRUFBRSxJQUN0RDtRQUFDMEI7S0FBYztJQUdqQixNQUFNUSxtQkFBbUIsQ0FBQ3ZDLFlBQXdCa0I7UUFDaER4QyxTQUFTLENBQUM0QyxPQUFVO2dCQUNsQixHQUFHQSxJQUFJO2dCQUNQLENBQUN0QixXQUFXLEVBQUVrQjtZQUNoQjtJQUNGO0lBRUEsNkNBQTZDO0lBQzdDLE1BQU1zQix1QkFBcUMzRiw4Q0FBT0EsQ0FDaEQsSUFDRWMsZ0JBQWdCOEUsT0FBTyxDQUFDLENBQUNDLFFBQVVBLE1BQU0zRSxXQUFXLEVBQUU2QyxNQUFNLENBQzFELENBQUNoRCxLQUFPVCw2REFBVUEsQ0FBQ2lFLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFekQsRUFBRSxLQUFLQSxNQUU1QyxFQUFFO0lBR0oscUJBQ0UsOERBQUMrRTtRQUFLQyxXQUFVOzswQkFDZCw4REFBQ0M7Z0JBQUlELFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFJRCxXQUFVOztzQ0FDYiw4REFBQ0M7NEJBQUlELFdBQVU7OzhDQUNiLDhEQUFDRTtvQ0FBS0YsV0FBVTs4Q0FBaUg7Ozs7Ozs4Q0FHakksOERBQUNFO29DQUFLRixXQUFVOzhDQUFxQzs7Ozs7Ozs7Ozs7O3NDQUt2RCw4REFBQ0U7NEJBQUtGLFdBQVU7c0NBQThCOzs7Ozs7Ozs7Ozs7Ozs7OzswQkFLbEQsOERBQUNDO2dCQUFJRCxXQUFVOztrQ0FFYiw4REFBQ0c7d0JBQU9ILFdBQVU7OzBDQUNoQiw4REFBQ0M7O2tEQUNDLDhEQUFDOUM7d0NBQUU2QyxXQUFVO2tEQUFpRTs7Ozs7O2tEQUc5RSw4REFBQ0k7d0NBQUdKLFdBQVU7OzRDQUF5RDswREFDekQsOERBQUNFO2dEQUFLRixXQUFVOzBEQUFpQjs7Ozs7Ozs7Ozs7O2tEQUUvQyw4REFBQzdDO3dDQUFFNkMsV0FBVTtrREFBc0M7Ozs7Ozs7Ozs7OzswQ0FRckQsOERBQUNDO2dDQUFJRCxXQUFVOztrREFDYiw4REFBQ0M7d0NBQUlELFdBQVU7a0RBQXdCOzs7Ozs7a0RBQ3ZDLDhEQUFDQzt3Q0FBSUQsV0FBVTs7NENBQXdDOzRDQUNuRFIsV0FBV2EsT0FBTyxDQUFDOzs7Ozs7O2tEQUV2Qiw4REFBQ0o7d0NBQUlELFdBQVU7OzRDQUNaYixjQUFjbUIsTUFBTTs0Q0FBQzs0Q0FBSS9GLDZEQUFVQSxDQUFDK0YsTUFBTTs0Q0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FNbEQsOERBQUNMO3dCQUFJRCxXQUFVOzswQ0FFYiw4REFBQ087Z0NBQVFQLFdBQVU7O2tEQUNqQiw4REFBQ0M7d0NBQUlELFdBQVU7OzBEQUNiLDhEQUFDN0M7Z0RBQUU2QyxXQUFVOzBEQUF3Qjs7Ozs7OzBEQUdyQyw4REFBQ0M7Z0RBQUlELFdBQVU7O2tFQUNiLDhEQUFDUTt3REFDQ0MsTUFBSzt3REFDTEMsU0FBUyxJQUFNckUsY0FBYzt3REFDN0IyRCxXQUFXLENBQUMsb0VBQW9FLEVBQzlFNUQsZUFBZSxVQUNYLG1DQUNBLGtDQUNMLENBQUM7a0VBQ0g7Ozs7OztrRUFHRCw4REFBQ29FO3dEQUNDQyxNQUFLO3dEQUNMQyxTQUFTLElBQU1yRSxjQUFjO3dEQUM3QjJELFdBQVcsQ0FBQywyQ0FBMkMsRUFDckQ1RCxlQUFlLFNBQ1gsbUNBQ0Esa0NBQ0wsQ0FBQztrRUFDSDs7Ozs7Ozs7Ozs7Ozs7Ozs7O29DQUtKWCx5QkFDQyw4REFBQzBCO3dDQUFFNkMsV0FBVTtrREFBd0I7Ozs7OztvQ0FJdENyRSxTQUFTLENBQUNGLHlCQUNULDhEQUFDMEI7d0NBQUU2QyxXQUFVOzs0Q0FDVnJFOzRDQUFNOzs7Ozs7O29DQUlWLENBQUNGLFdBQVcsQ0FBQ0UsdUJBQ1osOERBQUNzRTt3Q0FBSUQsV0FBVTtrREFDWmpGLGdCQUFnQm1DLEdBQUcsQ0FBQyxDQUFDNEM7NENBQ3BCLE1BQU1hLGtCQUFrQnBHLDZEQUFVQSxDQUFDeUQsTUFBTSxDQUFDLENBQUNTLElBQ3pDcUIsTUFBTTNFLFdBQVcsQ0FBQ3lGLFFBQVEsQ0FBQ25DLEVBQUV6RCxFQUFFOzRDQUdqQyxJQUFJMkYsZ0JBQWdCTCxNQUFNLEtBQUssR0FBRztnREFDaEMsT0FBTzs0Q0FDVDs0Q0FFQSxxQkFDRSw4REFBQ0w7Z0RBQW1CRCxXQUFVOztrRUFDNUIsOERBQUNDO3dEQUFJRCxXQUFVO2tFQUNiLDRFQUFDQzs7OEVBQ0MsOERBQUNZO29FQUFHYixXQUFVOzhFQUNYRixNQUFNN0UsS0FBSzs7Ozs7O2dFQUViNkUsTUFBTTVFLFdBQVcsa0JBQ2hCLDhEQUFDaUM7b0VBQUU2QyxXQUFVOzhFQUNWRixNQUFNNUUsV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7b0RBTXpCa0IsZUFBZSx3QkFDZCw4REFBQzZEO3dEQUFJRCxXQUFVO2tFQUNaVyxnQkFBZ0J6RCxHQUFHLENBQUMsQ0FBQ2dDLHlCQUNwQiw4REFBQ2U7Z0VBRUNELFdBQVU7MEVBRVYsNEVBQUN4RixzRUFBY0E7b0VBQ2IwRSxVQUFVQTtvRUFDVjNELE9BQU95RCxlQUFlLENBQUNFLFNBQVNsRSxFQUFFLENBQUM7b0VBQ25DOEYsZ0JBQWdCakYsS0FBSyxDQUFDcUQsU0FBU2xFLEVBQUUsQ0FBQztvRUFDbEMrRixjQUFjLENBQUN6QyxTQUNicUIsaUJBQWlCVCxTQUFTbEUsRUFBRSxFQUFFc0Q7Ozs7OzsrREFSN0JZLFNBQVNsRSxFQUFFOzs7Ozs7Ozs7NkVBZXRCLDhEQUFDaUY7d0RBQUlELFdBQVU7a0VBQ1pXLGdCQUFnQnpELEdBQUcsQ0FBQyxDQUFDZ0MseUJBQ3BCLDhEQUFDZTtnRUFFQ0QsV0FBVTswRUFFViw0RUFBQ3hGLHNFQUFjQTtvRUFDYjBFLFVBQVVBO29FQUNWM0QsT0FBT3lELGVBQWUsQ0FBQ0UsU0FBU2xFLEVBQUUsQ0FBQztvRUFDbkM4RixnQkFBZ0JqRixLQUFLLENBQUNxRCxTQUFTbEUsRUFBRSxDQUFDO29FQUNsQytGLGNBQWMsQ0FBQ3pDLFNBQ2JxQixpQkFBaUJULFNBQVNsRSxFQUFFLEVBQUVzRDs7Ozs7OytEQVI3QlksU0FBU2xFLEVBQUU7Ozs7Ozs7Ozs7OytDQXBDaEI4RSxNQUFNOUUsRUFBRTs7Ozs7d0NBcUR0Qjs7Ozs7Ozs7Ozs7OzBDQU1OLDhEQUFDZ0c7Z0NBQU1oQixXQUFVOztrREFDZiw4REFBQ2E7d0NBQUdiLFdBQVU7a0RBQXVFOzs7Ozs7a0RBSXJGLDhEQUFDQzt3Q0FBSUQsV0FBVTs7NENBQ1piLGNBQWNtQixNQUFNLEtBQUssbUJBQ3hCLDhEQUFDbkQ7Z0RBQUU2QyxXQUFVOzBEQUF3Qjs7Ozs7OzBEQUt2Qyw4REFBQ2lCO2dEQUFHakIsV0FBVTswREFDWEoscUJBQXFCMUMsR0FBRyxDQUFDLENBQUNFO29EQUN6QixNQUFNOEQsTUFBTTNHLDZEQUFVQSxDQUFDK0UsSUFBSSxDQUFDLENBQUNiLElBQU1BLEVBQUV6RCxFQUFFLEtBQUtvQztvREFDNUMsSUFBSSxDQUFDOEQsS0FBSyxPQUFPO29EQUVqQixNQUFNSixpQkFBaUJqRixLQUFLLENBQUNxRixJQUFJbEcsRUFBRSxDQUFDO29EQUNwQyxNQUFNbUcsT0FBTzVGLE1BQU0rRCxJQUFJLENBQ3JCLENBQUNuQyxJQUNDQSxFQUFFbkMsRUFBRSxLQUFLOEYsa0JBQWtCM0QsRUFBRUMsVUFBVSxLQUFLOEQsSUFBSWxHLEVBQUU7b0RBR3RELHFCQUNFLDhEQUFDb0c7OzBFQUNDLDhEQUFDbkI7Z0VBQUlELFdBQVU7MEVBQ1prQixJQUFJM0QsSUFBSTs7Ozs7OzREQUVWNEQscUJBQ0MsOERBQUNsQjtnRUFBSUQsV0FBVTs7a0ZBQ2IsOERBQUNDO3dFQUFJRCxXQUFVOzswRkFDYiw4REFBQ0U7Z0ZBQUtGLFdBQVU7O29GQUNibUIsS0FBSzNELEtBQUs7b0ZBQUU7Ozs7Ozs7NEVBRWQyRCxLQUFLNUQsSUFBSTs7Ozs7OztrRkFFWiw4REFBQzBDO3dFQUFJRCxXQUFVOzs0RUFBeUQ7NEVBQ3BFbUIsS0FBSzFELEtBQUssQ0FBQzRDLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7O3FGQUl6Qiw4REFBQ0o7Z0VBQUlELFdBQVU7MEVBQTZCOzs7Ozs7O3VEQWpCdkNrQixJQUFJbEcsRUFBRTs7Ozs7Z0RBdUJuQjs7Ozs7Ozs7Ozs7O2tEQUtKLDhEQUFDaUY7d0NBQUlELFdBQVU7OzBEQUNiLDhEQUFDNUYsaURBQUlBO2dEQUNIaUgsTUFBSztnREFDTHJCLFdBQVcsQ0FBQyxvS0FBb0ssRUFDOUtiLGNBQWNtQixNQUFNLEtBQUssSUFDckIsc0RBQ0EsR0FDTCxDQUFDOzBEQUNIOzs7Ozs7MERBR0QsOERBQUNFO2dEQUNDQyxNQUFLO2dEQUNMQyxTQUFTO29EQUNQNUUsU0FBUyxDQUFDO29EQUNWLElBQUksS0FBNkIsRUFBRSxFQUVsQztnREFDSDtnREFDQXlGLFVBQVVwQyxjQUFjbUIsTUFBTSxLQUFLO2dEQUNuQ04sV0FBVyxDQUFDLDhKQUE4SixFQUN4S2IsY0FBY21CLE1BQU0sS0FBSyxJQUNyQixrQ0FDQSxHQUNMLENBQUM7MERBQ0g7Ozs7OzswREFHRCw4REFBQ25EO2dEQUFFNkMsV0FBVTswREFBbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FRdEQsOERBQUNPO3dCQUFRUCxXQUFVOzswQ0FDakIsOERBQUNhO2dDQUFHYixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ2lCO2dDQUFHakIsV0FBVTs7a0RBQ1osOERBQUNvQjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQVFSLDhEQUFDYjt3QkFBUVAsV0FBVTs7MENBQ2pCLDhEQUFDYTtnQ0FBR2IsV0FBVTswQ0FBbUU7Ozs7OzswQ0FHakYsOERBQUNpQjtnQ0FBR2pCLFdBQVU7O2tEQUNaLDhEQUFDb0I7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1oQiIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5Q29sdW1uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtblwiO1xuaW1wb3J0IHsgUEFSVF9ST0xFX1RPX0NBVEVHT1JZIH0gZnJvbSBcIkAvZGF0YS9wYXJ0Um9sZU1hcHBpbmdzXCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogbnVtYmVyOyAvLyBiYWNrZW5kIG51bWVyaWMgaWRcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjsgLy8gY2F0ZWdvcnlJZCAtPiBwYXJ0SWRcblxuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuLy8gR3JvdXAgY2F0ZWdvcmllcyBpbnRvIGxvZ2ljYWwgc2VjdGlvbnMuXG4vL1xuLy8gSU1QT1JUQU5UOlxuLy8gVGhlc2UgSURzIG11c3QgbWF0Y2ggdGhlIGlkcyB5b3UgaGF2ZSBpbiBDQVRFR09SSUVTLlxuLy8gQW55dGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IHdpbGwganVzdCBiZSBza2lwcGVkLlxuY29uc3QgQ0FURUdPUllfR1JPVVBTOiB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjYXRlZ29yeUlkczogQ2F0ZWdvcnlJZFtdO1xufVtdID0gW1xuICB7XG4gICAgaWQ6IFwibG93ZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJMb3dlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFdmVyeXRoaW5nIGZyb20gdGhlIHNlcmlhbGl6ZWQgbG93ZXIgdG8gc21hbGwgcGFydHMsIGZpcmUgY29udHJvbCwgYW5kIGNvcmUgY29udHJvbHMuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwibG93ZXJcIixcbiAgICAgIFwiY29tcGxldGVMb3dlclwiLFxuICAgICAgXCJsb3dlclBhcnRzXCIsXG4gICAgICBcInRyaWdnZXJcIixcbiAgICAgIFwiZ3JpcFwiLFxuICAgICAgXCJzYWZldHlcIixcbiAgICAgIFwiYnVmZmVyXCIsXG4gICAgICBcInN0b2NrXCIsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQmFycmVsLCB1cHBlciwgZ2FzIHN5c3RlbSwgYW5kIHRoZSBwYXJ0cyB0aGF0IGtlZXAgdGhlIHJpZmxlIGN5Y2xpbmcuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwidXBwZXJcIixcbiAgICAgIFwiY29tcGxldGVVcHBlclwiLFxuICAgICAgXCJiY2dcIixcbiAgICAgIFwiYmFycmVsXCIsXG4gICAgICBcImdhc0Jsb2NrXCIsXG4gICAgICBcImdhc1R1YmVcIixcbiAgICAgIFwibXV6emxlRGV2aWNlXCIsXG4gICAgICBcInN1cHByZXNzb3JcIixcbiAgICAgIFwiaGFuZGd1YXJkXCIsXG4gICAgICBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgICBcInNpZ2h0c1wiLFxuICAgICAgXCJvcHRpY1wiLFxuICAgIF0sXG4gIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHdW5idWlsZGVyUGFnZSgpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXNlU2VhcmNoUGFyYW1zKCk7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcbiAgY29uc3QgW2xheW91dE1vZGUsIHNldExheW91dE1vZGVdID0gdXNlU3RhdGU8XCJjYXJkc1wiIHwgXCJsaXN0XCI+KFwiY2FyZHNcIik7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hQcm9kdWN0cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgIGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXI/cGxhdGZvcm09QVItMTVgLFxuICAgICAgICAgIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9LFxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhXG4gICAgICAgICAgLm1hcCgocCk6IFBhcnQgfCBudWxsID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhdGVnb3J5SWQgPSBQQVJUX1JPTEVfVE9fQ0FURUdPUllbcC5wYXJ0Um9sZV07XG4gICAgICAgICAgICBpZiAoIWNhdGVnb3J5SWQpIHtcbiAgICAgICAgICAgICAgLy8gU2tpcCBhbnkgcGFydHMgd2UgZG9uJ3Qga25vdyBob3cgdG8gbWFwIHlldFxuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgaWQ6IFN0cmluZyhwLmlkKSwgLy8gQUxXQVlTIHN0cmluZ1xuICAgICAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmlsdGVyKChwKTogcCBpcyBQYXJ0ID0+IHAgIT09IG51bGwpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hQcm9kdWN0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW10pO1xuXG4gIC8vIEhhbmRsZSBVUkwgcXVlcnkgcGFyYW1ldGVyIGZvciBwYXJ0IHNlbGVjdGlvbiAoP3NlbGVjdD11cHBlcjoxNjUpXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0UGFyYW0gPSBzZWFyY2hQYXJhbXMuZ2V0KFwic2VsZWN0XCIpO1xuICAgIGlmIChzZWxlY3RQYXJhbSkge1xuICAgICAgY29uc3QgW2NhdGVnb3J5SWQsIHBhcnRJZF0gPSBzZWxlY3RQYXJhbS5zcGxpdChcIjpcIik7XG4gICAgICBpZiAoY2F0ZWdvcnlJZCAmJiBwYXJ0SWQgJiYgQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSkge1xuICAgICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSB7XG4gICAgICAgICAgICAuLi5wcmV2LFxuICAgICAgICAgICAgW2NhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkodXBkYXRlZCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcm91dGVyLnJlcGxhY2UoXCIvZ3VuYnVpbGRlclwiLCB7IHNjcm9sbDogZmFsc2UgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LCBbc2VhcmNoUGFyYW1zLCByb3V0ZXJdKTtcblxuICAvLyBQZXJzaXN0IGJ1aWxkIHN0YXRlIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgY29uc3QgcGFydHNCeUNhdGVnb3J5OiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgUGFydFtdPiA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGdyb3VwZWQgPSB7fSBhcyBSZWNvcmQ8Q2F0ZWdvcnlJZCwgUGFydFtdPjtcbiAgICBmb3IgKGNvbnN0IGNhdGVnb3J5IG9mIENBVEVHT1JJRVMpIHtcbiAgICAgIGdyb3VwZWRbY2F0ZWdvcnkuaWRdID0gcGFydHMuZmlsdGVyKFxuICAgICAgICAocCkgPT4gcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeS5pZCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBncm91cGVkO1xuICB9LCBbcGFydHNdKTtcblxuICBjb25zdCBzZWxlY3RlZFBhcnRzOiBQYXJ0W10gPSB1c2VNZW1vKCgpID0+IHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXMoYnVpbGQpXG4gICAgICAubWFwKChbY2F0ZWdvcnlJZCwgcGFydElkXSkgPT5cbiAgICAgICAgcGFydHMuZmluZCgocCkgPT4gcC5pZCA9PT0gcGFydElkICYmIHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgICApXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pIGFzIFBhcnRbXTtcbiAgfSwgW2J1aWxkLCBwYXJ0c10pO1xuXG4gIGNvbnN0IHRvdGFsUHJpY2UgPSB1c2VNZW1vKFxuICAgICgpID0+IHNlbGVjdGVkUGFydHMucmVkdWNlKChzdW0sIHApID0+IHN1bSArIHAucHJpY2UsIDApLFxuICAgIFtzZWxlY3RlZFBhcnRzXSxcbiAgKTtcblxuICBjb25zdCBoYW5kbGVTZWxlY3RQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0QnVpbGQoKHByZXYpID0+ICh7XG4gICAgICAuLi5wcmV2LFxuICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgfSkpO1xuICB9O1xuXG4gIC8vIFVzZSBncm91cCBvcmRlcmluZyBmb3IgdGhlIHN1bW1hcnkgYXMgd2VsbFxuICBjb25zdCBzdW1tYXJ5Q2F0ZWdvcnlPcmRlcjogQ2F0ZWdvcnlJZFtdID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQ0FURUdPUllfR1JPVVBTLmZsYXRNYXAoKGdyb3VwKSA9PiBncm91cC5jYXRlZ29yeUlkcykuZmlsdGVyKFxuICAgICAgICAoaWQpID0+IENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gaWQpLFxuICAgICAgKSxcbiAgICBbXSxcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLWFtYmVyLTUwMC8yMCBiZy1hbWJlci01MDAvNVwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gZmxleCBtYXgtdy02eGwgZmxleC1jb2wgZ2FwLTEgcHgtNCBweS0yIHRleHQtWzAuNzVyZW1dIHRleHQtYW1iZXItMTAwIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJyb3VuZGVkLXNtIGJnLWFtYmVyLTUwMC8yMCBweC0yIHB5LTAuNSB0ZXh0LVswLjY1cmVtXSBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xOGVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICBFYXJseSBBY2Nlc3MgQmV0YVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHRleHQtYW1iZXItMTAwLzkwIG1kOmlubGluZVwiPlxuICAgICAgICAgICAgICBZb3UmYXBvcztyZSB1c2luZyBhbiBlYXJseS1hY2Nlc3MgcHJvdG90eXBlIG9mIFRoZSBBcm1vcnkuIERhdGEsXG4gICAgICAgICAgICAgIHByaWNpbmcsIGFuZCBhdmFpbGFibGUgcGFydHMgYXJlIHN0aWxsIGV2b2x2aW5nLlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMTAwLzkwIG1kOmhpZGRlblwiPlxuICAgICAgICAgICAgRWFybHktYWNjZXNzIHByb3RvdHlwZS4gRGF0YSBhbmQgcHJpY2luZyBtYXkgY2hhbmdlLlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNiBmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmZsZXgtcm93IG1kOml0ZW1zLWVuZCBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgIFRoZSBBcm1vcnk6IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+RWFybHkgQWNjZXNzPC9zcGFuPlxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgIEV4cGxvcmUgY29tcG9uZW50cyBmcm9tIHRydXN0ZWQgYnJhbmRzLCBjaG9vc2Ugb25lIHBhcnQgcGVyXG4gICAgICAgICAgICAgIGNhdGVnb3J5LCB0cmFjayBsaXZlIHByaWNlcywgYW5kIHdhdGNoIHlvdXIgdG90YWwgYnVpbGQgY29zdFxuICAgICAgICAgICAgICB1cGRhdGUgYXMgeW91IGdvLiBUaGlzIGVhcmx5LWFjY2VzcyBidWlsZGVyIGtlZXBzIHlvdXIgc2V0dXAgc2F2ZWRcbiAgICAgICAgICAgICAgbG9jYWxseSBzbyB5b3UgY2FuIGNvbWUgYmFjayBhbmQgcmVmaW5lIGl0IGFueXRpbWUuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTMgbWQ6bXQtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDBcIj5DdXJyZW50IGJ1aWxkIHRvdGFsPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgJHt0b3RhbFByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZFBhcnRzLmxlbmd0aH0gLyB7Q0FURUdPUklFUy5sZW5ndGh9IGNhdGVnb3JpZXMgZmlsbGVkXG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIExheW91dCAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC00IGxnOmdyaWQtY29scy1bM2ZyLDEuMjVmcl1cIj5cbiAgICAgICAgICB7LyogQ2F0ZWdvcmllcy9wYXJ0cyAqL31cbiAgICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTIgc206ZmxleC1yb3cgc206aXRlbXMtY2VudGVyIHNtOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBDaG9vc2Ugb25lIHBhcnQgcGVyIGNhdGVnb3J5LiBTd2l0Y2ggbGF5b3V0cyB0byBicm93c2UgYnkgY2FyZHMgb3IgYSB0aWdodGVyIGxpc3Qgdmlldy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC1bMC43cmVtXVwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0TGF5b3V0TW9kZShcImNhcmRzXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMi41IHB5LTEgcm91bmRlZC1sLW1kIGJvcmRlci1yIGJvcmRlci16aW5jLTcwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICBsYXlvdXRNb2RlID09PSBcImNhcmRzXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctYW1iZXItNTAwLzIwIHRleHQtYW1iZXItMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3ZlcjpiZy16aW5jLTgwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkIHZpZXdcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldExheW91dE1vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMi41IHB5LTEgcm91bmRlZC1yLW1kIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIGxheW91dE1vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLWFtYmVyLTUwMC8yMCB0ZXh0LWFtYmVyLTIwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6YmctemluYy04MDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTGlzdCB2aWV3XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7bG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIExvYWRpbmcgcGFydHMgZnJvbSBiYWNrZW5k4oCmXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7ZXJyb3IgJiYgIWxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMFwiPlxuICAgICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZyBhbmQgQ09SUyBpc1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAgICB7Q0FURUdPUllfR1JPVVBTLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2F0ZWdvcmllcyA9IENBVEVHT1JJRVMuZmlsdGVyKChjKSA9PlxuICAgICAgICAgICAgICAgICAgICBncm91cC5jYXRlZ29yeUlkcy5pbmNsdWRlcyhjLmlkIGFzIENhdGVnb3J5SWQpLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtncm91cC5pZH0gY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGp1c3RpZnktYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMCBtdC0xIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICB7bGF5b3V0TW9kZSA9PT0gXCJjYXJkc1wiID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC00IG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2F0ZWdvcnkuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0yIG1kOnAtMyBiZy16aW5jLTk1MC82MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENhdGVnb3J5Q29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXtjYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM9e3BhcnRzQnlDYXRlZ29yeVtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydElkPXtidWlsZFtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0UGFydD17KHBhcnRJZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RQYXJ0KGNhdGVnb3J5LmlkLCBwYXJ0SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y2F0ZWdvcnkuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0yIG1kOnAtMyBiZy16aW5jLTk1MC82MCBmbGV4IGZsZXgtY29sIG1kOmZsZXgtcm93IG1kOml0ZW1zLXN0YXJ0IG1kOmp1c3RpZnktYmV0d2VlbiBnYXAtM1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENhdGVnb3J5Q29sdW1uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXtjYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM9e3BhcnRzQnlDYXRlZ29yeVtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydElkPXtidWlsZFtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0UGFydD17KHBhcnRJZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RQYXJ0KGNhdGVnb3J5LmlkLCBwYXJ0SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgey8qIEJ1aWxkIFN1bW1hcnkgKi99XG4gICAgICAgICAgPGFzaWRlIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00IGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMTZlbV0gdXBwZXJjYXNlIHRleHQtemluYy00MDAgbWItM1wiPlxuICAgICAgICAgICAgICBDdXJyZW50IEJ1aWxkXG4gICAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgcGFydCBmcm9tIGVhY2ggY2F0ZWdvcnkgdG8gc3RhcnQgeW91ciBidWlsZC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtzdW1tYXJ5Q2F0ZWdvcnlPcmRlci5tYXAoKGNhdGVnb3J5SWQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdCA9IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNhdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFydElkID0gYnVpbGRbY2F0LmlkXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBwLmlkID09PSBzZWxlY3RlZFBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdC5pZCxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxsaSBrZXk9e2NhdC5pZH0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2F0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge3BhcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIENUQSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBib3JkZXItdCBib3JkZXItemluYy04MDAgcHQtMyBzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXIvYnVpbGRcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJsb2NrIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYW1iZXItNDAwLzYwIGJnLWFtYmVyLTQwMC8xMCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWFtYmVyLTIwMCBob3ZlcjpiZy1hbWJlci00MDAvMTUgdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gXCJvcGFjaXR5LTQwIGN1cnNvci1ub3QtYWxsb3dlZCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCdWlsZCBTdW1tYXJ5XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldEJ1aWxkKHt9KTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2B3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENsZWFyIEJ1aWxkXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFZpZXcgeW91ciBidWlsZCBicmVha2Rvd24gYW5kIHNoYXJlIGl0IHdpdGggb3RoZXJzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FzaWRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogV2hhdCdzIE5ldyAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibXQtOCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICBXaGF0JmFwb3M7cyBOZXcgaW4gRWFybHkgQWNjZXNzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIExpdmUgcGFydHMgYW5kIHByaWNpbmcgcHVsbGVkIGZyb20gbXVsdGlwbGUgbWVyY2hhbnRzLjwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBHcm91cGVkIGxheW91dCBmb3IgbG93ZXIgYW5kIHVwcGVyIHJlY2VpdmVyIHBhcnRzIHNvIHlvdSBjYW4gc2VlXG4gICAgICAgICAgICAgIGF0IGEgZ2xhbmNlIHdoaWNoIHNlY3Rpb25zIG9mIHlvdXIgYnVpbGQgYXJlIHN0aWxsIG1pc3NpbmcuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgUnVubmluZyBidWlsZCB0b3RhbCB0aGF0IHVwZGF0ZXMgYXV0b21hdGljYWxseSBhcyB5b3UgYWRkIG9yXG4gICAgICAgICAgICAgIHN3YXAgY29tcG9uZW50cy5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBMb2NhbCBidWlsZCBwZXJzaXN0ZW5jZSBzbyB5b3VyIHNlbGVjdGlvbnMgc3RpY2sgYXJvdW5kIGJldHdlZW5cbiAgICAgICAgICAgICAgdmlzaXRzIG9uIHRoaXMgZGV2aWNlLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFJvYWRtYXAgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3Mgb24gb3VyIHJvYWRtYXBcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC0yIHNwYWNlLXktMSB0ZXh0LXNtIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgIDxsaT7igKIgUGxhdGZvcm0gZmlsdGVycyAoQVItMTUsIEFSLTksIEFSLTEwKTwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIE1vcmUgcGFydCBjYXRlZ29yaWVzIGFuZCBmdXJuaXR1cmU8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBSaWNoZXIgcHJpY2luZy9zdG9jayBzeW5jPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgU21hcnRlciBjb21wYXRpYmlsaXR5IGNoZWNrcyBiZXR3ZWVuIGNvbXBvbmVudHM8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBBUjkvQVIxMCBzdXBwb3J0IGFuZCBtb3JlPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIkxpbmsiLCJ1c2VTZWFyY2hQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ2F0ZWdvcnlDb2x1bW4iLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJBUElfQkFTRV9VUkwiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiU1RPUkFHRV9LRVkiLCJDQVRFR09SWV9HUk9VUFMiLCJpZCIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJjYXRlZ29yeUlkcyIsIkd1bmJ1aWxkZXJQYWdlIiwic2VhcmNoUGFyYW1zIiwicm91dGVyIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwibGF5b3V0TW9kZSIsInNldExheW91dE1vZGUiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hQcm9kdWN0cyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJjYXRlZ29yeUlkIiwicGFydFJvbGUiLCJTdHJpbmciLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwidXJsIiwiYnV5VXJsIiwibm90ZXMiLCJmaWx0ZXIiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZWxlY3RQYXJhbSIsImdldCIsInBhcnRJZCIsInNwbGl0Iiwic29tZSIsImMiLCJwcmV2IiwidXBkYXRlZCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJyZXBsYWNlIiwic2Nyb2xsIiwicGFydHNCeUNhdGVnb3J5IiwiZ3JvdXBlZCIsImNhdGVnb3J5Iiwic2VsZWN0ZWRQYXJ0cyIsIk9iamVjdCIsImVudHJpZXMiLCJmaW5kIiwiQm9vbGVhbiIsInRvdGFsUHJpY2UiLCJyZWR1Y2UiLCJzdW0iLCJoYW5kbGVTZWxlY3RQYXJ0Iiwic3VtbWFyeUNhdGVnb3J5T3JkZXIiLCJmbGF0TWFwIiwiZ3JvdXAiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2Iiwic3BhbiIsImhlYWRlciIsImgxIiwidG9GaXhlZCIsImxlbmd0aCIsInNlY3Rpb24iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImdyb3VwQ2F0ZWdvcmllcyIsImluY2x1ZGVzIiwiaDIiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImFzaWRlIiwidWwiLCJjYXQiLCJwYXJ0IiwibGkiLCJocmVmIiwicmVtb3ZlSXRlbSIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./app/gunbuilder/page.tsx\n"); /***/ }), @@ -148,7 +148,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: () => (/* binding */ CategoryColumn)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(ssr)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn({ category, parts, selectedPartId, onSelectPart }) {\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts yet for this category.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 text-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 flex items-center justify-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 45,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 57,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: `/gunbuilder/${category.id}`,\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 66,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFNkI7QUFFb0I7QUFTMUMsU0FBU0UsZUFBZSxFQUM3QkMsUUFBUSxFQUNSQyxLQUFLLEVBQ0xDLGNBQWMsRUFDZEMsWUFBWSxFQUNRO0lBQ3BCLDhEQUE4RDtJQUM5RCxNQUFNQyxnQkFBZ0JGLGlCQUNsQkQsTUFBTUksSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLEVBQUUsS0FBS0wsa0JBQzNCO0lBRUoscUJBQ0UsOERBQUNNO1FBQUlDLFdBQVU7OzBCQUNiLDhEQUFDRDtnQkFBSUMsV0FBVTswQkFDYiw0RUFBQ0M7b0JBQUdELFdBQVU7OEJBQ1hULFNBQVNXLElBQUk7Ozs7Ozs7Ozs7OzBCQUdsQiw4REFBQ0g7Z0JBQUlDLFdBQVU7O29CQUNaUixNQUFNVyxNQUFNLEtBQUssbUJBQ2hCLDhEQUFDTjt3QkFBRUcsV0FBVTtrQ0FBd0I7Ozs7OztvQkFFdEMsQ0FBQ0wsaUJBQWlCSCxNQUFNVyxNQUFNLEdBQUcsbUJBQ2hDLDhEQUFDSjt3QkFBSUMsV0FBVTtrQ0FDYiw0RUFBQ0g7NEJBQUVHLFdBQVU7OzhDQUNYLDhEQUFDSTtvQ0FDQ0osV0FBVTtvQ0FDVkssTUFBSztvQ0FDTEMsUUFBTztvQ0FDUEMsU0FBUTs4Q0FFUiw0RUFBQ0M7d0NBQ0NDLGVBQWM7d0NBQ2RDLGdCQUFlO3dDQUNmQyxhQUFhO3dDQUNiQyxHQUFFOzs7Ozs7Ozs7OztnQ0FFQTs7Ozs7Ozs7Ozs7O29CQUtYakIsK0JBQ0MsOERBQUNOLDBEQUFRQTt3QkFFUHdCLE1BQU1sQjt3QkFDTm1CLFVBQVVuQixjQUFjRyxFQUFFLEtBQUtMO3dCQUMvQnNCLFVBQVUsSUFBTXJCLGFBQWFDLGNBQWNHLEVBQUU7dUJBSHhDSCxjQUFjRyxFQUFFOzs7Ozs7Ozs7OztZQU8xQk4sTUFBTVcsTUFBTSxHQUFHLG1CQUNkLDhEQUFDZixpREFBSUE7Z0JBQ0g0QixNQUFNLENBQUMsWUFBWSxFQUFFekIsU0FBU08sRUFBRSxDQUFDLENBQUM7Z0JBQ2xDRSxXQUFVOztvQkFDWDtvQkFDWVIsTUFBTVcsTUFBTTtvQkFBQzs7Ozs7Ozs7Ozs7OztBQUtsQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtbi50c3g/OWMxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IFBhcnRDYXJkIH0gZnJvbSBcIkAvY29tcG9uZW50cy9QYXJ0Q2FyZFwiO1xuXG5pbnRlcmZhY2UgQ2F0ZWdvcnlDb2x1bW5Qcm9wcyB7XG4gIGNhdGVnb3J5OiBDYXRlZ29yeTtcbiAgcGFydHM6IFBhcnRbXTtcbiAgc2VsZWN0ZWRQYXJ0SWQ/OiBzdHJpbmc7XG4gIG9uU2VsZWN0UGFydDogKHBhcnRJZDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2F0ZWdvcnlDb2x1bW4oe1xuICBjYXRlZ29yeSxcbiAgcGFydHMsXG4gIHNlbGVjdGVkUGFydElkLFxuICBvblNlbGVjdFBhcnQsXG59OiBDYXRlZ29yeUNvbHVtblByb3BzKSB7XG4gIC8vIFNob3cgc2VsZWN0ZWQgcGFydCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBzaG93IHBsYWNlaG9sZGVyXG4gIGNvbnN0IGRpc3BsYXllZFBhcnQgPSBzZWxlY3RlZFBhcnRJZFxuICAgID8gcGFydHMuZmluZCgocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zXCI+XG4gICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMTVlbV0gdGV4dC16aW5jLTQwMCB1cHBlcmNhc2VcIj5cbiAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAge3BhcnRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+Tm8gcGFydHMgeWV0IGZvciB0aGlzIGNhdGVnb3J5LjwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNwbGF5ZWRQYXJ0ICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgbWItMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNHYxNm04LThINFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENob29zZSBhIFBhcnRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXllZFBhcnQgJiYgKFxuICAgICAgICAgIDxQYXJ0Q2FyZFxuICAgICAgICAgICAga2V5PXtkaXNwbGF5ZWRQYXJ0LmlkfVxuICAgICAgICAgICAgcGFydD17ZGlzcGxheWVkUGFydH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtkaXNwbGF5ZWRQYXJ0LmlkID09PSBzZWxlY3RlZFBhcnRJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNlbGVjdFBhcnQoZGlzcGxheWVkUGFydC5pZCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3BhcnRzLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICA8TGlua1xuICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibXQtMiB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIFZpZXcgQWxsICh7cGFydHMubGVuZ3RofSlcbiAgICAgICAgPC9MaW5rPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJMaW5rIiwiUGFydENhcmQiLCJDYXRlZ29yeUNvbHVtbiIsImNhdGVnb3J5IiwicGFydHMiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImRpc3BsYXllZFBhcnQiLCJmaW5kIiwicCIsImlkIiwiZGl2IiwiY2xhc3NOYW1lIiwiaDIiLCJuYW1lIiwibGVuZ3RoIiwic3ZnIiwiZmlsbCIsInN0cm9rZSIsInZpZXdCb3giLCJwYXRoIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwicGFydCIsInNlbGVjdGVkIiwib25TZWxlY3QiLCJocmVmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./components/CategoryColumn.tsx\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: () => (/* binding */ CategoryColumn)\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(ssr)/./node_modules/next/dist/server/future/route-modules/app-page/vendored/ssr/react-jsx-dev-runtime.js\");\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(ssr)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(ssr)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn({ category, parts, selectedPartId, onSelectPart }) {\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts available yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: `/gunbuilder/${category.id}`,\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length >= 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: `/gunbuilder/${category.id}`,\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFNkI7QUFFb0I7QUFTMUMsU0FBU0UsZUFBZSxFQUM3QkMsUUFBUSxFQUNSQyxLQUFLLEVBQ0xDLGNBQWMsRUFDZEMsWUFBWSxFQUNRO0lBQ3BCLDhEQUE4RDtJQUM5RCxNQUFNQyxnQkFBZ0JGLGlCQUNsQkQsTUFBTUksSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUVDLEVBQUUsS0FBS0wsa0JBQzNCO0lBRUoscUJBQ0UsOERBQUNNO1FBQUlDLFdBQVU7OzBCQUNiLDhEQUFDRDtnQkFBSUMsV0FBVTswQkFDYiw0RUFBQ0M7b0JBQUdELFdBQVU7OEJBQ1hULFNBQVNXLElBQUk7Ozs7Ozs7Ozs7OzBCQUdsQiw4REFBQ0g7Z0JBQUlDLFdBQVU7O29CQUNaUixNQUFNVyxNQUFNLEtBQUssbUJBQ2hCLDhEQUFDTjt3QkFBRUcsV0FBVTtrQ0FBd0I7Ozs7OztvQkFFdEMsQ0FBQ0wsaUJBQWlCSCxNQUFNVyxNQUFNLEdBQUcsbUJBQ2hDLDhEQUFDSjt3QkFBSUMsV0FBVTs7MENBQ2IsOERBQUNIO2dDQUFFRyxXQUFVOzBDQUF3Qjs7Ozs7OzBDQUNyQyw4REFBQ1osaURBQUlBO2dDQUNIZ0IsTUFBTSxDQUFDLFlBQVksRUFBRWIsU0FBU08sRUFBRSxDQUFDLENBQUM7Z0NBQ2xDRSxXQUFVOztrREFFViw4REFBQ0s7d0NBQ0NMLFdBQVU7d0NBQ1ZNLE1BQUs7d0NBQ0xDLFFBQU87d0NBQ1BDLFNBQVE7a0RBRVIsNEVBQUNDOzRDQUNDQyxlQUFjOzRDQUNkQyxnQkFBZTs0Q0FDZkMsYUFBYTs0Q0FDYkMsR0FBRTs7Ozs7Ozs7Ozs7b0NBRUE7Ozs7Ozs7Ozs7Ozs7b0JBS1hsQiwrQkFDQyw4REFBQ04sMERBQVFBO3dCQUVQeUIsTUFBTW5CO3dCQUNOb0IsVUFBVXBCLGNBQWNHLEVBQUUsS0FBS0w7d0JBQy9CdUIsVUFBVSxJQUFNdEIsYUFBYUMsY0FBY0csRUFBRTt1QkFIeENILGNBQWNHLEVBQUU7Ozs7Ozs7Ozs7O1lBTzFCTixNQUFNVyxNQUFNLElBQUksbUJBQ2YsOERBQUNmLGlEQUFJQTtnQkFDSGdCLE1BQU0sQ0FBQyxZQUFZLEVBQUViLFNBQVNPLEVBQUUsQ0FBQyxDQUFDO2dCQUNsQ0UsV0FBVTs7b0JBQ1g7b0JBQ1lSLE1BQU1XLE1BQU07b0JBQUM7Ozs7Ozs7Ozs7Ozs7QUFLbEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4PzljMTgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5pbXBvcnQgeyBQYXJ0Q2FyZCB9IGZyb20gXCJAL2NvbXBvbmVudHMvUGFydENhcmRcIjtcblxuaW50ZXJmYWNlIENhdGVnb3J5Q29sdW1uUHJvcHMge1xuICBjYXRlZ29yeTogQ2F0ZWdvcnk7XG4gIHBhcnRzOiBQYXJ0W107XG4gIHNlbGVjdGVkUGFydElkPzogc3RyaW5nO1xuICBvblNlbGVjdFBhcnQ6IChwYXJ0SWQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhdGVnb3J5Q29sdW1uKHtcbiAgY2F0ZWdvcnksXG4gIHBhcnRzLFxuICBzZWxlY3RlZFBhcnRJZCxcbiAgb25TZWxlY3RQYXJ0LFxufTogQ2F0ZWdvcnlDb2x1bW5Qcm9wcykge1xuICAvLyBTaG93IHNlbGVjdGVkIHBhcnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2Ugc2hvdyBwbGFjZWhvbGRlclxuICBjb25zdCBkaXNwbGF5ZWRQYXJ0ID0gc2VsZWN0ZWRQYXJ0SWRcbiAgICA/IHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHNlbGVjdGVkUGFydElkKVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBoLWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItM1wiPlxuICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE1ZW1dIHRleHQtemluYy00MDAgdXBwZXJjYXNlXCI+XG4gICAgICAgICAge2NhdGVnb3J5Lm5hbWV9XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwci0xXCI+XG4gICAgICAgIHtwYXJ0cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPk5vIHBhcnRzIGF2YWlsYWJsZSB5ZXQuPC9wPlxuICAgICAgICApfVxuICAgICAgICB7IWRpc3BsYXllZFBhcnQgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBtYi0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+Tm8gcGFydCBzZWxlY3RlZDwvcD5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNjAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMjAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTUwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNHYxNm04LThINFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENob29zZSBhIFBhcnRcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXllZFBhcnQgJiYgKFxuICAgICAgICAgIDxQYXJ0Q2FyZFxuICAgICAgICAgICAga2V5PXtkaXNwbGF5ZWRQYXJ0LmlkfVxuICAgICAgICAgICAgcGFydD17ZGlzcGxheWVkUGFydH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtkaXNwbGF5ZWRQYXJ0LmlkID09PSBzZWxlY3RlZFBhcnRJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNlbGVjdFBhcnQoZGlzcGxheWVkUGFydC5pZCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3BhcnRzLmxlbmd0aCA+PSAxICYmIChcbiAgICAgICAgPExpbmtcbiAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTIgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICBWaWV3IEFsbCAoe3BhcnRzLmxlbmd0aH0pXG4gICAgICAgIDwvTGluaz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwibmFtZXMiOlsiTGluayIsIlBhcnRDYXJkIiwiQ2F0ZWdvcnlDb2x1bW4iLCJjYXRlZ29yeSIsInBhcnRzIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJkaXNwbGF5ZWRQYXJ0IiwiZmluZCIsInAiLCJpZCIsImRpdiIsImNsYXNzTmFtZSIsImgyIiwibmFtZSIsImxlbmd0aCIsImhyZWYiLCJzdmciLCJmaWxsIiwic3Ryb2tlIiwidmlld0JveCIsInBhdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJzdHJva2VXaWR0aCIsImQiLCJwYXJ0Iiwic2VsZWN0ZWQiLCJvblNlbGVjdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./components/CategoryColumn.tsx\n"); /***/ }), @@ -170,7 +170,18 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES),\n/* harmony export */ PARTS: () => (/* binding */ PARTS)\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLGFBQXlCO0lBQ3BDO1FBQUVDLElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBaUI7SUFDdEM7UUFBRUQsSUFBSTtRQUFVQyxNQUFNO0lBQVM7SUFDL0I7UUFBRUQsSUFBSTtRQUFhQyxNQUFNO0lBQVk7SUFDckM7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7SUFDN0I7UUFBRUQsSUFBSTtRQUFTQyxNQUFNO0lBQVE7Q0FDOUIsQ0FBQztBQUVLLE1BQU1DLFFBQWdCO0lBQzNCO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO1FBQ2RDLE9BQU87SUFDVDtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL2d1bmJ1aWxkZXItcHJvdG90eXBlLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgeyBpZDogXCJsb3dlclwiLCBuYW1lOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJ1cHBlclwiLCBuYW1lOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyBpZDogXCJiYXJyZWxcIiwgbmFtZTogXCJCYXJyZWxcIiB9LFxuICB7IGlkOiBcImhhbmRndWFyZFwiLCBuYW1lOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgaWQ6IFwic3RvY2tcIiwgbmFtZTogXCJTdG9ja1wiIH0sXG4gIHsgaWQ6IFwib3B0aWNcIiwgbmFtZTogXCJPcHRpY1wiIH0sXG5dO1xuXG5leHBvcnQgY29uc3QgUEFSVFM6IFBhcnRbXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWFlcm8tbTRlMVwiLFxuICAgIG5hbWU6IFwiTTRFMSBTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJsb3dlclwiLFxuICAgIHByaWNlOiAxMjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1tNGUxXCIsXG4gICAgbm90ZXM6IFwiRm9yZ2VkIDcwNzUtVDYsIHRocmVhZGVkIGJvbHQgY2F0Y2hcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyLXNvbGd3XCIsXG4gICAgbmFtZTogXCJMb3lhbCA5IFN0cmlwcGVkIExvd2VyXCIsXG4gICAgYnJhbmQ6IFwiU29ucyBvZiBMaWJlcnR5IEd1biBXb3Jrc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTg5LjAsXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vc29sZ3ctbG93ZXJcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWFlcm8tZW5oYW5jZWRcIixcbiAgICBuYW1lOiBcIkVuaGFuY2VkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQWVybyBQcmVjaXNpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcInVwcGVyXCIsXG4gICAgcHJpY2U6IDE0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9hZXJvLWVuaGFuY2VkLXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1iY20tbTRcIixcbiAgICBuYW1lOiBcIk00IFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgYnJhbmQ6IFwiQkNNXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNTkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmNtLW00LXVwcGVyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtY3JpdGVyaW9uLTE2XCIsXG4gICAgbmFtZTogXCIxNlxcXCIgSHlicmlkIEJhcnJlbFwiLFxuICAgIGJyYW5kOiBcIkNyaXRlcmlvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiYmFycmVsXCIsXG4gICAgcHJpY2U6IDI3OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jcml0ZXJpb24tMTZcIixcbiAgICBub3RlczogXCJNaWQtbGVuZ3RoIGdhcywgY2hyb21lLWxpbmVkXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWwtYmEtMTMtOVwiLFxuICAgIG5hbWU6IFwiMTMuOVxcXCIgSGFuc29uIFBlcmZvcm1hbmNlIFNlcmllc1wiLFxuICAgIGJyYW5kOiBcIkJhbGxpc3RpYyBBZHZhbnRhZ2VcIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyMDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYmEtMTMtOVwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctZ2Vpc3NlbGUtbWs4XCIsXG4gICAgbmFtZTogXCJNSzggUmFpbCAxMy41XFxcIlwiLFxuICAgIGJyYW5kOiBcIkdlaXNzZWxlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJoYW5kZ3VhcmRcIixcbiAgICBwcmljZTogMzI0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2dlaXNzZWxlLW1rOFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGctY2VudHVyaW9uLWM0XCIsXG4gICAgbmFtZTogXCJDNCBNLUxPSyAxMlxcXCJcIixcbiAgICBicmFuZDogXCJDZW50dXJpb24gQXJtc1wiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDI4NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9jZW50dXJpb24tYzRcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrLWI1LWJyYXZvXCIsXG4gICAgbmFtZTogXCJCUkFWTyBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIkI1IFN5c3RlbXNcIixcbiAgICBjYXRlZ29yeUlkOiBcInN0b2NrXCIsXG4gICAgcHJpY2U6IDc0Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2I1LWJyYXZvXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1tYWdwdWwtc2xcIixcbiAgICBuYW1lOiBcIk1PRSBTTCBDYXJiaW5lIFN0b2NrXCIsXG4gICAgYnJhbmQ6IFwiTWFncHVsXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA2OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9tYWdwdWwtc2xcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWVvdGVjaC1leHBzM1wiLFxuICAgIG5hbWU6IFwiRVhQUzMgSG9sb2dyYXBoaWMgU2lnaHRcIixcbiAgICBicmFuZDogXCJFT1RFQ0hcIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDc0OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2VvdGVjaC1leHBzM1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWMtaG9sb3N1bi01MDl0XCIsXG4gICAgbmFtZTogXCJIRTUwOVQgUmVkIERvdFwiLFxuICAgIGJyYW5kOiBcIkhvbG9zdW5cIixcbiAgICBjYXRlZ29yeUlkOiBcIm9wdGljXCIsXG4gICAgcHJpY2U6IDM0OS45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9ob2xvc3VuLTUwOXRcIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: () => (/* binding */ CATEGORIES)\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cyIsIm1hcHBpbmdzIjoiOzs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG4iXSwibmFtZXMiOlsiQ0FURUdPUklFUyIsImlkIiwibmFtZSIsImRlc2NyaXB0aW9uIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/gunbuilderParts.ts\n"); + +/***/ }), + +/***/ "(ssr)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { + +"use strict"; +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: () => (/* binding */ CATEGORY_TO_PART_ROLES),\n/* harmony export */ PART_ROLE_TO_CATEGORY: () => (/* binding */ PART_ROLE_TO_CATEGORY)\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, [categoryId, roles])=>{\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHMiLCJtYXBwaW5ncyI6Ijs7Ozs7QUFFQSwwQkFBMEI7QUFDbkIsTUFBTUEseUJBQXVEO0lBQ2xFLGtCQUFrQjtJQUNsQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtJQUNqQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxPQUFPO1FBQUM7S0FBUTtJQUNoQkMsT0FBTztRQUFDO0tBQVE7SUFFaEIsa0JBQWtCO0lBQ2xCQyxTQUFTO1FBQUM7UUFBVztLQUFjO0lBQ25DQyxNQUFNO1FBQUM7UUFBZTtLQUFPO0lBQzdCQyxRQUFRO1FBQUM7UUFBVTtLQUFrQjtJQUNyQ0MsZUFBZTtRQUFDO0tBQWlCO0lBRWpDLGtCQUFrQjtJQUNsQkMsZUFBZTtRQUFDO0tBQWlCO0lBQ2pDQyxLQUFLO1FBQUM7UUFBTztLQUFxQjtJQUNsQ0MsVUFBVTtRQUFDO0tBQVk7SUFDdkJDLFNBQVM7UUFBQztLQUFXO0lBQ3JCQyxjQUFjO1FBQUM7UUFBaUI7UUFBZTtLQUFRO0lBQ3ZEQyxZQUFZO1FBQUM7S0FBYTtBQUM1QixFQUFFO0FBRUYsdUNBQXVDO0FBQ2hDLE1BQU1DLHdCQUFvREMsT0FDOURDLE9BQU8sQ0FBQ3ZCLHdCQUNSd0IsTUFBTSxDQUFDLENBQUNDLEtBQUssQ0FBQ0MsWUFBWUMsTUFBTTtJQUMvQixLQUFLLE1BQU1DLFFBQVFELE1BQU87UUFDeEJGLEdBQUcsQ0FBQ0csS0FBSyxHQUFHRjtJQUNkO0lBQ0EsT0FBT0Q7QUFDVCxHQUFHLENBQUMsR0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cz9jNjI0Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gQ2F0ZWdvcnlJZCAtPiBwYXJ0Um9sZXNcbmV4cG9ydCBjb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICAvLyBDT1JFIC8gRVhJU1RJTkdcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxuICBsb3dlcjogW1wibG93ZXItcmVjZWl2ZXJcIl0sXG4gIG9wdGljOiBbXCJvcHRpY1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuXG4gIC8vIE5FVyBMT1dFUiBQQVJUU1xuICB0cmlnZ2VyOiBbXCJ0cmlnZ2VyXCIsIFwidHJpZ2dlci1raXRcIl0sXG4gIGdyaXA6IFtcInBpc3RvbC1ncmlwXCIsIFwiZ3JpcFwiXSxcbiAgc2FmZXR5OiBbXCJzYWZldHlcIiwgXCJzYWZldHktc2VsZWN0b3JcIl0sXG4gIGNvbXBsZXRlTG93ZXI6IFtcImNvbXBsZXRlLWxvd2VyXCJdLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBjb21wbGV0ZVVwcGVyOiBbXCJjb21wbGV0ZS11cHBlclwiXSxcbiAgYmNnOiBbXCJiY2dcIiwgXCJib2x0LWNhcnJpZXItZ3JvdXBcIl0sXG4gIGdhc0Jsb2NrOiBbXCJnYXMtYmxvY2tcIl0sXG4gIGdhc1R1YmU6IFtcImdhcy10dWJlXCJdLFxuICBtdXp6bGVEZXZpY2U6IFtcIm11enpsZS1kZXZpY2VcIiwgXCJjb21wZW5zYXRvclwiLCBcImJyYWtlXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxufTtcblxuLy8gSW52ZXJ0IHRvIGdldCBwYXJ0Um9sZSAtPiBDYXRlZ29yeUlkXG5leHBvcnQgY29uc3QgUEFSVF9ST0xFX1RPX0NBVEVHT1JZOiBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPiA9IE9iamVjdFxuICAuZW50cmllcyhDQVRFR09SWV9UT19QQVJUX1JPTEVTKVxuICAucmVkdWNlKChhY2MsIFtjYXRlZ29yeUlkLCByb2xlc10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgIGFjY1tyb2xlXSA9IGNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4pOyJdLCJuYW1lcyI6WyJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljIiwic3RvY2siLCJ0cmlnZ2VyIiwiZ3JpcCIsInNhZmV0eSIsImNvbXBsZXRlTG93ZXIiLCJjb21wbGV0ZVVwcGVyIiwiYmNnIiwiZ2FzQmxvY2siLCJnYXNUdWJlIiwibXV6emxlRGV2aWNlIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(ssr)/./data/partRoleMappings.ts\n"); /***/ }), diff --git a/.next/server/webpack-runtime.js b/.next/server/webpack-runtime.js index f49fc72..ecb1cb6 100644 --- a/.next/server/webpack-runtime.js +++ b/.next/server/webpack-runtime.js @@ -125,7 +125,7 @@ /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("f15ab610ff54783e") +/******/ __webpack_require__.h = () => ("e54948a0e485cc1b") /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ diff --git a/.next/static/chunks/app/_not-found/page.js b/.next/static/chunks/app/_not-found/page.js new file mode 100644 index 0000000..9904048 --- /dev/null +++ b/.next/static/chunks/app/_not-found/page.js @@ -0,0 +1,39 @@ +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +(self["webpackChunk_N_E"] = self["webpackChunk_N_E"] || []).push([["app/_not-found/page"],{ + +/***/ "(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!": +/*!***************************************************************************************************************************************************************************************************************************************************!*\ + !*** ./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage! ***! + \***************************************************************************************************************************************************************************************************************************************************/ +/***/ (function(module, __unused_webpack_exports, __webpack_require__) { + +eval(__webpack_require__.ts("\n (window.__NEXT_P = window.__NEXT_P || []).push([\n \"/_not-found/page\",\n function () {\n return __webpack_require__(/*! ./node_modules/next/dist/client/components/not-found-error.js */ \"(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js\");\n }\n ]);\n if(true) {\n module.hot.dispose(function () {\n window.__NEXT_P.push([\"/_not-found/page\"])\n });\n }\n //# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvYnVpbGQvd2VicGFjay9sb2FkZXJzL25leHQtY2xpZW50LXBhZ2VzLWxvYWRlci5qcz9hYnNvbHV0ZVBhZ2VQYXRoPSUyRlVzZXJzJTJGc2VhbiUyRkRldiUyRmd1bmJ1aWxkZXItcHJvdG90eXBlJTJGbm9kZV9tb2R1bGVzJTJGbmV4dCUyRmRpc3QlMkZjbGllbnQlMkZjb21wb25lbnRzJTJGbm90LWZvdW5kLWVycm9yLmpzJnBhZ2U9JTJGX25vdC1mb3VuZCUyRnBhZ2UhIiwibWFwcGluZ3MiOiI7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlLG1CQUFPLENBQUMsd0pBQStEO0FBQ3RGO0FBQ0E7QUFDQSxPQUFPLElBQVU7QUFDakIsTUFBTSxVQUFVO0FBQ2hCO0FBQ0EsT0FBTztBQUNQO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLz9jODJhIl0sInNvdXJjZXNDb250ZW50IjpbIlxuICAgICh3aW5kb3cuX19ORVhUX1AgPSB3aW5kb3cuX19ORVhUX1AgfHwgW10pLnB1c2goW1xuICAgICAgXCIvX25vdC1mb3VuZC9wYWdlXCIsXG4gICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiByZXF1aXJlKFwiLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2NsaWVudC9jb21wb25lbnRzL25vdC1mb3VuZC1lcnJvci5qc1wiKTtcbiAgICAgIH1cbiAgICBdKTtcbiAgICBpZihtb2R1bGUuaG90KSB7XG4gICAgICBtb2R1bGUuaG90LmRpc3Bvc2UoZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cuX19ORVhUX1AucHVzaChbXCIvX25vdC1mb3VuZC9wYWdlXCJdKVxuICAgICAgfSk7XG4gICAgfVxuICAiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js": +/*!*********************************************************************!*\ + !*** ./node_modules/next/dist/client/components/not-found-error.js ***! + \*********************************************************************/ +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +eval(__webpack_require__.ts("\nObject.defineProperty(exports, \"__esModule\", ({\n value: true\n}));\nObject.defineProperty(exports, \"default\", ({\n enumerable: true,\n get: function() {\n return NotFound;\n }\n}));\nconst _interop_require_default = __webpack_require__(/*! @swc/helpers/_/_interop_require_default */ \"(app-pages-browser)/./node_modules/@swc/helpers/esm/_interop_require_default.js\");\nconst _jsxruntime = __webpack_require__(/*! react/jsx-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-runtime.js\");\nconst _react = /*#__PURE__*/ _interop_require_default._(__webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\"));\nconst styles = {\n error: {\n // https://github.com/sindresorhus/modern-normalize/blob/main/modern-normalize.css#L38-L52\n fontFamily: 'system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"',\n height: \"100vh\",\n textAlign: \"center\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\"\n },\n desc: {\n display: \"inline-block\"\n },\n h1: {\n display: \"inline-block\",\n margin: \"0 20px 0 0\",\n padding: \"0 23px 0 0\",\n fontSize: 24,\n fontWeight: 500,\n verticalAlign: \"top\",\n lineHeight: \"49px\"\n },\n h2: {\n fontSize: 14,\n fontWeight: 400,\n lineHeight: \"49px\",\n margin: 0\n }\n};\nfunction NotFound() {\n return /*#__PURE__*/ (0, _jsxruntime.jsxs)(_jsxruntime.Fragment, {\n children: [\n /*#__PURE__*/ (0, _jsxruntime.jsx)(\"title\", {\n children: \"404: This page could not be found.\"\n }),\n /*#__PURE__*/ (0, _jsxruntime.jsx)(\"div\", {\n style: styles.error,\n children: /*#__PURE__*/ (0, _jsxruntime.jsxs)(\"div\", {\n children: [\n /*#__PURE__*/ (0, _jsxruntime.jsx)(\"style\", {\n dangerouslySetInnerHTML: {\n /* Minified CSS from\n body { margin: 0; color: #000; background: #fff; }\n .next-error-h1 {\n border-right: 1px solid rgba(0, 0, 0, .3);\n }\n\n @media (prefers-color-scheme: dark) {\n body { color: #fff; background: #000; }\n .next-error-h1 {\n border-right: 1px solid rgba(255, 255, 255, .3);\n }\n }\n */ __html: \"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"\n }\n }),\n /*#__PURE__*/ (0, _jsxruntime.jsx)(\"h1\", {\n className: \"next-error-h1\",\n style: styles.h1,\n children: \"404\"\n }),\n /*#__PURE__*/ (0, _jsxruntime.jsx)(\"div\", {\n style: styles.desc,\n children: /*#__PURE__*/ (0, _jsxruntime.jsx)(\"h2\", {\n style: styles.h2,\n children: \"This page could not be found.\"\n })\n })\n ]\n })\n })\n ]\n });\n}\n_c = NotFound;\nif ((typeof exports.default === \"function\" || typeof exports.default === \"object\" && exports.default !== null) && typeof exports.default.__esModule === \"undefined\") {\n Object.defineProperty(exports.default, \"__esModule\", {\n value: true\n });\n Object.assign(exports.default, exports);\n module.exports = exports.default;\n} //# sourceMappingURL=not-found-error.js.map\nvar _c;\n$RefreshReg$(_c, \"NotFound\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL25vZGVfbW9kdWxlcy9uZXh0L2Rpc3QvY2xpZW50L2NvbXBvbmVudHMvbm90LWZvdW5kLWVycm9yLmpzIiwibWFwcGluZ3MiOiI7Ozs7MkNBcUNBOzs7ZUFBd0JBOzs7Ozs0RUFyQ047QUFFbEIsTUFBTUMsU0FBOEM7SUFDbERDLE9BQU87UUFDTCwwRkFBMEY7UUFDMUZDLFlBQ0U7UUFDRkMsUUFBUTtRQUNSQyxXQUFXO1FBQ1hDLFNBQVM7UUFDVEMsZUFBZTtRQUNmQyxZQUFZO1FBQ1pDLGdCQUFnQjtJQUNsQjtJQUVBQyxNQUFNO1FBQ0pKLFNBQVM7SUFDWDtJQUVBSyxJQUFJO1FBQ0ZMLFNBQVM7UUFDVE0sUUFBUTtRQUNSQyxTQUFTO1FBQ1RDLFVBQVU7UUFDVkMsWUFBWTtRQUNaQyxlQUFlO1FBQ2ZDLFlBQVk7SUFDZDtJQUVBQyxJQUFJO1FBQ0ZKLFVBQVU7UUFDVkMsWUFBWTtRQUNaRSxZQUFZO1FBQ1pMLFFBQVE7SUFDVjtBQUNGO0FBRWUsU0FBU1o7SUFDdEIsT0FDRSxXQURGLEdBQ0UsSUFBQW1CLFlBQUFDLElBQUEsRUFBQUQsWUFBQUUsUUFBQTs7MEJBRUUsSUFBQUYsWUFBQUcsR0FBQSxFQUFDQyxTQUFBQTswQkFBTTs7MEJBRVAsSUFBQUosWUFBQUcsR0FBQSxFQUFDRSxPQUFBQTtnQkFBSUMsT0FBT3hCLE9BQU9DLEtBQUs7MEJBQ3RCLGtCQUFBaUIsWUFBQUMsSUFBQSxFQUFDSSxPQUFBQTs7c0NBQ0MsSUFBQUwsWUFBQUcsR0FBQSxFQUFDRyxTQUFBQTs0QkFDQ0MseUJBQXlCO2dDQUN2Qjs7Ozs7Ozs7Ozs7O2NBWUEsR0FDQUMsUUFBUzs0QkFDWDs7c0NBRUYsSUFBQVIsWUFBQUcsR0FBQSxFQUFDWCxNQUFBQTs0QkFBR2lCLFdBQVU7NEJBQWdCSCxPQUFPeEIsT0FBT1UsRUFBRTtzQ0FBRTs7c0NBR2hELElBQUFRLFlBQUFHLEdBQUEsRUFBQ0UsT0FBQUE7NEJBQUlDLE9BQU94QixPQUFPUyxJQUFJO3NDQUNyQixrQkFBQVMsWUFBQUcsR0FBQSxFQUFDSixNQUFBQTtnQ0FBR08sT0FBT3hCLE9BQU9pQixFQUFFOzBDQUFFOzs7Ozs7OztBQU1sQztLQXBDd0JsQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi4vLi4vLi4vc3JjL2NsaWVudC9jb21wb25lbnRzL25vdC1mb3VuZC1lcnJvci50c3g/ZjcwOSJdLCJuYW1lcyI6WyJOb3RGb3VuZCIsInN0eWxlcyIsImVycm9yIiwiZm9udEZhbWlseSIsImhlaWdodCIsInRleHRBbGlnbiIsImRpc3BsYXkiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsImp1c3RpZnlDb250ZW50IiwiZGVzYyIsImgxIiwibWFyZ2luIiwicGFkZGluZyIsImZvbnRTaXplIiwiZm9udFdlaWdodCIsInZlcnRpY2FsQWxpZ24iLCJsaW5lSGVpZ2h0IiwiaDIiLCJfanN4cnVudGltZSIsImpzeHMiLCJGcmFnbWVudCIsImpzeCIsInRpdGxlIiwiZGl2Iiwic3R5bGUiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsImNsYXNzTmFtZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js\n")); + +/***/ }) + +}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); } +/******/ __webpack_require__.O(0, ["main-app"], function() { return __webpack_exec__("(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"); }); +/******/ var __webpack_exports__ = __webpack_require__.O(); +/******/ _N_E = __webpack_exports__; +/******/ } +]); \ No newline at end of file diff --git a/.next/static/chunks/app/gunbuilder/[categoryId]/[partId]/page.js b/.next/static/chunks/app/gunbuilder/[categoryId]/[partId]/page.js index 76db1e7..2f55b59 100644 --- a/.next/static/chunks/app/gunbuilder/[categoryId]/[partId]/page.js +++ b/.next/static/chunks/app/gunbuilder/[categoryId]/[partId]/page.js @@ -90,7 +90,7 @@ eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* har /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEM7UUFBRUMsSUFBSTtRQUFTQyxNQUFNO0lBQWlCO0lBQ3RDO1FBQUVELElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVVDLE1BQU07SUFBUztJQUMvQjtRQUFFRCxJQUFJO1FBQWFDLE1BQU07SUFBWTtJQUNyQztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtJQUM3QjtRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtDQUM5QixDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIHsgaWQ6IFwibG93ZXJcIiwgbmFtZTogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwidXBwZXJcIiwgbmFtZTogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwiYmFycmVsXCIsIG5hbWU6IFwiQmFycmVsXCIgfSxcbiAgeyBpZDogXCJoYW5kZ3VhcmRcIiwgbmFtZTogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IGlkOiBcInN0b2NrXCIsIG5hbWU6IFwiU3RvY2tcIiB9LFxuICB7IGlkOiBcIm9wdGljXCIsIG5hbWU6IFwiT3B0aWNcIiB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJQQVJUUyIsImJyYW5kIiwiY2F0ZWdvcnlJZCIsInByaWNlIiwiYWZmaWxpYXRlVXJsIiwibm90ZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); /***/ }), diff --git a/.next/static/chunks/app/gunbuilder/[categoryId]/page.js b/.next/static/chunks/app/gunbuilder/[categoryId]/page.js index 57af8a0..61addfc 100644 --- a/.next/static/chunks/app/gunbuilder/[categoryId]/page.js +++ b/.next/static/chunks/app/gunbuilder/[categoryId]/page.js @@ -68,7 +68,7 @@ eval(__webpack_require__.ts("var __dirname = \"/\";\n(function(){var e={229:func /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 444,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0FBQ2xCO0FBT0EsTUFBTUMsY0FBYztBQUVMLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTcEIsMERBQVNBO0lBQ3hCLE1BQU1xQixhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNyQiwwREFBU0E7SUFFeEIsTUFBTSxDQUFDc0IsVUFBVUMsWUFBWSxHQUFHMUIsK0NBQVFBLENBQVc7SUFDbkQsTUFBTSxDQUFDMkIsT0FBT0MsU0FBUyxHQUFHNUIsK0NBQVFBLENBQVMsRUFBRTtJQUM3QyxNQUFNLENBQUM2QixTQUFTQyxXQUFXLEdBQUc5QiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUMrQixPQUFPQyxTQUFTLEdBQUdoQywrQ0FBUUEsQ0FBZ0I7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sQ0FBQ2lDLGFBQWFDLGVBQWUsR0FBR2xDLCtDQUFRQSxDQUFTO0lBQ3ZELE1BQU0sQ0FBQ21DLFFBQVFDLFVBQVUsR0FBR3BDLCtDQUFRQSxDQUFhO0lBQ2pELE1BQU0sQ0FB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Ozs7Ozs7Ozs7a0VBSWpCLDhEQUFDaUM7d0RBQUlELFdBQVU7a0VBQ1pxQixLQUFLM0QsS0FBSzs7Ozs7O2tFQUViLDhEQUFDdUM7d0RBQUlELFdBQVU7OzREQUFxRDs0REFDaEVxQixLQUFLMUQsS0FBSyxDQUFDMkQsT0FBTyxDQUFDOzs7Ozs7O2tFQUV2Qiw4REFBQ3JCO3dEQUFJRCxXQUFVOzswRUFDYiw4REFBQ2pILGlEQUFJQTtnRUFDSG9ILE1BQU0sZUFBNkJrQixPQUFkaEgsWUFBVyxLQUFXLE9BQVJnSCxLQUFLckYsRUFBRTtnRUFDMUNnRSxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNNO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1BsQyxpQkFBaUJqRSxZQUFZZ0gsS0FBS3JGLEVBQUU7Z0VBRXRDZ0UsV0FBVyxvRkFJVixPQUhDeEIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0ExQ3JDNkMsS0FBS3JGLEVBQUU7Ozs7O29DQWdEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0FwZHdCN0I7O1FBQ1BuQixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRmtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbmNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcbn07XG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0Iiwibm9ybWFsaXplZFF1ZXJ5IiwidHJpbSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJzZWxlY3RlZElkIiwic2VsZWN0ZWQiLCJvdGhlcnMiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJpbnB1dCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwicGxhY2Vob2xkZXIiLCJzZWxlY3QiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n // FIX: determine which backend partRoles map to this category\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 211,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 209,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 286,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 303,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 330,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 359,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 375,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 396,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 399,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 415,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 384,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 379,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 436,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 437,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 438,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 460,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 455,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 472,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 471,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 454,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 441,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 282,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 227,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUMwQjtBQUNIO0FBQ2E7SUFpQi9EUTtBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQVExQyxNQUFNSSxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNWLDBEQUFTQTtJQUN4QixNQUFNVyxhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNYLDBEQUFTQTtJQUV4QixNQUFNLENBQUNZLFVBQVVDLFlBQVksR0FBR2hCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR2xCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDbUIsU0FBU0MsV0FBVyxHQUFHcEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDcUIsT0FBT0MsU0FBUyxHQUFHdEIsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUN1QixhQUFhQyxlQUFlLEdBQUd4QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUN5QixRQUFRQyxVQUFVLEdBQUcxQiwrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUMyQixhQUFhQyxlQUFlLEdBQUc1QiwrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDNkIsT0FBT0MsU0FBUyxHQUFHOUIsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU0rQixTQUFTQyxPQUFPQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ3hCO1lBQzNDLE9BQU9xQixTQUFVSSxLQUFLQyxLQUFLLENBQUNMLFVBQXlCLENBQUM7UUFDeEQsRUFBRSxVQUFNO1lBQ04s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ckYsRUFBRTtnRUFDMUNnRSxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNNO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1BsQyxpQkFBaUJqRSxZQUFZZ0gsS0FBS3JGLEVBQUU7Z0VBRXRDZ0UsV0FBVyxvRkFJVixPQUhDeEIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0ExQ3JDNkMsS0FBS3JGLEVBQUU7Ozs7O29DQWdEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0FyZHdCN0I7O1FBQ1BULHNEQUFTQTtRQUVUQyxzREFBU0E7OztLQUhGUSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB7IENBVEVHT1JZX1RPX1BBUlRfUk9MRVMgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgLy8gRklYOiBkZXRlcm1pbmUgd2hpY2ggYmFja2VuZCBwYXJ0Um9sZXMgbWFwIHRvIHRoaXMgY2F0ZWdvcnlcbiAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJyb3V0ZXIiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJzZWFyY2hRdWVyeSIsInNldFNlYXJjaFF1ZXJ5IiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJoYW5kbGVUb2dnbGVQYXJ0IiwicGFydElkIiwiaXNTZWxlY3RlZCIsInByZXYiLCJ1cGRhdGVkIiwicHVzaCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm5vcm1hbGl6ZWRRdWVyeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwic2VsZWN0ZWRJZCIsInNlbGVjdGVkIiwib3RoZXJzIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsInBsYWNlaG9sZGVyIiwic2VsZWN0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); /***/ }), @@ -79,7 +79,18 @@ eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* har /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEM7UUFBRUMsSUFBSTtRQUFTQyxNQUFNO0lBQWlCO0lBQ3RDO1FBQUVELElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVVDLE1BQU07SUFBUztJQUMvQjtRQUFFRCxJQUFJO1FBQWFDLE1BQU07SUFBWTtJQUNyQztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtJQUM3QjtRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtDQUM5QixDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIHsgaWQ6IFwibG93ZXJcIiwgbmFtZTogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwidXBwZXJcIiwgbmFtZTogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwiYmFycmVsXCIsIG5hbWU6IFwiQmFycmVsXCIgfSxcbiAgeyBpZDogXCJoYW5kZ3VhcmRcIiwgbmFtZTogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IGlkOiBcInN0b2NrXCIsIG5hbWU6IFwiU3RvY2tcIiB9LFxuICB7IGlkOiBcIm9wdGljXCIsIG5hbWU6IFwiT3B0aWNcIiB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJQQVJUUyIsImJyYW5kIiwiY2F0ZWdvcnlJZCIsInByaWNlIiwiYWZmaWxpYXRlVXJsIiwibm90ZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); /***/ }), diff --git a/.next/static/chunks/app/gunbuilder/admin/category-mappings/page.js b/.next/static/chunks/app/gunbuilder/admin/category-mappings/page.js index 208eaf2..8043cdc 100644 --- a/.next/static/chunks/app/gunbuilder/admin/category-mappings/page.js +++ b/.next/static/chunks/app/gunbuilder/admin/category-mappings/page.js @@ -46,7 +46,7 @@ eval(__webpack_require__.ts("var __dirname = \"/\";\n(function(){var e={229:func /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryMappingsPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Keep this in sync with your backend `partRole` values\nconst PART_ROLE_OPTIONS = [\n {\n value: \"\",\n label: \"— Unmapped —\"\n },\n {\n value: \"upper-receiver\",\n label: \"Upper Receiver\"\n },\n {\n value: \"barrel\",\n label: \"Barrel\"\n },\n {\n value: \"handguard\",\n label: \"Handguard\"\n },\n {\n value: \"charging-handle\",\n label: \"Charging Handle\"\n },\n {\n value: \"buffer-kit\",\n label: \"Buffer Kit\"\n },\n {\n value: \"lower-parts-kit\",\n label: \"Lower Parts Kit\"\n },\n {\n value: \"sight\",\n label: \"Sight / Optic\"\n },\n {\n value: \"lower-receiver\",\n label: \"Lower Receiver\"\n },\n {\n value: \"optic\",\n label: \"Optic\"\n },\n {\n value: \"stock\",\n label: \"Stock\"\n },\n {\n value: \"other\",\n label: \"Other / Ignore\"\n }\n];\nfunction CategoryMappingsPage() {\n var _merchants_find;\n _s();\n const [merchants, setMerchants] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [selectedMerchantId, setSelectedMerchantId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [mappings, setMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loadingMappings, setLoadingMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [saving, setSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [successMessage, setSuccessMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [showOnlyUnmapped, setShowOnlyUnmapped] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const sortedMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n // Mapped rows first, then unmapped; within each group, alpha by rawCategory\n return [\n ...mappings\n ].sort((a, b)=>{\n const aMapped = !!a.mappedPartRole;\n const bMapped = !!b.mappedPartRole;\n if (aMapped !== bMapped) {\n return aMapped ? -1 : 1; // mapped first\n }\n return a.rawCategory.localeCompare(b.rawCategory);\n });\n }, [\n mappings\n ]);\n const visibleMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>showOnlyUnmapped ? sortedMappings.filter((m)=>!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyUnmapped\n ]);\n // Load merchants\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n async function fetchMerchants() {\n try {\n const res = await fetch(\"\".concat(API_BASE_URL, \"/admin/merchants\"));\n if (!res.ok) {\n throw new Error(\"Failed to load merchants (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMerchants(data);\n // Auto-select the first merchant if you want\n if (data.length > 0 && selectedMerchantId === null) {\n setSelectedMerchantId(data[0].id);\n }\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load merchants\");\n }\n }\n fetchMerchants();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Load mappings for selected merchant\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!selectedMerchantId) return;\n const controller = new AbortController();\n async function fetchMappings() {\n try {\n setLoadingMappings(true);\n setError(null);\n setSuccessMessage(null);\n const url = \"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings?merchantId=\").concat(selectedMerchantId);\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load mappings (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMappings(data);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load mappings\");\n } finally{\n setLoadingMappings(false);\n }\n }\n fetchMappings();\n return ()=>controller.abort();\n }, [\n selectedMerchantId\n ]);\n const handleChangePartRole = (rawCategory, newRole)=>{\n setMappings((prev)=>prev.map((m)=>m.rawCategory === rawCategory ? {\n ...m,\n mappedPartRole: newRole || null\n } : m));\n };\n const handleSave = async ()=>{\n if (!selectedMerchantId) return;\n setSaving(true);\n setError(null);\n setSuccessMessage(null);\n try {\n // Save each mapping in parallel\n const requests = mappings.map((m)=>{\n const payload = {\n merchantId: selectedMerchantId,\n rawCategory: m.rawCategory,\n mappedPartRole: m.mappedPartRole\n };\n return fetch(\"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n });\n const responses = await Promise.all(requests);\n const failed = responses.filter((r)=>!r.ok);\n if (failed.length > 0) {\n throw new Error(\"Some mappings failed to save (\".concat(failed.length, \")\"));\n }\n setSuccessMessage(\"Mappings saved. Re-run the import to apply changes.\");\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to save mappings\");\n } finally{\n setSaving(false);\n }\n };\n var _merchants_find_name;\n const selectedMerchantName = (_merchants_find_name = (_merchants_find = merchants.find((m)=>m.id === selectedMerchantId)) === null || _merchants_find === void 0 ? void 0 : _merchants_find.name) !== null && _merchants_find_name !== void 0 ? _merchants_find_name : \"—\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-5xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-3 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard / Admin\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 195,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: \"Merchant Category Mapping\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 198,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Normalize each merchant's category names into your internal part roles (upper, barrel, handguard, etc.). Unmapped categories will be skipped during import until they are mapped here.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 201,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 194,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block text-xs font-semibold text-zinc-400 mb-1\",\n children: \"Select Merchant\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 209,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100\",\n value: selectedMerchantId !== null && selectedMerchantId !== void 0 ? selectedMerchantId : \"\",\n onChange: (e)=>setSelectedMerchantId(e.target.value ? Number(e.target.value) : null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"— Choose merchant —\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 221,\n columnNumber: 15\n }, this),\n merchants.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: m.id,\n children: m.name\n }, m.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 223,\n columnNumber: 17\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 212,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 208,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 193,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-red-500/60 bg-red-500/10 px-3 py-2 text-xs text-red-200\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 233,\n columnNumber: 13\n }, this),\n successMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs text-emerald-200\",\n children: successMessage\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n !selectedMerchantId ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Choose a merchant above to view category mappings.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this) : loadingMappings ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: [\n \"Loading mappings for \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 249,\n columnNumber: 36\n }, this),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this) : mappings.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No category rows yet for this merchant. Once you run an import, discovered categories will appear here automatically.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 252,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex items-center justify-between gap-3 text-xs text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n \"Mappings for\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 261,\n columnNumber: 19\n }, this),\n \".\",\n \" \",\n \"Set a part role for each raw category. Unmapped categories will be skipped by the importer.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 259,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"inline-flex items-center gap-1 text-[0.7rem] text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n className: \"h-3 w-3 rounded border-zinc-600 bg-zinc-900\",\n checked: showOnlyUnmapped,\n onChange: (e)=>setShowOnlyUnmapped(e.target.checked)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 266,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Show only unmapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 272,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 265,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 258,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 text-xs uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Raw Category\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 280,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Mapped Part Role\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 281,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 282,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 279,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 278,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: visibleMappings.map((m)=>/*#__PURE__*/ {\n var _m_mappedPartRole;\n return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-900 last:border-b-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-zinc-200\",\n children: m.rawCategory\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 291,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-2 py-1 text-xs text-zinc-100\",\n value: (_m_mappedPartRole = m.mappedPartRole) !== null && _m_mappedPartRole !== void 0 ? _m_mappedPartRole : \"\",\n onChange: (e)=>handleChangePartRole(m.rawCategory, e.target.value),\n children: PART_ROLE_OPTIONS.map((opt)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: opt.value,\n children: opt.label\n }, opt.value, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 306,\n columnNumber: 31\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 295,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 294,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-sm\",\n children: m.mappedPartRole ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-emerald-500/10 px-2 py-0.5 text-[0.7rem] font-medium text-emerald-300\",\n children: \"Mapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 314,\n columnNumber: 29\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-zinc-700/40 px-2 py-0.5 text-[0.7rem] font-medium text-zinc-300\",\n children: \"Unmapped / Ignored\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 318,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 312,\n columnNumber: 25\n }, this)\n ]\n }, m.rawCategory, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 287,\n columnNumber: 23\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 285,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 277,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 276,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleSave,\n disabled: saving,\n className: \"rounded-md bg-amber-400 px-4 py-2 text-sm font-semibold text-black hover:bg-amber-300 disabled:opacity-50\",\n children: saving ? \"Saving…\" : \"Save Mappings\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 330,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 329,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 231,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 192,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 191,\n columnNumber: 5\n }, this);\n}\n_s(CategoryMappingsPage, \"XrG2YFgqARx8YUXvuejT1mz+RHE=\");\n_c = CategoryMappingsPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryMappingsPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFcUQ7SUFHbkRHO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBcUIxQyx3REFBd0Q7QUFDeEQsTUFBTUksb0JBQW9CO0lBQ3hCO1FBQUVDLE9BQU87UUFBSUMsT0FBTztJQUFlO0lBQ25DO1FBQUVELE9BQU87UUFBa0JDLE9BQU87SUFBaUI7SUFDbkQ7UUFBRUQsT0FBTztRQUFVQyxPQUFPO0lBQVM7SUFDbkM7UUFBRUQsT0FBTztRQUFhQyxPQUFPO0lBQVk7SUFDekM7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQWNDLE9BQU87SUFBYTtJQUMzQztRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBQ3JEO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFnQjtJQUN6QztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFpQjtDQUMzQztBQUVjLFNBQVNDO1FBaUpwQkM7O0lBaEpGLE1BQU0sQ0FBQ0EsV0FBV0MsYUFBYSxHQUFHWCwrQ0FBUUEsQ0FBYSxFQUFFO0lBQ3pELE1BQU0sQ0FBQ1ksb0JBQW9CQyxzQkFBc0IsR0FBR2IsK0NBQVFBLENBQzFEO0lBRUYsTUFBTSxDQUFDYyxVQUFVQyxZQUFZLEdBQUdmLCtDQUFRQSxDQUFZLEVBQUU7SUFDdEQsTUFBTSxDQUFDZ0IsaUJBQWlCQyxtQkFBbUIsR0FBR2pCLCtDQUFRQSxDQUFDO0lBQ3ZELE1BQU0sQ0FBQ2tCLFFBQVFD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b0JBQUFBLEVBQUVOLGNBQWMsY0FBaEJNLCtCQUFBQSxvQkFBb0I7b0VBQzNCZ0QsVUFBVSxDQUFDQyxJQUNUNUIscUJBQ0VyQixFQUFFSixXQUFXLEVBQ2JxRCxFQUFFQyxNQUFNLENBQUNoRixLQUFLOzhFQUlqQkQsa0JBQWtCdUQsR0FBRyxDQUFDLENBQUN3QyxvQkFDdEIsOERBQUNaOzRFQUF1QmxGLE9BQU84RixJQUFJOUYsS0FBSztzRkFDckM4RixJQUFJN0YsS0FBSzsyRUFEQzZGLElBQUk5RixLQUFLOzs7Ozs7Ozs7Ozs7Ozs7MEVBTTVCLDhEQUFDNkY7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRU4sY0FBYyxpQkFDZiw4REFBQzREO29FQUFLWixXQUFVOzhFQUFpSDs7Ozs7eUZBSWpJLDhEQUFDWTtvRUFBS1osV0FBVTs4RUFBMkc7Ozs7Ozs7Ozs7Ozt1REE5QjFIMUMsRUFBRUosV0FBVzs7Ozs7Z0RBbUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OENBTVosOERBQUMrQztvQ0FBSUQsV0FBVTs4Q0FDYiw0RUFBQ3VCO3dDQUNDVCxNQUFLO3dDQUNMVSxTQUFTekM7d0NBQ1QwQyxVQUFVdEY7d0NBQ1Y2RCxXQUFVO2tEQUVUN0QsU0FBUyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTeEM7R0E5U3dCVDtLQUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIE1lcmNoYW50ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIE1hcHBpbmcgPSB7XG4gIGlkOiBudW1iZXIgfCBudWxsOyAgICAgICAgICAgLy8gbWlnaHQgYmUgbnVsbCBpZiBqdXN0IGNyZWF0ZWQgY2xpZW50LXNpZGVcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFVwc2VydFJlcXVlc3QgPSB7XG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHlvdXIgYmFja2VuZCBgcGFydFJvbGVgIHZhbHVlc1xuY29uc3QgUEFSVF9ST0xFX09QVElPTlMgPSBbXG4gIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIuKAlCBVbm1hcHBlZCDigJRcIiB9LFxuICB7IHZhbHVlOiBcInVwcGVyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJiYXJyZWxcIiwgbGFiZWw6IFwiQmFycmVsXCIgfSxcbiAgeyB2YWx1ZTogXCJoYW5kZ3VhcmRcIiwgbGFiZWw6IFwiSGFuZGd1YXJkXCIgfSxcbiAgeyB2YWx1ZTogXCJjaGFyZ2luZy1oYW5kbGVcIiwgbGFiZWw6IFwiQ2hhcmdpbmcgSGFuZGxlXCIgfSxcbiAgeyB2YWx1ZTogXCJidWZmZXIta2l0XCIsIGxhYmVsOiBcIkJ1ZmZlciBLaXRcIiB9LFxuICB7IHZhbHVlOiBcImxvd2VyLXBhcnRzLWtpdFwiLCBsYWJlbDogXCJMb3dlciBQYXJ0cyBLaXRcIiB9LFxuICB7IHZhbHVlOiBcInNpZ2h0XCIsIGxhYmVsOiBcIlNpZ2h0IC8gT3B0aWNcIiB9LFxuICB7IHZhbHVlOiBcImxvd2VyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJvcHRpY1wiLCBsYWJlbDogXCJPcHRpY1wiIH0sXG4gIHsgdmFsdWU6IFwic3RvY2tcIiwgbGFiZWw6IFwiU3RvY2tcIiB9LFxuICB7IHZhbHVlOiBcIm90aGVyXCIsIGxhYmVsOiBcIk90aGVyIC8gSWdub3JlXCIgfSxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5TWFwcGluZ3NQYWdlKCkge1xuICBjb25zdCBbbWVyY2hhbnRzLCBzZXRNZXJjaGFudHNdID0gdXNlU3RhdGU8TWVyY2hhbnRbXT4oW10pO1xuICBjb25zdCBbc2VsZWN0ZWRNZXJjaGFudElkLCBzZXRTZWxlY3RlZE1lcmNoYW50SWRdID0gdXNlU3RhdGU8bnVtYmVyIHwgbnVsbD4oXG4gICAgbnVsbCxcbiAgKTtcbiAgY29uc3QgW21hcHBpbmdzLCBzZXRNYXBwaW5nc10gPSB1c2VTdGF0ZTxNYXBwaW5nW10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmdNYXBwaW5ncywgc2V0TG9hZGluZ01hcHBpbmdzXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW3NhdmluZywgc2V0U2F2aW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3N1Y2Nlc3NNZXNzYWdlLCBzZXRTdWNjZXNzTWVzc2FnZV0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW3Nob3dPbmx5VW5tYXBwZWQsIHNldFNob3dPbmx5VW5tYXBwZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IHNvcnRlZE1hcHBpbmdzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gTWFwcGVkIHJvd3MgZmlyc3QsIHRoZW4gdW5tYXBwZWQ7IHdpdGhpbiBlYWNoIGdyb3VwLCBhbHBoYSBieSByYXdDYXRlZ29yeVxuICAgIHJldHVybiBbLi4ubWFwcGluZ3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFNYXBwZWQgPSAhIWEubWFwcGVkUGFydFJvbGU7XG4gICAgICBjb25zdCBiTWFwcGVkID0gISFiLm1hcHBlZFBhcnRSb2xlO1xuXG4gICAgICBpZiAoYU1hcHBlZCAhPT0gYk1hcHBlZCkge1xuICAgICAgICByZXR1cm4gYU1hcHBlZCA/IC0xIDogMTsgLy8gbWFwcGVkIGZpcnN0XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLnJhd0NhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5yYXdDYXRlZ29yeSk7XG4gICAgfSk7XG4gIH0sIFttYXBwaW5nc10pO1xuXG4gIGNvbnN0IHZpc2libGVNYXBwaW5ncyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIHNob3dPbmx5VW5tYXBwZWRcbiAgICAgICAgPyBzb3J0ZWRNYXBwaW5ncy5maWx0ZXIoKG0pID0+ICFtLm1hcHBlZFBhcnRSb2xlKVxuICAgICAgICA6IHNvcnRlZE1hcHBpbmdzLFxuICAgIFtzb3J0ZWRNYXBwaW5ncywgc2hvd09ubHlVbm1hcHBlZF0sXG4gICk7XG5cbiAgLy8gTG9hZCBtZXJjaGFudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaE1lcmNoYW50cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnRzYCk7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YTogTWVyY2hhbnRbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIHNldE1lcmNoYW50cyhkYXRhKTtcblxuICAgICAgICAvLyBBdXRvLXNlbGVjdCB0aGUgZmlyc3QgbWVyY2hhbnQgaWYgeW91IHdhbnRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1lcmNoYW50SWQgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoZGF0YVswXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHNcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZXJjaGFudHMoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBMb2FkIG1hcHBpbmdzIGZvciBzZWxlY3RlZCBtZXJjaGFudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNYXBwaW5ncygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3M/bWVyY2hhbnRJZD0ke3NlbGVjdGVkTWVyY2hhbnRJZH1gO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3MgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIE1hcHBpbmdbXTtcbiAgICAgICAgc2V0TWFwcGluZ3MoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtYXBwaW5nc1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNYXBwaW5ncygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW3NlbGVjdGVkTWVyY2hhbnRJZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVBhcnRSb2xlID0gKHJhd0NhdGVnb3J5OiBzdHJpbmcsIG5ld1JvbGU6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcHBpbmdzKChwcmV2KSA9PlxuICAgICAgcHJldi5tYXAoKG0pID0+XG4gICAgICAgIG0ucmF3Q2F0ZWdvcnkgPT09IHJhd0NhdGVnb3J5XG4gICAgICAgICAgPyB7IC4uLm0sIG1hcHBlZFBhcnRSb2xlOiBuZXdSb2xlIHx8IG51bGwgfVxuICAgICAgICAgIDogbSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG4gICAgc2V0U2F2aW5nKHRydWUpO1xuICAgIHNldEVycm9yKG51bGwpO1xuICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhdmUgZWFjaCBtYXBwaW5nIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCByZXF1ZXN0czogUHJvbWlzZTxSZXNwb25zZT5bXSA9IG1hcHBpbmdzLm1hcCgobSkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBVcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1lcmNoYW50SWQ6IHNlbGVjdGVkTWVyY2hhbnRJZCxcbiAgICAgICAgICByYXdDYXRlZ29yeTogbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICBtYXBwZWRQYXJ0Um9sZTogbS5tYXBwZWRQYXJ0Um9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9hZG1pbi9tZXJjaGFudC1jYXRlZ29yeS1tYXBwaW5nc2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3BvbnNlcy5maWx0ZXIoKHIpID0+ICFyLm9rKTtcblxuICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU29tZSBtYXBwaW5ncyBmYWlsZWQgdG8gc2F2ZSAoJHtmYWlsZWQubGVuZ3RofSlgKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3VjY2Vzc01lc3NhZ2UoXCJNYXBwaW5ncyBzYXZlZC4gUmUtcnVuIHRoZSBpbXBvcnQgdG8gYXBwbHkgY2hhbmdlcy5cIik7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIHNhdmUgbWFwcGluZ3NcIik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkTWVyY2hhbnROYW1lID1cbiAgICBtZXJjaGFudHMuZmluZCgobSkgPT4gbS5pZCA9PT0gc2VsZWN0ZWRNZXJjaGFudElkKT8ubmFtZSA/PyBcIuKAlFwiO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTV4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmQgLyBBZG1pblxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBNZXJjaGFudCBDYXRlZ29yeSBNYXBwaW5nXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgTm9ybWFsaXplIGVhY2ggbWVyY2hhbnQmYXBvcztzIGNhdGVnb3J5IG5hbWVzIGludG8geW91ciBpbnRlcm5hbFxuICAgICAgICAgICAgICBwYXJ0IHJvbGVzICh1cHBlciwgYmFycmVsLCBoYW5kZ3VhcmQsIGV0Yy4pLiBVbm1hcHBlZCBjYXRlZ29yaWVzXG4gICAgICAgICAgICAgIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgaW1wb3J0IHVudGlsIHRoZXkgYXJlIG1hcHBlZCBoZXJlLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMCBtYi0xXCI+XG4gICAgICAgICAgICAgIFNlbGVjdCBNZXJjaGFudFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRNZXJjaGFudElkID8/IFwiXCJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoXG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA/IE51bWJlcihlLnRhcmdldC52YWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+4oCUIENob29zZSBtZXJjaGFudCDigJQ8L29wdGlvbj5cbiAgICAgICAgICAgICAge21lcmNoYW50cy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17bS5pZH0gdmFsdWU9e20uaWR9PlxuICAgICAgICAgICAgICAgICAge20ubmFtZX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1yZWQtNTAwLzYwIGJnLXJlZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1yZWQtMjAwXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItZW1lcmFsZC01MDAvNjAgYmctZW1lcmFsZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1lbWVyYWxkLTIwMFwiPlxuICAgICAgICAgICAgICB7c3VjY2Vzc01lc3NhZ2V9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgeyFzZWxlY3RlZE1lcmNoYW50SWQgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgQ2hvb3NlIGEgbWVyY2hhbnQgYWJvdmUgdG8gdmlldyBjYXRlZ29yeSBtYXBwaW5ncy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbG9hZGluZ01hcHBpbmdzID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgbWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPuKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBtYXBwaW5ncy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgTm8gY2F0ZWdvcnkgcm93cyB5ZXQgZm9yIHRoaXMgbWVyY2hhbnQuIE9uY2UgeW91IHJ1biBhbiBpbXBvcnQsXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQgY2F0ZWdvcmllcyB3aWxsIGFwcGVhciBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIE1hcHBpbmdzIGZvcntcIiBcIn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPi57XCIgXCJ9XG4gICAgICAgICAgICAgICAgICBTZXQgYSBwYXJ0IHJvbGUgZm9yIGVhY2ggcmF3IGNhdGVnb3J5LiBVbm1hcHBlZCBjYXRlZ29yaWVzIHdpbGxcbiAgICAgICAgICAgICAgICAgIGJlIHNraXBwZWQgYnkgdGhlIGltcG9ydGVyLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgdGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctMyByb3VuZGVkIGJvcmRlci16aW5jLTYwMCBiZy16aW5jLTkwMFwiXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Nob3dPbmx5VW5tYXBwZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2hvd09ubHlVbm1hcHBlZChlLnRhcmdldC5jaGVja2VkKX1cbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj5TaG93IG9ubHkgdW5tYXBwZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwibWluLXctZnVsbCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgdGV4dC14cyB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+UmF3IENhdGVnb3J5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPk1hcHBlZCBQYXJ0IFJvbGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHt2aXNpYmxlTWFwcGluZ3MubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy05MDAgbGFzdDpib3JkZXItYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXppbmMtMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAgcHgtMiBweS0xIHRleHQteHMgdGV4dC16aW5jLTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e20ubWFwcGVkUGFydFJvbGUgPz8gXCJcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2VQYXJ0Um9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1BBUlRfUk9MRV9PUFRJT05TLm1hcCgob3B0KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0LnZhbHVlfSB2YWx1ZT17b3B0LnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29wdC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLm1hcHBlZFBhcnRSb2xlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctZW1lcmFsZC01MDAvMTAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LWVtZXJhbGQtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBiZy16aW5jLTcwMC80MCBweC0yIHB5LTAuNSB0ZXh0LVswLjdyZW1dIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubWFwcGVkIC8gSWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTYXZlfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NhdmluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYmctYW1iZXItNDAwIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDAgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3NhdmluZyA/IFwiU2F2aW5n4oCmXCIgOiBcIlNhdmUgTWFwcGluZ3NcIn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlTWVtbyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJQQVJUX1JPTEVfT1BUSU9OUyIsInZhbHVlIiwibGFiZWwiLCJDYXRlZ29yeU1hcHBpbmdzUGFnZSIsIm1lcmNoYW50cyIsInNldE1lcmNoYW50cyIsInNlbGVjdGVkTWVyY2hhbnRJZCIsInNldFNlbGVjdGVkTWVyY2hhbnRJZCIsIm1hcHBpbmdzIiwic2V0TWFwcGluZ3MiLCJsb2FkaW5nTWFwcGluZ3MiLCJzZXRMb2FkaW5nTWFwcGluZ3MiLCJzYXZpbmciLCJzZXRTYXZpbmciLCJlcnJvciIsInNldEVycm9yIiwic3VjY2Vzc01lc3NhZ2UiLCJzZXRTdWNjZXNzTWVzc2FnZSIsInNob3dPbmx5VW5tYXBwZWQiLCJzZXRTaG93T25seVVubWFwcGVkIiwic29ydGVkTWFwcGluZ3MiLCJzb3J0IiwiYSIsImIiLCJhTWFwcGVkIiwibWFwcGVkUGFydFJvbGUiLCJiTWFwcGVkIiwicmF3Q2F0ZWdvcnkiLCJsb2NhbGVDb21wYXJlIiwidmlzaWJsZU1hcHBpbmdzIiwiZmlsdGVyIiwibSIsImZldGNoTWVyY2hhbnRzIiwicmVzIiwiZmV0Y2giLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJsZW5ndGgiLCJpZCIsImVyciIsImNvbnNvbGUiLCJtZXNzYWdlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoTWFwcGluZ3MiLCJ1cmwiLCJzaWduYWwiLCJuYW1lIiwiYWJvcnQiLCJoYW5kbGVDaGFuZ2VQYXJ0Um9sZSIsIm5ld1JvbGUiLCJwcmV2IiwibWFwIiwiaGFuZGxlU2F2ZSIsInJlcXVlc3RzIiwicGF5bG9hZCIsIm1lcmNoYW50SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwiZmFpbGVkIiwiciIsInNlbGVjdGVkTWVyY2hhbnROYW1lIiwiZmluZCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoZWFkZXIiLCJwIiwiaDEiLCJzZWxlY3QiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJOdW1iZXIiLCJvcHRpb24iLCJzZWN0aW9uIiwic3BhbiIsImlucHV0IiwidHlwZSIsImNoZWNrZWQiLCJ0YWJsZSIsInRoZWFkIiwidHIiLCJ0aCIsInRib2R5IiwidGQiLCJvcHQiLCJidXR0b24iLCJvbkNsaWNrIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryMappingsPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Keep this in sync with your backend `partRole` values\nconst PART_ROLE_OPTIONS = [\n {\n value: \"\",\n label: \"— Unmapped —\"\n },\n // Lower / fire control\n {\n value: \"lower-receiver\",\n label: \"Lower Receiver\"\n },\n {\n value: \"lower-parts-kit\",\n label: \"Lower Parts Kit\"\n },\n {\n value: \"trigger\",\n label: \"Trigger / Trigger Kit\"\n },\n {\n value: \"pistol-grip\",\n label: \"Pistol Grip\"\n },\n {\n value: \"safety-selector\",\n label: \"Safety Selector\"\n },\n // Upper\n {\n value: \"upper-receiver\",\n label: \"Upper Receiver\"\n },\n {\n value: \"barrel\",\n label: \"Barrel\"\n },\n {\n value: \"handguard\",\n label: \"Handguard\"\n },\n {\n value: \"gas-system\",\n label: \"Gas System / Gas Block\"\n },\n {\n value: \"muzzle-device\",\n label: \"Muzzle Device\"\n },\n {\n value: \"suppressor\",\n label: \"Suppressor\"\n },\n // Furniture / sights / optics\n {\n value: \"stock\",\n label: \"Stock\"\n },\n {\n value: \"buffer-kit\",\n label: \"Buffer Kit\"\n },\n {\n value: \"charging-handle\",\n label: \"Charging Handle\"\n },\n {\n value: \"sight\",\n label: \"Iron / Backup Sight\"\n },\n {\n value: \"optic\",\n label: \"Optic\"\n },\n {\n value: \"other\",\n label: \"Other / Ignore\"\n }\n];\nfunction CategoryMappingsPage() {\n var _merchants_find;\n _s();\n const [merchants, setMerchants] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [selectedMerchantId, setSelectedMerchantId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [mappings, setMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loadingMappings, setLoadingMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [saving, setSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [successMessage, setSuccessMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [showOnlyUnmapped, setShowOnlyUnmapped] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const sortedMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n // Mapped rows first, then unmapped; within each group, alpha by rawCategory\n return [\n ...mappings\n ].sort((a, b)=>{\n const aMapped = !!a.mappedPartRole;\n const bMapped = !!b.mappedPartRole;\n if (aMapped !== bMapped) {\n return aMapped ? -1 : 1; // mapped first\n }\n return a.rawCategory.localeCompare(b.rawCategory);\n });\n }, [\n mappings\n ]);\n const visibleMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>showOnlyUnmapped ? sortedMappings.filter((m)=>!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyUnmapped\n ]);\n // Load merchants\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n async function fetchMerchants() {\n try {\n const res = await fetch(\"\".concat(API_BASE_URL, \"/admin/merchants\"));\n if (!res.ok) {\n throw new Error(\"Failed to load merchants (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMerchants(data);\n // Auto-select the first merchant if you want\n if (data.length > 0 && selectedMerchantId === null) {\n setSelectedMerchantId(data[0].id);\n }\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load merchants\");\n }\n }\n fetchMerchants();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Load mappings for selected merchant\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!selectedMerchantId) return;\n const controller = new AbortController();\n async function fetchMappings() {\n try {\n setLoadingMappings(true);\n setError(null);\n setSuccessMessage(null);\n const url = \"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings?merchantId=\").concat(selectedMerchantId);\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load mappings (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMappings(data);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load mappings\");\n } finally{\n setLoadingMappings(false);\n }\n }\n fetchMappings();\n return ()=>controller.abort();\n }, [\n selectedMerchantId\n ]);\n const handleChangePartRole = (rawCategory, newRole)=>{\n setMappings((prev)=>prev.map((m)=>m.rawCategory === rawCategory ? {\n ...m,\n mappedPartRole: newRole || null\n } : m));\n };\n const handleSave = async ()=>{\n if (!selectedMerchantId) return;\n setSaving(true);\n setError(null);\n setSuccessMessage(null);\n try {\n // Save each mapping in parallel\n const requests = mappings.map((m)=>{\n const payload = {\n merchantId: selectedMerchantId,\n rawCategory: m.rawCategory,\n mappedPartRole: m.mappedPartRole\n };\n return fetch(\"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n });\n const responses = await Promise.all(requests);\n const failed = responses.filter((r)=>!r.ok);\n if (failed.length > 0) {\n throw new Error(\"Some mappings failed to save (\".concat(failed.length, \")\"));\n }\n setSuccessMessage(\"Mappings saved. Re-run the import to apply changes.\");\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to save mappings\");\n } finally{\n setSaving(false);\n }\n };\n var _merchants_find_name;\n const selectedMerchantName = (_merchants_find_name = (_merchants_find = merchants.find((m)=>m.id === selectedMerchantId)) === null || _merchants_find === void 0 ? void 0 : _merchants_find.name) !== null && _merchants_find_name !== void 0 ? _merchants_find_name : \"—\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-5xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-3 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard / Admin\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 206,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: \"Merchant Category Mapping\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 209,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Normalize each merchant's category names into your internal part roles (upper, barrel, handguard, etc.). Unmapped categories will be skipped during import until they are mapped here.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 212,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 205,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block text-xs font-semibold text-zinc-400 mb-1\",\n children: \"Select Merchant\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 220,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100\",\n value: selectedMerchantId !== null && selectedMerchantId !== void 0 ? selectedMerchantId : \"\",\n onChange: (e)=>setSelectedMerchantId(e.target.value ? Number(e.target.value) : null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"— Choose merchant —\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 232,\n columnNumber: 15\n }, this),\n merchants.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: m.id,\n children: m.name\n }, m.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 234,\n columnNumber: 17\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 219,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 204,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-red-500/60 bg-red-500/10 px-3 py-2 text-xs text-red-200\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n successMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs text-emerald-200\",\n children: successMessage\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 249,\n columnNumber: 13\n }, this),\n !selectedMerchantId ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Choose a merchant above to view category mappings.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this) : loadingMappings ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: [\n \"Loading mappings for \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 260,\n columnNumber: 36\n }, this),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this) : mappings.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No category rows yet for this merchant. Once you run an import, discovered categories will appear here automatically.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex items-center justify-between gap-3 text-xs text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n \"Mappings for\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 272,\n columnNumber: 19\n }, this),\n \".\",\n \" \",\n \"Set a part role for each raw category. Unmapped categories will be skipped by the importer.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 270,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"inline-flex items-center gap-1 text-[0.7rem] text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n className: \"h-3 w-3 rounded border-zinc-600 bg-zinc-900\",\n checked: showOnlyUnmapped,\n onChange: (e)=>setShowOnlyUnmapped(e.target.checked)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 277,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Show only unmapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 283,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 276,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 269,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 text-xs uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Raw Category\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 291,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Mapped Part Role\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 292,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 293,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 290,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 289,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: visibleMappings.map((m)=>/*#__PURE__*/ {\n var _m_mappedPartRole;\n return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-900 last:border-b-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-zinc-200\",\n children: m.rawCategory\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 302,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-2 py-1 text-xs text-zinc-100\",\n value: (_m_mappedPartRole = m.mappedPartRole) !== null && _m_mappedPartRole !== void 0 ? _m_mappedPartRole : \"\",\n onChange: (e)=>handleChangePartRole(m.rawCategory, e.target.value),\n children: PART_ROLE_OPTIONS.map((opt)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: opt.value,\n children: opt.label\n }, opt.value, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 317,\n columnNumber: 31\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 306,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 305,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-sm\",\n children: m.mappedPartRole ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-emerald-500/10 px-2 py-0.5 text-[0.7rem] font-medium text-emerald-300\",\n children: \"Mapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 325,\n columnNumber: 29\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-zinc-700/40 px-2 py-0.5 text-[0.7rem] font-medium text-zinc-300\",\n children: \"Unmapped / Ignored\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 329,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 323,\n columnNumber: 25\n }, this)\n ]\n }, m.rawCategory, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 298,\n columnNumber: 23\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 296,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 287,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleSave,\n disabled: saving,\n className: \"rounded-md bg-amber-400 px-4 py-2 text-sm font-semibold text-black hover:bg-amber-300 disabled:opacity-50\",\n children: saving ? \"Saving…\" : \"Save Mappings\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 340,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 203,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 202,\n columnNumber: 5\n }, this);\n}\n_s(CategoryMappingsPage, \"XrG2YFgqARx8YUXvuejT1mz+RHE=\");\n_c = CategoryMappingsPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryMappingsPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFcUQ7SUFHbkRHO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBcUIxQyx3REFBd0Q7QUFDeEQsTUFBTUksb0JBQW9CO0lBQ3hCO1FBQUVDLE9BQU87UUFBSUMsT0FBTztJQUFlO0lBQ25DLHVCQUF1QjtJQUN2QjtRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFXQyxPQUFPO0lBQXdCO0lBQ25EO1FBQUVELE9BQU87UUFBZUMsT0FBTztJQUFjO0lBQzdDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFFckQsUUFBUTtJQUNSO1FBQUVELE9BQU87UUFBa0JDLE9BQU87SUFBaUI7SUFDbkQ7UUFBRUQsT0FBTztRQUFVQyxPQUFPO0lBQVM7SUFDbkM7UUFBRUQsT0FBTztRQUFhQyxPQUFPO0lBQVk7SUFDekM7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQXlCO0lBQ3ZEO1FBQUVELE9BQU87UUFBaUJDLE9BQU87SUFBZ0I7SUFDakQ7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQWE7SUFFM0MsOEJBQThCO0lBQzlCO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBY0MsT0FBTztJQUFhO0lBQzNDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFTQyxPQUFPO0lBQXNCO0lBQy9DO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFpQjtDQUMzQztBQUVjLFNBQVNDO1FBaUpwQkM7O0lBaEpGLE1BQU0sQ0FBQ0EsV0FBV0MsYUFBYSxHQUFHWCwrQ0FBUUEsQ0FBYSxFQUFFO0lBQ3pELE1BQU0sQ0FBQ1ksb0JBQW9CQyxzQkFBc0IsR0FBR2IsK0NBQVFBLENBQzFEO0lBRUYsTUFBTSxDQUFDYyxVQUFVQyxZQUFZLEdBQUdmLCtDQUFRQSxDQUFZLEVBQUU7SUFDdEQsTUFBTSxDQUFDZ0IsaUJBQWlCQyxtQkFBbUIsR0FBR2pCLCtDQUFRQSxDQUFDO0lBQ3ZELE1BQU0sQ0FBQ2tCLFFBQVFDLFVBQVUsR0FBR25CLCtDQUFRQSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQ29CLE9BQU9DLFNBQVMsR0FBR3JCLCtDQUFRQSxDQUFnQjtJQUNsRCxNQUFNLENBQUNzQixnQkFBZ0JDLGtCQUFrQixHQUFHdkIsK0NBQVFBLENBQWdCO0lBQ3BFLE1BQU0sQ0FBQ3dCLGtCQUFrQkMsb0JBQW9CLEdBQUd6QiwrQ0FBUUEsQ0FBQztJQUV6RCxNQUFNMEIsaUJBQWlCekIsOENBQU9BLENBQUM7UUFDN0IsNEVBQTRFO1FBQzVFLE9BQU87ZUFBSWE7U0FBUyxDQUFDYSxJQUFJLENBQUMsQ0FBQ0MsR0FBR0M7WUFDNUIsTUFBTUMsVUFBVSxDQUFDLENBQUNGLEVBQUVHLGNBQWM7WUFDbEMsTUFBTUMsVUFBVSxDQUFDLENBQUNILEVBQUVFLGNBQWM7WUFFbEMsSUFBSUQsWUFBWUUsU0FBUztnQkFDdkIsT0FBT0YsVUFBVSxDQUFDLElBQUksR0FBRyxlQUFlO1lBQzFDO1lBRUEsT0FBT0YsRUFBRUssV0FBVyxDQUFDQyxhQUFhLENBQUNMLEVBQUVJLFdBQVc7UUFDbEQ7SUFDRixHQUFHO1FBQUNuQjtLQUFTO0lBRWIsTUFBTXFCLGtCQUFrQmxDLDhDQUFPQSxDQUM3QixJQUNFdUIsbUJBQ0lFLGVBQWVVLE1BQU0sQ0FBQyxDQUFDQyxJQUFNLENBQUNBLEVBQUVOLGNBQWMsSUFDOUNMLGdCQUNOO1FBQUNBO1FBQWdCRjtLQUFpQjtJQUdwQyxpQkFBaUI7SUFDakJ6QixnREFBU0EsQ0FBQztRQUNSLGVBQWV1QztZQUNiLElBQUk7Z0JBQ0YsTUFBTUMsTUFBTSxNQUFNQyxNQUFNLEdBQWdCLE9BQWJyQyxjQUFhO2dCQUN4QyxJQUFJLENBQUNvQyxJQUFJRSxFQUFFLEVBQUU7b0JBQ1gsTUFBTSxJQUFJQyxNQUFNLDZCQUF3QyxPQUFYSCxJQUFJSSxNQUFNLEVBQUM7Z0JBQzFEO2dCQUNBLE1BQU1DLE9BQW1CLE1BQU1MLElBQUlNLElBQUk7Z0JBQ3ZDbEMsYUFBYWlDO2dCQUViLDZDQUE2QztnQkFDN0MsSUFBSUEsS0FBS0UsTUFBTSxHQUFHLEtBQUtsQyx1QkFBdUIsTUFBTTtvQkFDbERDLHNCQUFzQitCLElBQUksQ0FBQyxFQUFFLENBQUNHLEVBQUU7Z0JBQ2xDO1lBQ0YsRUFBRSxPQUFPQyxLQUFVO2dCQUNqQkMsUUFBUTdCLEtBQUssQ0FBQzRCO29CQUNMQTtnQkFBVDNCLFNBQVMyQixDQUFBQSxlQUFBQSxJQUFJRSxPQUFPLGNBQVhGLDBCQUFBQSxlQUFlO1lBQzFCO1FBQ0Y7UUFFQVY7SUFDQSx1REFBdUQ7SUFDekQsR0FBRyxFQUFFO0lBRUwsc0NBQXNDO0lBQ3RDdkMsZ0RBQVNBLENBQUM7UUFDUixJQUFJLENBQUNhLG9CQUFvQjtRQUV6QixNQUFNdUMsYUFBYSxJQUFJQztRQUV2QixlQUFlQztZQUNiLElBQUk7Z0JBQ0ZwQyxtQkFBbUI7Z0JBQ25CSSxTQUFTO2dCQUNURSxrQkFBa0I7Z0JBRWxCLE1BQU0rQixNQUFNLEdBQStEMUMsT0FBNURULGNBQWEsaURBQWtFLE9BQW5CUztnQkFDM0UsTUFBTTJCLE1BQU0sTUFBTUMsTUFBTWMsS0FBSztvQkFBRUMsUUFBUUosV0FBV0ksTUFBTTtnQkFBQztnQkFFekQsSUFBSSxDQUFDaEIsSUFBSUUsRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSUMsTUFBTSw0QkFBdUMsT0FBWEgsSUFBSUksTUFBTSxFQUFDO2dCQUN6RDtnQkFFQSxNQUFNQyxPQUFRLE1BQU1MLElBQUlNLElBQUk7Z0JBQzVCOUIsWUFBWTZCO1lBQ2QsRUFBRSxPQUFPSSxLQUFVO2dCQUNqQixJQUFJQSxJQUFJUSxJQUFJLEtBQUssY0FBYztnQkFDL0JQLFFBQVE3QixLQUFLLENBQUM0QjtvQkFDTEE7Z0JBQVQzQixTQUFTMkIsQ0FBQUEsZUFBQUEsSUFBSUUsT0FBTyxjQUFYRiwwQkFBQUEsZUFBZTtZQUMxQixTQUFVO2dCQUNSL0IsbUJBQW1CO1lBQ3JCO1FBQ0Y7UUFFQW9DO1FBRUEsT0FBTyxJQUFNRixXQUFXTSxLQUFLO0lBQy9CLEdBQUc7UUFBQzdDO0tBQW1CO0lBRXZCLE1BQU04Qyx1QkFBdUIsQ0FBQ3pCLGFBQXFCMEI7UUFDakQ1QyxZQUFZLENBQUM2QyxPQUNYQSxLQUFLQyxHQUFHLENBQUMsQ0FBQ3hCLElBQ1JBLEVBQUVKLFdBQVcsS0FBS0EsY0FDZDtvQkFBRSxHQUFHSSxDQUFDO29CQUFFTixnQkFBZ0I0QixXQUFXO2dCQUFLLElBQ3hDdEI7SUFHVjtJQUVBLE1BQU15QixhQUFhO1FBQ2pCLElBQUksQ0FBQ2xELG9CQUFvQjtRQUN6Qk8sVUFBVTtRQUNWRSxTQUFTO1FBQ1RFLGtCQUFrQjtRQUVsQixJQUFJO1lBQ0YsZ0NBQWdDO1lBQ2hDLE1BQU13QyxXQUFnQ2pELFNBQVMrQyxHQUFHLENBQUMsQ0FBQ3hCO2dCQUNsRCxNQUFNMkIsVUFBeUI7b0JBQzdCQyxZQUFZckQ7b0JBQ1pxQixhQUFhSSxFQUFFSixXQUFXO29CQUMxQkYsZ0JBQWdCTSxFQUFFTixjQUFjO2dCQUNsQztnQkFFQSxPQUFPUyxNQUFNLEdBQWdCLE9BQWJyQyxjQUFhLHNDQUFvQztvQkFDL0QrRCxRQUFRO29CQUNSQyxTQUFTO3dCQUNQLGdCQUFnQjtvQkFDbEI7b0JBQ0FDLE1BQU1DLEtBQUtDLFNBQVMsQ0FBQ047Z0JBQ3ZCO1lBQ0Y7WUFFQSxNQUFNTyxZQUFZLE1BQU1DLFFBQVFDLEdBQUcsQ0FBQ1Y7WUFDcEMsTUFBTVcsU0FBU0gsVUFBVW5DLE1BQU0sQ0FBQyxDQUFDdUMsSUFBTSxDQUFDQSxFQUFFbEMsRUFBRTtZQUU1QyxJQUFJaUMsT0FBTzVCLE1BQU0sR0FBRyxHQUFHO2dCQUNyQixNQUFNLElBQUlKLE1BQU0saUNBQStDLE9BQWRnQyxPQUFPNUIsTUFBTSxFQUFDO1lBQ2pFO1lBRUF2QixrQkFBa0I7UUFDcEIsRUFBRSxPQUFPeUIsS0FBVTtZQUNqQkMsUUFBUTdCLEtBQUssQ0FBQzRCO2dCQUNMQTtZQUFUM0IsU0FBUzJCLENBQUFBLGVBQUFBLElBQUlFLE9BQU8sY0FBWEYsMEJBQUFBLGVBQWU7UUFDMUIsU0FBVTtZQUNSN0IsVUFBVTtRQUNaO0lBQ0Y7UUFHRVQ7SUFERixNQUFNa0UsdUJBQ0psRSxDQUFBQSx3QkFBQUEsa0JBQUFBLFVBQVVtRSxJQUFJLENBQUMsQ0FBQ3hDLElBQU1BLEVBQUVVLEVBQUUsS0FBS25DLGlDQUEvQkYsc0NBQUFBLGdCQUFvRDhDLElBQUksY0FBeEQ5QyxrQ0FBQUEsdUJBQTREO0lBRTlELHFCQUNFLDhEQUFDb0U7UUFBS0MsV0FBVTtrQkFDZCw0RUFBQ0M7WUFBSUQsV0FBVTs7OEJBQ2IsOERBQUNFO29CQUFPRixXQUFVOztzQ0FDaEIsOERBQUNDOzs4Q0FDQyw4REFBQ0U7b0NBQUVILFdBQVU7OENBQWlFOzs7Ozs7OENBRzlFLDhEQUFDSTtvQ0FBR0osV0FBVTs4Q0FBeUQ7Ozs7Ozs4Q0FHdkUsOERBQUNHO29DQUFFSCxXQUFVOzhDQUFzQzs7Ozs7Ozs7Ozs7O3NDQU9yRCw4REFBQ0M7NEJBQUlELFdBQVU7OzhDQUNiLDhEQUFDdkU7b0NBQU11RSxXQUFVOzhDQUFpRDs7Ozs7OzhDQUdsRSw4REFBQ0s7b0NBQ0NMLFdBQVU7b0NBQ1Z4RSxPQUFPSywrQkFBQUEsZ0NBQUFBLHFCQUFzQjtvQ0FDN0J5RSxVQUFVLENBQUNDLElBQ1R6RSxzQkFDRXlFLEVBQUVDLE1BQU0sQ0FBQ2hGLEtBQUssR0FBR2lGLE9BQU9GLEVBQUVDLE1BQU0sQ0FBQ2hGLEtBQUssSUFBSTs7c0RBSTlDLDhEQUFDa0Y7NENBQU9sRixPQUFNO3NEQUFHOzs7Ozs7d0NBQ2hCRyxVQUFVbUQsR0FBRyxDQUFDLENBQUN4QixrQkFDZCw4REFBQ29EO2dEQUFrQmxGLE9BQU84QixFQUFFVSxFQUFFOzBEQUMzQlYsRUFBRW1CLElBQUk7K0NBREluQixFQUFFVSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4QkFRekIsOERBQUMyQztvQkFBUVgsV0FBVTs7d0JBQ2hCM0QsdUJBQ0MsOERBQUM0RDs0QkFBSUQsV0FBVTtzQ0FDWjNEOzs7Ozs7d0JBR0pFLGdDQUNDLDhEQUFDMEQ7NEJBQUlELFdBQVU7c0NBQ1p6RDs7Ozs7O3dCQUlKLENBQUNWLG1DQUNBLDhEQUFDc0U7NEJBQUVILFdBQVU7c0NBQXdCOzs7OzttQ0FHbkMvRCxnQ0FDRiw4REFBQ2tFOzRCQUFFSCxXQUFVOztnQ0FBd0I7OENBQ2QsOERBQUNZO29DQUFLWixXQUFVOzhDQUFpQkg7Ozs7OztnQ0FBNEI7Ozs7OzttQ0FFbEY5RCxTQUFTZ0MsTUFBTSxLQUFLLGtCQUN0Qiw4REFBQ29DOzRCQUFFSCxXQUFVO3NDQUF3Qjs7Ozs7aURBS3JDOzs4Q0FDRSw4REFBQ0M7b0NBQUlELFdBQVU7O3NEQUNiLDhEQUFDQzs7Z0RBQUk7Z0RBQ1U7OERBQ2IsOERBQUNXO29EQUFLWixXQUFVOzhEQUFpQkg7Ozs7OztnREFBNEI7Z0RBQUU7Z0RBQUk7Ozs7Ozs7c0RBSXJFLDhEQUFDcEU7NENBQU11RSxXQUFVOzs4REFDZiw4REFBQ2E7b0RBQ0NDLE1BQUs7b0RBQ0xkLFdBQVU7b0RBQ1ZlLFNBQVN0RTtvREFDVDZELFVBQVUsQ0FBQ0MsSUFBTTdELG9CQUFvQjZELEVBQUVDLE1BQU0sQ0FBQ08sT0FBTzs7Ozs7OzhEQUV2RCw4REFBQ0g7OERBQUs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0FJViw4REFBQ1g7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUNnQjt3Q0FBTWhCLFdBQVU7OzBEQUNmLDhEQUFDaUI7MERBQ0MsNEVBQUNDO29EQUFHbEIsV0FBVTs7c0VBQ1osOERBQUNtQjs0REFBR25CLFdBQVU7c0VBQXNCOzs7Ozs7c0VBQ3BDLDhEQUFDbUI7NERBQUduQixXQUFVO3NFQUFzQjs7Ozs7O3NFQUNwQyw4REFBQ21COzREQUFHbkIsV0FBVTtzRUFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzBEQUd4Qyw4REFBQ29COzBEQUNFaEUsZ0JBQWdCMEIsR0FBRyxDQUFDLENBQUN4Qjt3REFXUEE7MkRBVmIsOERBQUM0RDt3REFFQ2xCLFdBQVU7OzBFQUVWLDhEQUFDcUI7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRUosV0FBVzs7Ozs7OzBFQUVoQiw4REFBQ21FO2dFQUFHckIsV0FBVTswRUFDWiw0RUFBQ0s7b0VBQ0NMLFdBQVU7b0VBQ1Z4RSxPQUFPOEIsQ0FBQUEsb0JBQUFBLEVBQUVOLGNBQWMsY0FBaEJNLCtCQUFBQSxvQkFBb0I7b0VBQzNCZ0QsVUFBVSxDQUFDQyxJQUNUNUIscUJBQ0VyQixFQUFFSixXQUFXLEVBQ2JxRCxFQUFFQyxNQUFNLENBQUNoRixLQUFLOzhFQUlqQkQsa0JBQWtCdUQsR0FBRyxDQUFDLENBQUN3QyxvQkFDdEIsOERBQUNaOzRFQUF1QmxGLE9BQU84RixJQUFJOUYsS0FBSztzRkFDckM4RixJQUFJN0YsS0FBSzsyRUFEQzZGLElBQUk5RixLQUFLOzs7Ozs7Ozs7Ozs7Ozs7MEVBTTVCLDhEQUFDNkY7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRU4sY0FBYyxpQkFDZiw4REFBQzREO29FQUFLWixXQUFVOzhFQUFpSDs7Ozs7eUZBSWpJLDhEQUFDWTtvRUFBS1osV0FBVTs4RUFBMkc7Ozs7Ozs7Ozs7Ozt1REE5QjFIMUMsRUFBRUosV0FBVzs7Ozs7Z0RBbUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OENBTVosOERBQUMrQztvQ0FBSUQsV0FBVTs4Q0FDYiw0RUFBQ3VCO3dDQUNDVCxNQUFLO3dDQUNMVSxTQUFTekM7d0NBQ1QwQyxVQUFVdEY7d0NBQ1Y2RCxXQUFVO2tEQUVUN0QsU0FBUyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTeEM7R0E5U3dCVDtLQUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIE1lcmNoYW50ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIE1hcHBpbmcgPSB7XG4gIGlkOiBudW1iZXIgfCBudWxsOyAgICAgICAgICAgLy8gbWlnaHQgYmUgbnVsbCBpZiBqdXN0IGNyZWF0ZWQgY2xpZW50LXNpZGVcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFVwc2VydFJlcXVlc3QgPSB7XG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHlvdXIgYmFja2VuZCBgcGFydFJvbGVgIHZhbHVlc1xuY29uc3QgUEFSVF9ST0xFX09QVElPTlMgPSBbXG4gIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIuKAlCBVbm1hcHBlZCDigJRcIiB9LFxuICAvLyBMb3dlciAvIGZpcmUgY29udHJvbFxuICB7IHZhbHVlOiBcImxvd2VyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1wYXJ0cy1raXRcIiwgbGFiZWw6IFwiTG93ZXIgUGFydHMgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJ0cmlnZ2VyXCIsIGxhYmVsOiBcIlRyaWdnZXIgLyBUcmlnZ2VyIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwicGlzdG9sLWdyaXBcIiwgbGFiZWw6IFwiUGlzdG9sIEdyaXBcIiB9LFxuICB7IHZhbHVlOiBcInNhZmV0eS1zZWxlY3RvclwiLCBsYWJlbDogXCJTYWZldHkgU2VsZWN0b3JcIiB9LFxuXG4gIC8vIFVwcGVyXG4gIHsgdmFsdWU6IFwidXBwZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcImJhcnJlbFwiLCBsYWJlbDogXCJCYXJyZWxcIiB9LFxuICB7IHZhbHVlOiBcImhhbmRndWFyZFwiLCBsYWJlbDogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IHZhbHVlOiBcImdhcy1zeXN0ZW1cIiwgbGFiZWw6IFwiR2FzIFN5c3RlbSAvIEdhcyBCbG9ja1wiIH0sXG4gIHsgdmFsdWU6IFwibXV6emxlLWRldmljZVwiLCBsYWJlbDogXCJNdXp6bGUgRGV2aWNlXCIgfSxcbiAgeyB2YWx1ZTogXCJzdXBwcmVzc29yXCIsIGxhYmVsOiBcIlN1cHByZXNzb3JcIiB9LFxuXG4gIC8vIEZ1cm5pdHVyZSAvIHNpZ2h0cyAvIG9wdGljc1xuICB7IHZhbHVlOiBcInN0b2NrXCIsIGxhYmVsOiBcIlN0b2NrXCIgfSxcbiAgeyB2YWx1ZTogXCJidWZmZXIta2l0XCIsIGxhYmVsOiBcIkJ1ZmZlciBLaXRcIiB9LFxuICB7IHZhbHVlOiBcImNoYXJnaW5nLWhhbmRsZVwiLCBsYWJlbDogXCJDaGFyZ2luZyBIYW5kbGVcIiB9LFxuICB7IHZhbHVlOiBcInNpZ2h0XCIsIGxhYmVsOiBcIklyb24gLyBCYWNrdXAgU2lnaHRcIiB9LFxuICB7IHZhbHVlOiBcIm9wdGljXCIsIGxhYmVsOiBcIk9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJvdGhlclwiLCBsYWJlbDogXCJPdGhlciAvIElnbm9yZVwiIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeU1hcHBpbmdzUGFnZSgpIHtcbiAgY29uc3QgW21lcmNoYW50cywgc2V0TWVyY2hhbnRzXSA9IHVzZVN0YXRlPE1lcmNoYW50W10+KFtdKTtcbiAgY29uc3QgW3NlbGVjdGVkTWVyY2hhbnRJZCwgc2V0U2VsZWN0ZWRNZXJjaGFudElkXSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFttYXBwaW5ncywgc2V0TWFwcGluZ3NdID0gdXNlU3RhdGU8TWFwcGluZ1tdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nTWFwcGluZ3MsIHNldExvYWRpbmdNYXBwaW5nc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzdWNjZXNzTWVzc2FnZSwgc2V0U3VjY2Vzc01lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzaG93T25seVVubWFwcGVkLCBzZXRTaG93T25seVVubWFwcGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBzb3J0ZWRNYXBwaW5ncyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIE1hcHBlZCByb3dzIGZpcnN0LCB0aGVuIHVubWFwcGVkOyB3aXRoaW4gZWFjaCBncm91cCwgYWxwaGEgYnkgcmF3Q2F0ZWdvcnlcbiAgICByZXR1cm4gWy4uLm1hcHBpbmdzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTWFwcGVkID0gISFhLm1hcHBlZFBhcnRSb2xlO1xuICAgICAgY29uc3QgYk1hcHBlZCA9ICEhYi5tYXBwZWRQYXJ0Um9sZTtcblxuICAgICAgaWYgKGFNYXBwZWQgIT09IGJNYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuIGFNYXBwZWQgPyAtMSA6IDE7IC8vIG1hcHBlZCBmaXJzdFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5yYXdDYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIucmF3Q2F0ZWdvcnkpO1xuICAgIH0pO1xuICB9LCBbbWFwcGluZ3NdKTtcblxuICBjb25zdCB2aXNpYmxlTWFwcGluZ3MgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBzaG93T25seVVubWFwcGVkXG4gICAgICAgID8gc29ydGVkTWFwcGluZ3MuZmlsdGVyKChtKSA9PiAhbS5tYXBwZWRQYXJ0Um9sZSlcbiAgICAgICAgOiBzb3J0ZWRNYXBwaW5ncyxcbiAgICBbc29ydGVkTWFwcGluZ3MsIHNob3dPbmx5VW5tYXBwZWRdLFxuICApO1xuXG4gIC8vIExvYWQgbWVyY2hhbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXJjaGFudHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50c2ApO1xuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGE6IE1lcmNoYW50W10gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRNZXJjaGFudHMoZGF0YSk7XG5cbiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IG1lcmNoYW50IGlmIHlvdSB3YW50XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRNZXJjaGFudElkID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKGRhdGFbMF0uaWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWVyY2hhbnRzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgLy8gTG9hZCBtYXBwaW5ncyBmb3Igc2VsZWN0ZWQgbWVyY2hhbnRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoTWFwcGluZ3MoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3ModHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50LWNhdGVnb3J5LW1hcHBpbmdzP21lcmNoYW50SWQ9JHtzZWxlY3RlZE1lcmNoYW50SWR9YDtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1hcHBpbmdzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyBNYXBwaW5nW107XG4gICAgICAgIHNldE1hcHBpbmdzKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3NcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3MoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWFwcGluZ3MoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtzZWxlY3RlZE1lcmNoYW50SWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2VQYXJ0Um9sZSA9IChyYXdDYXRlZ29yeTogc3RyaW5nLCBuZXdSb2xlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRNYXBwaW5ncygocHJldikgPT5cbiAgICAgIHByZXYubWFwKChtKSA9PlxuICAgICAgICBtLnJhd0NhdGVnb3J5ID09PSByYXdDYXRlZ29yeVxuICAgICAgICAgID8geyAuLi5tLCBtYXBwZWRQYXJ0Um9sZTogbmV3Um9sZSB8fCBudWxsIH1cbiAgICAgICAgICA6IG0sXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2F2ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuICAgIHNldFNhdmluZyh0cnVlKTtcbiAgICBzZXRFcnJvcihudWxsKTtcbiAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTYXZlIGVhY2ggbWFwcGluZyBpbiBwYXJhbGxlbFxuICAgICAgY29uc3QgcmVxdWVzdHM6IFByb21pc2U8UmVzcG9uc2U+W10gPSBtYXBwaW5ncy5tYXAoKG0pID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogVXBzZXJ0UmVxdWVzdCA9IHtcbiAgICAgICAgICBtZXJjaGFudElkOiBzZWxlY3RlZE1lcmNoYW50SWQsXG4gICAgICAgICAgcmF3Q2F0ZWdvcnk6IG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgbWFwcGVkUGFydFJvbGU6IG0ubWFwcGVkUGFydFJvbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3NgLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG4gICAgICBjb25zdCBmYWlsZWQgPSByZXNwb25zZXMuZmlsdGVyKChyKSA9PiAhci5vayk7XG5cbiAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvbWUgbWFwcGluZ3MgZmFpbGVkIHRvIHNhdmUgKCR7ZmFpbGVkLmxlbmd0aH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKFwiTWFwcGluZ3Mgc2F2ZWQuIFJlLXJ1biB0aGUgaW1wb3J0IHRvIGFwcGx5IGNoYW5nZXMuXCIpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBzYXZlIG1hcHBpbmdzXCIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzZWxlY3RlZE1lcmNoYW50TmFtZSA9XG4gICAgbWVyY2hhbnRzLmZpbmQoKG0pID0+IG0uaWQgPT09IHNlbGVjdGVkTWVyY2hhbnRJZCk/Lm5hbWUgPz8gXCLigJRcIjtcblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy01eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNiBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWVuZCBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkIC8gQWRtaW5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgTWVyY2hhbnQgQ2F0ZWdvcnkgTWFwcGluZ1xuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgIE5vcm1hbGl6ZSBlYWNoIG1lcmNoYW50JmFwb3M7cyBjYXRlZ29yeSBuYW1lcyBpbnRvIHlvdXIgaW50ZXJuYWxcbiAgICAgICAgICAgICAgcGFydCByb2xlcyAodXBwZXIsIGJhcnJlbCwgaGFuZGd1YXJkLCBldGMuKS4gVW5tYXBwZWQgY2F0ZWdvcmllc1xuICAgICAgICAgICAgICB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIGltcG9ydCB1bnRpbCB0aGV5IGFyZSBtYXBwZWQgaGVyZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtemluYy00MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgTWVyY2hhbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0zIHB5LTIgdGV4dC1zbSB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkTWVyY2hhbnRJZCA/PyBcIlwifVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKFxuICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUgPyBOdW1iZXIoZS50YXJnZXQudmFsdWUpIDogbnVsbCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPuKAlCBDaG9vc2UgbWVyY2hhbnQg4oCUPC9vcHRpb24+XG4gICAgICAgICAgICAgIHttZXJjaGFudHMubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e20uaWR9IHZhbHVlPXttLmlkfT5cbiAgICAgICAgICAgICAgICAgIHttLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItcmVkLTUwMC82MCBiZy1yZWQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtcmVkLTIwMFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtzdWNjZXNzTWVzc2FnZSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgcm91bmRlZCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzYwIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtZW1lcmFsZC0yMDBcIj5cbiAgICAgICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHshc2VsZWN0ZWRNZXJjaGFudElkID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIENob29zZSBhIG1lcmNoYW50IGFib3ZlIHRvIHZpZXcgY2F0ZWdvcnkgbWFwcGluZ3MuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGxvYWRpbmdNYXBwaW5ncyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIG1hcHBpbmdzIGZvciA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj7igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbWFwcGluZ3MubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIE5vIGNhdGVnb3J5IHJvd3MgeWV0IGZvciB0aGlzIG1lcmNoYW50LiBPbmNlIHlvdSBydW4gYW4gaW1wb3J0LFxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGNhdGVnb3JpZXMgd2lsbCBhcHBlYXIgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zIHRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICBNYXBwaW5ncyBmb3J7XCIgXCJ9XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj4ue1wiIFwifVxuICAgICAgICAgICAgICAgICAgU2V0IGEgcGFydCByb2xlIGZvciBlYWNoIHJhdyBjYXRlZ29yeS4gVW5tYXBwZWQgY2F0ZWdvcmllcyB3aWxsXG4gICAgICAgICAgICAgICAgICBiZSBza2lwcGVkIGJ5IHRoZSBpbXBvcnRlci5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTMgcm91bmRlZCBib3JkZXItemluYy02MDAgYmctemluYy05MDBcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzaG93T25seVVubWFwcGVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNob3dPbmx5VW5tYXBwZWQoZS50YXJnZXQuY2hlY2tlZCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvdyBvbmx5IHVubWFwcGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtODAwIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlJhdyBDYXRlZ29yeTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB5LTIgdGV4dC1sZWZ0IHByLTRcIj5NYXBwZWQgUGFydCBSb2xlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlN0YXR1czwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7dmlzaWJsZU1hcHBpbmdzLm1hcCgobSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtOTAwIGxhc3Q6Ym9yZGVyLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC16aW5jLTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTIgcHktMSB0ZXh0LXhzIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXttLm1hcHBlZFBhcnRSb2xlID8/IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlUGFydFJvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQQVJUX1JPTEVfT1BUSU9OUy5tYXAoKG9wdCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdC52YWx1ZX0gdmFsdWU9e29wdC52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHQubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5tYXBwZWRQYXJ0Um9sZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTIgcHktMC41IHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC1lbWVyYWxkLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctemluYy03MDAvNDAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbm1hcHBlZCAvIElnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2F2ZX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzYXZpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJnLWFtYmVyLTQwMCBweC00IHB5LTIgdGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwIGRpc2FibGVkOm9wYWNpdHktNTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzYXZpbmcgPyBcIlNhdmluZ+KAplwiIDogXCJTYXZlIE1hcHBpbmdzXCJ9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZU1lbW8iLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX09QVElPTlMiLCJ2YWx1ZSIsImxhYmVsIiwiQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UiLCJtZXJjaGFudHMiLCJzZXRNZXJjaGFudHMiLCJzZWxlY3RlZE1lcmNoYW50SWQiLCJzZXRTZWxlY3RlZE1lcmNoYW50SWQiLCJtYXBwaW5ncyIsInNldE1hcHBpbmdzIiwibG9hZGluZ01hcHBpbmdzIiwic2V0TG9hZGluZ01hcHBpbmdzIiwic2F2aW5nIiwic2V0U2F2aW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInN1Y2Nlc3NNZXNzYWdlIiwic2V0U3VjY2Vzc01lc3NhZ2UiLCJzaG93T25seVVubWFwcGVkIiwic2V0U2hvd09ubHlVbm1hcHBlZCIsInNvcnRlZE1hcHBpbmdzIiwic29ydCIsImEiLCJiIiwiYU1hcHBlZCIsIm1hcHBlZFBhcnRSb2xlIiwiYk1hcHBlZCIsInJhd0NhdGVnb3J5IiwibG9jYWxlQ29tcGFyZSIsInZpc2libGVNYXBwaW5ncyIsImZpbHRlciIsIm0iLCJmZXRjaE1lcmNoYW50cyIsInJlcyIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibGVuZ3RoIiwiaWQiLCJlcnIiLCJjb25zb2xlIiwibWVzc2FnZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaE1hcHBpbmdzIiwidXJsIiwic2lnbmFsIiwibmFtZSIsImFib3J0IiwiaGFuZGxlQ2hhbmdlUGFydFJvbGUiLCJuZXdSb2xlIiwicHJldiIsIm1hcCIsImhhbmRsZVNhdmUiLCJyZXF1ZXN0cyIsInBheWxvYWQiLCJtZXJjaGFudElkIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzcG9uc2VzIiwiUHJvbWlzZSIsImFsbCIsImZhaWxlZCIsInIiLCJzZWxlY3RlZE1lcmNoYW50TmFtZSIsImZpbmQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaGVhZGVyIiwicCIsImgxIiwic2VsZWN0Iiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwiTnVtYmVyIiwib3B0aW9uIiwic2VjdGlvbiIsInNwYW4iLCJpbnB1dCIsInR5cGUiLCJjaGVja2VkIiwidGFibGUiLCJ0aGVhZCIsInRyIiwidGgiLCJ0Ym9keSIsInRkIiwib3B0IiwiYnV0dG9uIiwib25DbGljayIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx\n")); /***/ }), diff --git a/.next/static/chunks/app/gunbuilder/build/page.js b/.next/static/chunks/app/gunbuilder/build/page.js index 52728db..cad57a6 100644 --- a/.next/static/chunks/app/gunbuilder/build/page.js +++ b/.next/static/chunks/app/gunbuilder/build/page.js @@ -79,7 +79,7 @@ eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* har /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEM7UUFBRUMsSUFBSTtRQUFTQyxNQUFNO0lBQWlCO0lBQ3RDO1FBQUVELElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVVDLE1BQU07SUFBUztJQUMvQjtRQUFFRCxJQUFJO1FBQWFDLE1BQU07SUFBWTtJQUNyQztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtJQUM3QjtRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtDQUM5QixDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIHsgaWQ6IFwibG93ZXJcIiwgbmFtZTogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwidXBwZXJcIiwgbmFtZTogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwiYmFycmVsXCIsIG5hbWU6IFwiQmFycmVsXCIgfSxcbiAgeyBpZDogXCJoYW5kZ3VhcmRcIiwgbmFtZTogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IGlkOiBcInN0b2NrXCIsIG5hbWU6IFwiU3RvY2tcIiB9LFxuICB7IGlkOiBcIm9wdGljXCIsIG5hbWU6IFwiT3B0aWNcIiB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJQQVJUUyIsImJyYW5kIiwiY2F0ZWdvcnlJZCIsInByaWNlIiwiYWZmaWxpYXRlVXJsIiwibm90ZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); /***/ }), diff --git a/.next/static/chunks/app/gunbuilder/page.js b/.next/static/chunks/app/gunbuilder/page.js index 6508188..ae7e88b 100644 --- a/.next/static/chunks/app/gunbuilder/page.js +++ b/.next/static/chunks/app/gunbuilder/page.js @@ -68,7 +68,7 @@ eval(__webpack_require__.ts("var __dirname = \"/\";\n(function(){var e={229:func /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts and core controls.\",\n categoryIds: [\n \"lower\",\n \"lowerParts\",\n \"stock\",\n \"buffer\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, handguard, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"barrel\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 226,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 222,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 231,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 221,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 220,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 240,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 244,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 243,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 246,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 239,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 256,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 254,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 238,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 295,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 299,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 294,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 293,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 312,\n columnNumber: 29\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 27\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 306,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 281,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 268,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 338,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 356,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 362,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 361,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 367,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 372,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 355,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 343,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 336,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 394,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 411,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 383,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 266,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 424,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 429,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 433,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 423,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 419,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 442,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 446,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 449,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 450,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 445,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 441,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 236,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 219,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Svlr/SlMEdeu/xZZnR5gKrepPAg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFUztJQWMzRFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU1JLHdCQUFvRDtJQUN4RCxrQkFBa0I7SUFDbEJDLFFBQVE7SUFDUkMsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CQyxPQUFPO0lBQ1Asa0JBQWtCO0lBQ2xCQyxPQUFPO0lBQ1BDLE9BQU87QUFDVDtBQUlBLE1BQU1DLGNBQWM7QUFFcEIsMENBQTBDO0FBQzFDLEVBQUU7QUFDRixhQUFhO0FBQ2IsdURBQXVEO0FBQ3ZELG9EQUFvRDtBQUNwRCxNQUFNQyxrQkFLQTtJQUNKO1FBQ0VDLElBQUk7UUFDSkMsT0FBTztRQUNQQyxhQUNFO1FBQ0ZDLGFBQWE7WUFBQztZQUFTO1lBQWM7WUFBUztTQUFTO0lBQ3pEO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtBQUVjLFNBQVNDOztJQUN0QixNQUFNQyxlQUFlckIsZ0VBQWVBO0lBQ3BDLE1BQU1zQixTQUFTckIsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ3NCLE9BQU9DLFNBQVMsR0FBRzNCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDNEIsU0FBU0MsV0FBVyxHQUFHN0IsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDOEIsT0FBT0MsU0FBUyxHQUFHL0IsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQ2dDLE9BQU9DLFNBQVMsR0FBR2pDLCtDQUFRQSxDQUFhO1FBQzdD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QUFTO29EQUNQckYsU0FBUyxDQUFDO29EQUNWLElBQUksSUFBNkIsRUFBRTt3REFDakNFLGFBQWFvRixVQUFVLENBQUN0RztvREFDMUI7Z0RBQ0Y7Z0RBQ0F1RyxVQUFVcEMsY0FBY21CLE1BQU0sS0FBSztnREFDbkNOLFdBQVcsaUtBSVYsT0FIQ2IsY0FBY21CLE1BQU0sS0FBSyxJQUNyQixrQ0FDQTswREFFUDs7Ozs7OzBEQUdELDhEQUFDbkQ7Z0RBQUU2QyxXQUFVOzBEQUFtQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQVF0RCw4REFBQ087d0JBQVFQLFdBQVU7OzBDQUNqQiw4REFBQ1U7Z0NBQUdWLFdBQVU7MENBQW1FOzs7Ozs7MENBR2pGLDhEQUFDYztnQ0FBR2QsV0FBVTs7a0RBQ1osOERBQUNpQjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUlKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQVFSLDhEQUFDVjt3QkFBUVAsV0FBVTs7MENBQ2pCLDhEQUFDVTtnQ0FBR1YsV0FBVTswQ0FBbUU7Ozs7OzswQ0FHakYsOERBQUNjO2dDQUFHZCxXQUFVOztrREFDWiw4REFBQ2lCO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNaEI7R0E1WHdCM0Y7O1FBQ0RwQiw0REFBZUE7UUFDckJDLHNEQUFTQTs7O0tBRkZtQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9wYWdlLnRzeD8wNTQwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VTZWFyY2hQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgQ2F0ZWdvcnlDb2x1bW4gfSBmcm9tIFwiQC9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uXCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogbnVtYmVyOyAvLyBiYWNrZW5kIG51bWVyaWMgaWRcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuLy8gTWFwIGJhY2tlbmQgcGFydFJvbGUgdG8geW91ciBleGlzdGluZyBDYXRlZ29yeUlkIHZhbHVlcy5cbmNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSB7XG4gIFwidXBwZXItcmVjZWl2ZXJcIjogXCJ1cHBlclwiIGFzIENhdGVnb3J5SWQsXG4gIGJhcnJlbDogXCJiYXJyZWxcIiBhcyBDYXRlZ29yeUlkLFxuICBoYW5kZ3VhcmQ6IFwiaGFuZGd1YXJkXCIgYXMgQ2F0ZWdvcnlJZCxcbiAgXCJjaGFyZ2luZy1oYW5kbGVcIjogXCJjaGFyZ2luZ0hhbmRsZVwiIGFzIENhdGVnb3J5SWQsXG4gIFwiYnVmZmVyLWtpdFwiOiBcImJ1ZmZlclwiIGFzIENhdGVnb3J5SWQsXG4gIFwibG93ZXItcGFydHMta2l0XCI6IFwibG93ZXJQYXJ0c1wiIGFzIENhdGVnb3J5SWQsXG4gIHNpZ2h0OiBcInNpZ2h0c1wiIGFzIENhdGVnb3J5SWQsXG4gIFwibG93ZXItcmVjZWl2ZXJcIjogXCJsb3dlclwiIGFzIENhdGVnb3J5SWQsXG4gIG9wdGljOiBcIm9wdGljXCIgYXMgQ2F0ZWdvcnlJZCxcbiAgc3RvY2s6IFwic3RvY2tcIiBhcyBDYXRlZ29yeUlkLFxufTtcblxudHlwZSBCdWlsZFN0YXRlID0gUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nPj47IC8vIGNhdGVnb3J5SWQgLT4gcGFydElkXG5cbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbi8vIEdyb3VwIGNhdGVnb3JpZXMgaW50byBsb2dpY2FsIHNlY3Rpb25zLlxuLy9cbi8vIElNUE9SVEFOVDpcbi8vIFRoZXNlIElEcyBtdXN0IG1hdGNoIHRoZSBpZHMgeW91IGhhdmUgaW4gQ0FURUdPUklFUy5cbi8vIEFueXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCB3aWxsIGp1c3QgYmUgc2tpcHBlZC5cbmNvbnN0IENBVEVHT1JZX0dST1VQUzoge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2F0ZWdvcnlJZHM6IENhdGVnb3J5SWRbXTtcbn1bXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXZlcnl0aGluZyBmcm9tIHRoZSBzZXJpYWxpemVkIGxvd2VyIHRvIHNtYWxsIHBhcnRzIGFuZCBjb3JlIGNvbnRyb2xzLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXCJsb3dlclwiLCBcImxvd2VyUGFydHNcIiwgXCJzdG9ja1wiLCBcImJ1ZmZlclwiXSBhcyBDYXRlZ29yeUlkW10sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJhcnJlbCwgdXBwZXIsIGhhbmRndWFyZCwgYW5kIHRoZSBwYXJ0cyB0aGF0IGtlZXAgdGhlIHJpZmxlIGN5Y2xpbmcuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwidXBwZXJcIixcbiAgICAgIFwiYmFycmVsXCIsXG4gICAgICBcImhhbmRndWFyZFwiLFxuICAgICAgXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgICAgXCJzaWdodHNcIixcbiAgICAgIFwib3B0aWNcIixcbiAgICBdIGFzIENhdGVnb3J5SWRbXSxcbiAgfSxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEd1bmJ1aWxkZXJQYWdlKCkge1xuICBjb25zdCBzZWFyY2hQYXJhbXMgPSB1c2VTZWFyY2hQYXJhbXMoKTtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0b3JlZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJvZHVjdHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyP3BsYXRmb3JtPUFSLTE1YCxcbiAgICAgICAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YVxuICAgICAgICAgIC5tYXAoKHApOiBQYXJ0IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gUEFSVF9ST0xFX1RPX0NBVEVHT1JZW3AucGFydFJvbGVdO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYW55IHBhcnRzIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcCB5ZXRcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcocC5pZCksIC8vIEFMV0FZUyBzdHJpbmdcbiAgICAgICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydCA9PiBwICE9PSBudWxsKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUHJvZHVjdHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtdKTtcblxuICAvLyBIYW5kbGUgVVJMIHF1ZXJ5IHBhcmFtZXRlciBmb3IgcGFydCBzZWxlY3Rpb24gKD9zZWxlY3Q9dXBwZXI6MTY1KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChcInNlbGVjdFwiKTtcbiAgICBpZiAoc2VsZWN0UGFyYW0pIHtcbiAgICAgIGNvbnN0IFtjYXRlZ29yeUlkLCBwYXJ0SWRdID0gc2VsZWN0UGFyYW0uc3BsaXQoXCI6XCIpO1xuICAgICAgaWYgKGNhdGVnb3J5SWQgJiYgcGFydElkICYmIENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIFtjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJvdXRlci5yZXBsYWNlKFwiL2d1bmJ1aWxkZXJcIiwgeyBzY3JvbGw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlYXJjaFBhcmFtcywgcm91dGVyXSk7XG5cbiAgLy8gUGVyc2lzdCBidWlsZCBzdGF0ZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIGNvbnN0IHBhcnRzQnlDYXRlZ29yeTogUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cGVkID0ge30gYXMgUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT47XG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBDQVRFR09SSUVTKSB7XG4gICAgICBncm91cGVkW2NhdGVnb3J5LmlkXSA9IHBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnkuaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBlZDtcbiAgfSwgW3BhcnRzXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRQYXJ0czogUGFydFtdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkKVxuICAgICAgLm1hcCgoW2NhdGVnb3J5SWQsIHBhcnRJZF0pID0+XG4gICAgICAgIHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5SWQpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQYXJ0W107XG4gIH0sIFtidWlsZCwgcGFydHNdKTtcblxuICBjb25zdCB0b3RhbFByaWNlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzZWxlY3RlZFBhcnRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnByaWNlLCAwKSxcbiAgICBbc2VsZWN0ZWRQYXJ0c10sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBVc2UgZ3JvdXAgb3JkZXJpbmcgZm9yIHRoZSBzdW1tYXJ5IGFzIHdlbGxcbiAgY29uc3Qgc3VtbWFyeUNhdGVnb3J5T3JkZXI6IENhdGVnb3J5SWRbXSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIENBVEVHT1JZX0dST1VQUy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuY2F0ZWdvcnlJZHMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSxcbiAgICAgICksXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1hbWJlci01MDAvMjAgYmctYW1iZXItNTAwLzVcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIGZsZXggbWF4LXctNnhsIGZsZXgtY29sIGdhcC0xIHB4LTQgcHktMiB0ZXh0LVswLjc1cmVtXSB0ZXh0LWFtYmVyLTEwMCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicm91bmRlZC1zbSBiZy1hbWJlci01MDAvMjAgcHgtMiBweS0wLjUgdGV4dC1bMC42NXJlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMThlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgRWFybHkgQWNjZXNzIEJldGFcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LWFtYmVyLTEwMC85MCBtZDppbmxpbmVcIj5cbiAgICAgICAgICAgICAgWW91JmFwb3M7cmUgdXNpbmcgYW4gZWFybHktYWNjZXNzIHByb3RvdHlwZSBvZiBUaGUgQXJtb3J5LiBEYXRhLFxuICAgICAgICAgICAgICBwcmljaW5nLCBhbmQgYXZhaWxhYmxlIHBhcnRzIGFyZSBzdGlsbCBldm9sdmluZy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTEwMC85MCBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIEVhcmx5LWFjY2VzcyBwcm90b3R5cGUuIERhdGEgYW5kIHByaWNpbmcgbWF5IGNoYW5nZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTYgZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpmbGV4LXJvdyBtZDppdGVtcy1lbmQgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBUaGUgQXJtb3J5OiA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPkVhcmx5IEFjY2Vzczwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICBFeHBsb3JlIGNvbXBvbmVudHMgZnJvbSB0cnVzdGVkIGJyYW5kcywgY2hvb3NlIG9uZSBwYXJ0IHBlclxuICAgICAgICAgICAgICBjYXRlZ29yeSwgdHJhY2sgbGl2ZSBwcmljZXMsIGFuZCB3YXRjaCB5b3VyIHRvdGFsIGJ1aWxkIGNvc3RcbiAgICAgICAgICAgICAgdXBkYXRlIGFzIHlvdSBnby4gVGhpcyBlYXJseS1hY2Nlc3MgYnVpbGRlciBrZWVwcyB5b3VyIHNldHVwIHNhdmVkXG4gICAgICAgICAgICAgIGxvY2FsbHkgc28geW91IGNhbiBjb21lIGJhY2sgYW5kIHJlZmluZSBpdCBhbnl0aW1lLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0zIG1kOm10LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICR7dG90YWxQcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBsZzpncmlkLWNvbHMtWzNmciwxLjI1ZnJdXCI+XG4gICAgICAgICAgey8qIENhdGVnb3JpZXMvcGFydHMgKi99XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICAgIHtsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTG9hZGluZyBwYXJ0cyBmcm9tIGJhY2tlbmTigKZcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtlcnJvciAmJiAhbG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwXCI+XG4gICAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nIGFuZCBDT1JTIGlzXG4gICAgICAgICAgICAgICAgY29uZmlndXJlZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuICAgICAgICAgICAgICAgIHtDQVRFR09SWV9HUk9VUFMubWFwKChncm91cCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDYXRlZ29yaWVzID0gQ0FURUdPUklFUy5maWx0ZXIoKGMpID0+XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmNhdGVnb3J5SWRzLmluY2x1ZGVzKGMuaWQgYXMgQ2F0ZWdvcnlJZCksXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2dyb3VwLmlkfSBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtYmFzZWxpbmUganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwIG10LTEgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTIgbWQ6cC0zIGJnLXppbmMtOTUwLzYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9e2NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM9e3BhcnRzQnlDYXRlZ29yeVtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3RQYXJ0PXsocGFydElkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RQYXJ0KGNhdGVnb3J5LmlkLCBwYXJ0SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgey8qIEJ1aWxkIFN1bW1hcnkgKi99XG4gICAgICAgICAgPGFzaWRlIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00IGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMTZlbV0gdXBwZXJjYXNlIHRleHQtemluYy00MDAgbWItM1wiPlxuICAgICAgICAgICAgICBDdXJyZW50IEJ1aWxkXG4gICAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgcGFydCBmcm9tIGVhY2ggY2F0ZWdvcnkgdG8gc3RhcnQgeW91ciBidWlsZC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtzdW1tYXJ5Q2F0ZWdvcnlPcmRlci5tYXAoKGNhdGVnb3J5SWQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdCA9IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNhdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFydElkID0gYnVpbGRbY2F0LmlkXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBwLmlkID09PSBzZWxlY3RlZFBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdC5pZCxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxsaSBrZXk9e2NhdC5pZH0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2F0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge3BhcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIENUQSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBib3JkZXItdCBib3JkZXItemluYy04MDAgcHQtMyBzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXIvYnVpbGRcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJsb2NrIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYW1iZXItNDAwLzYwIGJnLWFtYmVyLTQwMC8xMCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWFtYmVyLTIwMCBob3ZlcjpiZy1hbWJlci00MDAvMTUgdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gXCJvcGFjaXR5LTQwIGN1cnNvci1ub3QtYWxsb3dlZCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCdWlsZCBTdW1tYXJ5XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldEJ1aWxkKHt9KTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2B3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENsZWFyIEJ1aWxkXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFZpZXcgeW91ciBidWlsZCBicmVha2Rvd24gYW5kIHNoYXJlIGl0IHdpdGggb3RoZXJzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FzaWRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogV2hhdCdzIE5ldyAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibXQtOCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICBXaGF0JmFwb3M7cyBOZXcgaW4gRWFybHkgQWNjZXNzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIExpdmUgcGFydHMgYW5kIHByaWNpbmcgcHVsbGVkIGZyb20gbXVsdGlwbGUgbWVyY2hhbnRzLjwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBHcm91cGVkIGxheW91dCBmb3IgbG93ZXIgYW5kIHVwcGVyIHJlY2VpdmVyIHBhcnRzIHNvIHlvdSBjYW4gc2VlXG4gICAgICAgICAgICAgIGF0IGEgZ2xhbmNlIHdoaWNoIHNlY3Rpb25zIG9mIHlvdXIgYnVpbGQgYXJlIHN0aWxsIG1pc3NpbmcuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgUnVubmluZyBidWlsZCB0b3RhbCB0aGF0IHVwZGF0ZXMgYXV0b21hdGljYWxseSBhcyB5b3UgYWRkIG9yXG4gICAgICAgICAgICAgIHN3YXAgY29tcG9uZW50cy5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBMb2NhbCBidWlsZCBwZXJzaXN0ZW5jZSBzbyB5b3VyIHNlbGVjdGlvbnMgc3RpY2sgYXJvdW5kIGJldHdlZW5cbiAgICAgICAgICAgICAgdmlzaXRzIG9uIHRoaXMgZGV2aWNlLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFJvYWRtYXAgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3Mgb24gb3VyIHJvYWRtYXBcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC0yIHNwYWNlLXktMSB0ZXh0LXNtIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgIDxsaT7igKIgUGxhdGZvcm0gZmlsdGVycyAoQVItMTUsIEFSLTksIEFSLTEwKTwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIE1vcmUgcGFydCBjYXRlZ29yaWVzIGFuZCBmdXJuaXR1cmU8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBSaWNoZXIgcHJpY2luZy9zdG9jayBzeW5jPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgU21hcnRlciBjb21wYXRpYmlsaXR5IGNoZWNrcyBiZXR3ZWVuIGNvbXBvbmVudHM8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBBUjkvQVIxMCBzdXBwb3J0IGFuZCBtb3JlPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIkxpbmsiLCJ1c2VTZWFyY2hQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ2F0ZWdvcnlDb2x1bW4iLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwic2lnaHQiLCJvcHRpYyIsInN0b2NrIiwiU1RPUkFHRV9LRVkiLCJDQVRFR09SWV9HUk9VUFMiLCJpZCIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJjYXRlZ29yeUlkcyIsIkd1bmJ1aWxkZXJQYWdlIiwic2VhcmNoUGFyYW1zIiwicm91dGVyIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsInNwYW4iLCJoZWFkZXIiLCJoMSIsInRvRml4ZWQiLCJsZW5ndGgiLCJzZWN0aW9uIiwiZ3JvdXBDYXRlZ29yaWVzIiwiaW5jbHVkZXMiLCJoMiIsInNlbGVjdGVkUGFydElkIiwib25TZWxlY3RQYXJ0IiwiYXNpZGUiLCJ1bCIsImNhdCIsInBhcnQiLCJsaSIsImhyZWYiLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsInJlbW92ZUl0ZW0iLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n const [layoutMode, setLayoutMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"cards\");\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__.PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 227,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 230,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 226,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 235,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 225,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 224,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 248,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 247,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 250,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 243,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 260,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"Choose one part per category. Switch layouts to browse by cards or a tighter list view.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"inline-flex items-center rounded-md border border-zinc-700 bg-zinc-900/70 text-[0.7rem]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"cards\"),\n className: \"px-2.5 py-1 rounded-l-md border-r border-zinc-700 transition-colors \".concat(layoutMode === \"cards\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"Card view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"list\"),\n className: \"px-2.5 py-1 rounded-r-md transition-colors \".concat(layoutMode === \"list\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"List view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 289,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 277,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 273,\n columnNumber: 13\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 303,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 328,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 327,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 326,\n columnNumber: 23\n }, this),\n layoutMode === \"cards\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 346,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 342,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 340,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60 flex flex-col md:flex-row md:items-start md:justify-between gap-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 364,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 358,\n columnNumber: 25\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 325,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 314,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 415,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 414,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 413,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 396,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 437,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 464,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 436,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 473,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 478,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 482,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 486,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 476,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 472,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 495,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 499,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 500,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 501,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 502,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 503,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 498,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 494,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 240,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 223,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Gf0ADXJJ40AD6WNDCWO2nEU+pms=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUNnQztBQUNUO0FBRVM7QUFDRztJQWM5RFM7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFLMUMsTUFBTUksY0FBYztBQUVwQiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGFBQWE7QUFDYix1REFBdUQ7QUFDdkQsb0RBQW9EO0FBQ3BELE1BQU1DLGtCQUtBO0lBQ0o7UUFDRUMsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtBQUVjLFNBQVNDOztJQUN0QixNQUFNQyxlQUFlaEIsZ0VBQWVBO0lBQ3BDLE1BQU1pQixTQUFTaEIsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR3RCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDdUIsU0FBU0MsV0FBVyxHQUFHeEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDeUIsT0FBT0MsU0FBUyxHQUFHMUIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQzJCLE9BQU9DLFNBQVMsR0FBRzVCLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksSUFBNkIsRUFBRTtZQUNqQyxNQUFNNkIsU0FBU0MsYUFBYUMsT0FBTyxDQUFDbkI7WUFDcEMsSUFBSWlCLFFBQVE7Z0JBQ1YsSUFBSTtvQkFDRixPQUFPRyxLQUFL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QixXQUFVOztrREFDWiw4REFBQ29CO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBSUosOERBQUNBO2tEQUFHOzs7Ozs7a0RBSUosOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBUVIsOERBQUNiO3dCQUFRUCxXQUFVOzswQ0FDakIsOERBQUNhO2dDQUFHYixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ2lCO2dDQUFHakIsV0FBVTs7a0RBQ1osOERBQUNvQjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTWhCO0dBOWF3QmhHOztRQUNEZiw0REFBZUE7UUFDckJDLHNEQUFTQTs7O0tBRkZjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4PzA1NDAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVNlYXJjaFBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5pbXBvcnQgeyBDYXRlZ29yeUNvbHVtbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW5cIjtcbmltcG9ydCB7IFBBUlRfUk9MRV9UT19DQVRFR09SWSB9IGZyb20gXCJAL2RhdGEvcGFydFJvbGVNYXBwaW5nc1wiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cblxudHlwZSBCdWlsZFN0YXRlID0gUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nPj47IC8vIGNhdGVnb3J5SWQgLT4gcGFydElkXG5cbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbi8vIEdyb3VwIGNhdGVnb3JpZXMgaW50byBsb2dpY2FsIHNlY3Rpb25zLlxuLy9cbi8vIElNUE9SVEFOVDpcbi8vIFRoZXNlIElEcyBtdXN0IG1hdGNoIHRoZSBpZHMgeW91IGhhdmUgaW4gQ0FURUdPUklFUy5cbi8vIEFueXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCB3aWxsIGp1c3QgYmUgc2tpcHBlZC5cbmNvbnN0IENBVEVHT1JZX0dST1VQUzoge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2F0ZWdvcnlJZHM6IENhdGVnb3J5SWRbXTtcbn1bXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXZlcnl0aGluZyBmcm9tIHRoZSBzZXJpYWxpemVkIGxvd2VyIHRvIHNtYWxsIHBhcnRzLCBmaXJlIGNvbnRyb2wsIGFuZCBjb3JlIGNvbnRyb2xzLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcImxvd2VyXCIsXG4gICAgICBcImNvbXBsZXRlTG93ZXJcIixcbiAgICAgIFwibG93ZXJQYXJ0c1wiLFxuICAgICAgXCJ0cmlnZ2VyXCIsXG4gICAgICBcImdyaXBcIixcbiAgICAgIFwic2FmZXR5XCIsXG4gICAgICBcImJ1ZmZlclwiLFxuICAgICAgXCJzdG9ja1wiLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJhcnJlbCwgdXBwZXIsIGdhcyBzeXN0ZW0sIGFuZCB0aGUgcGFydHMgdGhhdCBrZWVwIHRoZSByaWZsZSBjeWNsaW5nLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcInVwcGVyXCIsXG4gICAgICBcImNvbXBsZXRlVXBwZXJcIixcbiAgICAgIFwiYmNnXCIsXG4gICAgICBcImJhcnJlbFwiLFxuICAgICAgXCJnYXNCbG9ja1wiLFxuICAgICAgXCJnYXNUdWJlXCIsXG4gICAgICBcIm11enpsZURldmljZVwiLFxuICAgICAgXCJzdXBwcmVzc29yXCIsXG4gICAgICBcImhhbmRndWFyZFwiLFxuICAgICAgXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgICAgXCJzaWdodHNcIixcbiAgICAgIFwib3B0aWNcIixcbiAgICBdLFxuICB9LFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR3VuYnVpbGRlclBhZ2UoKSB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHVzZVNlYXJjaFBhcmFtcygpO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RvcmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGNvbnN0IFtsYXlvdXRNb2RlLCBzZXRMYXlvdXRNb2RlXSA9IHVzZVN0YXRlPFwiY2FyZHNcIiB8IFwibGlzdFwiPihcImNhcmRzXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJvZHVjdHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyP3BsYXRmb3JtPUFSLTE1YCxcbiAgICAgICAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YVxuICAgICAgICAgIC5tYXAoKHApOiBQYXJ0IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gUEFSVF9ST0xFX1RPX0NBVEVHT1JZW3AucGFydFJvbGVdO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYW55IHBhcnRzIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcCB5ZXRcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcocC5pZCksIC8vIEFMV0FZUyBzdHJpbmdcbiAgICAgICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydCA9PiBwICE9PSBudWxsKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUHJvZHVjdHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtdKTtcblxuICAvLyBIYW5kbGUgVVJMIHF1ZXJ5IHBhcmFtZXRlciBmb3IgcGFydCBzZWxlY3Rpb24gKD9zZWxlY3Q9dXBwZXI6MTY1KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChcInNlbGVjdFwiKTtcbiAgICBpZiAoc2VsZWN0UGFyYW0pIHtcbiAgICAgIGNvbnN0IFtjYXRlZ29yeUlkLCBwYXJ0SWRdID0gc2VsZWN0UGFyYW0uc3BsaXQoXCI6XCIpO1xuICAgICAgaWYgKGNhdGVnb3J5SWQgJiYgcGFydElkICYmIENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIFtjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJvdXRlci5yZXBsYWNlKFwiL2d1bmJ1aWxkZXJcIiwgeyBzY3JvbGw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlYXJjaFBhcmFtcywgcm91dGVyXSk7XG5cbiAgLy8gUGVyc2lzdCBidWlsZCBzdGF0ZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIGNvbnN0IHBhcnRzQnlDYXRlZ29yeTogUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cGVkID0ge30gYXMgUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT47XG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBDQVRFR09SSUVTKSB7XG4gICAgICBncm91cGVkW2NhdGVnb3J5LmlkXSA9IHBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnkuaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBlZDtcbiAgfSwgW3BhcnRzXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRQYXJ0czogUGFydFtdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkKVxuICAgICAgLm1hcCgoW2NhdGVnb3J5SWQsIHBhcnRJZF0pID0+XG4gICAgICAgIHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5SWQpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQYXJ0W107XG4gIH0sIFtidWlsZCwgcGFydHNdKTtcblxuICBjb25zdCB0b3RhbFByaWNlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzZWxlY3RlZFBhcnRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnByaWNlLCAwKSxcbiAgICBbc2VsZWN0ZWRQYXJ0c10sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBVc2UgZ3JvdXAgb3JkZXJpbmcgZm9yIHRoZSBzdW1tYXJ5IGFzIHdlbGxcbiAgY29uc3Qgc3VtbWFyeUNhdGVnb3J5T3JkZXI6IENhdGVnb3J5SWRbXSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIENBVEVHT1JZX0dST1VQUy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuY2F0ZWdvcnlJZHMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSxcbiAgICAgICksXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1hbWJlci01MDAvMjAgYmctYW1iZXItNTAwLzVcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIGZsZXggbWF4LXctNnhsIGZsZXgtY29sIGdhcC0xIHB4LTQgcHktMiB0ZXh0LVswLjc1cmVtXSB0ZXh0LWFtYmVyLTEwMCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicm91bmRlZC1zbSBiZy1hbWJlci01MDAvMjAgcHgtMiBweS0wLjUgdGV4dC1bMC42NXJlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMThlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgRWFybHkgQWNjZXNzIEJldGFcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LWFtYmVyLTEwMC85MCBtZDppbmxpbmVcIj5cbiAgICAgICAgICAgICAgWW91JmFwb3M7cmUgdXNpbmcgYW4gZWFybHktYWNjZXNzIHByb3RvdHlwZSBvZiBUaGUgQXJtb3J5LiBEYXRhLFxuICAgICAgICAgICAgICBwcmljaW5nLCBhbmQgYXZhaWxhYmxlIHBhcnRzIGFyZSBzdGlsbCBldm9sdmluZy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTEwMC85MCBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIEVhcmx5LWFjY2VzcyBwcm90b3R5cGUuIERhdGEgYW5kIHByaWNpbmcgbWF5IGNoYW5nZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTYgZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpmbGV4LXJvdyBtZDppdGVtcy1lbmQgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBUaGUgQXJtb3J5OiA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPkVhcmx5IEFjY2Vzczwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICBFeHBsb3JlIGNvbXBvbmVudHMgZnJvbSB0cnVzdGVkIGJyYW5kcywgY2hvb3NlIG9uZSBwYXJ0IHBlclxuICAgICAgICAgICAgICBjYXRlZ29yeSwgdHJhY2sgbGl2ZSBwcmljZXMsIGFuZCB3YXRjaCB5b3VyIHRvdGFsIGJ1aWxkIGNvc3RcbiAgICAgICAgICAgICAgdXBkYXRlIGFzIHlvdSBnby4gVGhpcyBlYXJseS1hY2Nlc3MgYnVpbGRlciBrZWVwcyB5b3VyIHNldHVwIHNhdmVkXG4gICAgICAgICAgICAgIGxvY2FsbHkgc28geW91IGNhbiBjb21lIGJhY2sgYW5kIHJlZmluZSBpdCBhbnl0aW1lLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0zIG1kOm10LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICR7dG90YWxQcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBsZzpncmlkLWNvbHMtWzNmciwxLjI1ZnJdXCI+XG4gICAgICAgICAgey8qIENhdGVnb3JpZXMvcGFydHMgKi99XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0yIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgQ2hvb3NlIG9uZSBwYXJ0IHBlciBjYXRlZ29yeS4gU3dpdGNoIGxheW91dHMgdG8gYnJvd3NlIGJ5IGNhcmRzIG9yIGEgdGlnaHRlciBsaXN0IHZpZXcuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQtWzAuN3JlbV1cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldExheW91dE1vZGUoXCJjYXJkc1wiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTIuNSBweS0xIHJvdW5kZWQtbC1tZCBib3JkZXItciBib3JkZXItemluYy03MDAgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0TW9kZSA9PT0gXCJjYXJkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLWFtYmVyLTUwMC8yMCB0ZXh0LWFtYmVyLTIwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6YmctemluYy04MDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZCB2aWV3XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRMYXlvdXRNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTIuNSBweS0xIHJvdW5kZWQtci1tZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICBsYXlvdXRNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy1hbWJlci01MDAvMjAgdGV4dC1hbWJlci0yMDBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOmJnLXppbmMtODAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3Qgdmlld1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2xvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBMb2FkaW5nIHBhcnRzIGZyb20gYmFja2VuZOKAplxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2Vycm9yICYmICFsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDBcIj5cbiAgICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcgYW5kIENPUlMgaXNcbiAgICAgICAgICAgICAgICBjb25maWd1cmVkLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4gICAgICAgICAgICAgICAge0NBVEVHT1JZX0dST1VQUy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cENhdGVnb3JpZXMgPSBDQVRFR09SSUVTLmZpbHRlcigoYykgPT5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY2F0ZWdvcnlJZHMuaW5jbHVkZXMoYy5pZCBhcyBDYXRlZ29yeUlkKSxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChncm91cENhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17Z3JvdXAuaWR9IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1iYXNlbGluZSBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDAgbXQtMSBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAge2xheW91dE1vZGUgPT09IFwiY2FyZHNcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXBDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMiBtZDpwLTMgYmctemluYy05NTAvNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT17Y2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdFBhcnQ9eyhwYXJ0SWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXBDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMiBtZDpwLTMgYmctemluYy05NTAvNjAgZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBtZDppdGVtcy1zdGFydCBtZDpqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT17Y2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdFBhcnQ9eyhwYXJ0SWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIHsvKiBCdWlsZCBTdW1tYXJ5ICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBWaWV3IHlvdXIgYnVpbGQgYnJlYWtkb3duIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkNhdGVnb3J5Q29sdW1uIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQ0FURUdPUllfR1JPVVBTIiwiaWQiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwiY2F0ZWdvcnlJZHMiLCJHdW5idWlsZGVyUGFnZSIsInNlYXJjaFBhcmFtcyIsInJvdXRlciIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImxheW91dE1vZGUiLCJzZXRMYXlvdXRNb2RlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsInNwYW4iLCJoZWFkZXIiLCJoMSIsInRvRml4ZWQiLCJsZW5ndGgiLCJzZWN0aW9uIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsImgyIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJhc2lkZSIsInVsIiwiY2F0IiwicGFydCIsImxpIiwiaHJlZiIsInJlbW92ZUl0ZW0iLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); /***/ }), @@ -79,7 +79,7 @@ eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* har /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts yet for this category.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 text-center\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 flex items-center justify-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 45,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 57,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 66,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7a0NBQ2IsNEVBQUNIOzRCQUFFRyxXQUFVOzs4Q0FDWCw4REFBQ0k7b0NBQ0NKLFdBQVU7b0NBQ1ZLLE1BQUs7b0NBQ0xDLFFBQU87b0NBQ1BDLFNBQVE7OENBRVIsNEVBQUNDO3dDQUNDQyxlQUFjO3dDQUNkQyxnQkFBZTt3Q0FDZkMsYUFBYTt3Q0FDYkMsR0FBRTs7Ozs7Ozs7Ozs7Z0NBRUE7Ozs7Ozs7Ozs7OztvQkFLWGpCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB3QixNQUFNbEI7d0JBQ05tQixVQUFVbkIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0JzQixVQUFVLElBQU1yQixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sR0FBRyxtQkFDZCw4REFBQ2YsaURBQUlBO2dCQUNINEIsTUFBTSxlQUEyQixPQUFaekIsU0FBU08sRUFBRTtnQkFDaENFLFdBQVU7O29CQUNYO29CQUNZUixNQUFNVyxNQUFNO29CQUFDOzs7Ozs7Ozs7Ozs7O0FBS2xDO0tBN0RnQmIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtbi50c3g/OWMxOCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IFBhcnRDYXJkIH0gZnJvbSBcIkAvY29tcG9uZW50cy9QYXJ0Q2FyZFwiO1xuXG5pbnRlcmZhY2UgQ2F0ZWdvcnlDb2x1bW5Qcm9wcyB7XG4gIGNhdGVnb3J5OiBDYXRlZ29yeTtcbiAgcGFydHM6IFBhcnRbXTtcbiAgc2VsZWN0ZWRQYXJ0SWQ/OiBzdHJpbmc7XG4gIG9uU2VsZWN0UGFydDogKHBhcnRJZDogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ2F0ZWdvcnlDb2x1bW4oe1xuICBjYXRlZ29yeSxcbiAgcGFydHMsXG4gIHNlbGVjdGVkUGFydElkLFxuICBvblNlbGVjdFBhcnQsXG59OiBDYXRlZ29yeUNvbHVtblByb3BzKSB7XG4gIC8vIFNob3cgc2VsZWN0ZWQgcGFydCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSBzaG93IHBsYWNlaG9sZGVyXG4gIGNvbnN0IGRpc3BsYXllZFBhcnQgPSBzZWxlY3RlZFBhcnRJZFxuICAgID8gcGFydHMuZmluZCgocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQpXG4gICAgOiBudWxsO1xuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGgtZnVsbFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zXCI+XG4gICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMTVlbV0gdGV4dC16aW5jLTQwMCB1cHBlcmNhc2VcIj5cbiAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX1cbiAgICAgICAgPC9oMj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAge3BhcnRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+Tm8gcGFydHMgeWV0IGZvciB0aGlzIGNhdGVnb3J5LjwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNwbGF5ZWRQYXJ0ICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgbWItMiB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNHYxNm04LThINFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENob29zZSBhIFBhcnRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXllZFBhcnQgJiYgKFxuICAgICAgICAgIDxQYXJ0Q2FyZFxuICAgICAgICAgICAga2V5PXtkaXNwbGF5ZWRQYXJ0LmlkfVxuICAgICAgICAgICAgcGFydD17ZGlzcGxheWVkUGFydH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtkaXNwbGF5ZWRQYXJ0LmlkID09PSBzZWxlY3RlZFBhcnRJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNlbGVjdFBhcnQoZGlzcGxheWVkUGFydC5pZCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3BhcnRzLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICA8TGlua1xuICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibXQtMiB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIFZpZXcgQWxsICh7cGFydHMubGVuZ3RofSlcbiAgICAgICAgPC9MaW5rPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJMaW5rIiwiUGFydENhcmQiLCJDYXRlZ29yeUNvbHVtbiIsImNhdGVnb3J5IiwicGFydHMiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImRpc3BsYXllZFBhcnQiLCJmaW5kIiwicCIsImlkIiwiZGl2IiwiY2xhc3NOYW1lIiwiaDIiLCJuYW1lIiwibGVuZ3RoIiwic3ZnIiwiZmlsbCIsInN0cm9rZSIsInZpZXdCb3giLCJwYXRoIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwicGFydCIsInNlbGVjdGVkIiwib25TZWxlY3QiLCJocmVmIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts available yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length >= 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7OzBDQUNiLDhEQUFDSDtnQ0FBRUcsV0FBVTswQ0FBd0I7Ozs7OzswQ0FDckMsOERBQUNaLGlEQUFJQTtnQ0FDSGdCLE1BQU0sZUFBMkIsT0FBWmIsU0FBU08sRUFBRTtnQ0FDaENFLFdBQVU7O2tEQUVWLDhEQUFDSzt3Q0FDQ0wsV0FBVTt3Q0FDVk0sTUFBSzt3Q0FDTEMsUUFBTzt3Q0FDUEMsU0FBUTtrREFFUiw0RUFBQ0M7NENBQ0NDLGVBQWM7NENBQ2RDLGdCQUFlOzRDQUNmQyxhQUFhOzRDQUNiQyxHQUFFOzs7Ozs7Ozs7OztvQ0FFQTs7Ozs7Ozs7Ozs7OztvQkFLWGxCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB5QixNQUFNbkI7d0JBQ05vQixVQUFVcEIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0J1QixVQUFVLElBQU10QixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sSUFBSSxtQkFDZiw4REFBQ2YsaURBQUlBO2dCQUNIZ0IsTUFBTSxlQUEyQixPQUFaYixTQUFTTyxFQUFFO2dCQUNoQ0UsV0FBVTs7b0JBQ1g7b0JBQ1lSLE1BQU1XLE1BQU07b0JBQUM7Ozs7Ozs7Ozs7Ozs7QUFLbEM7S0FqRWdCYiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeD85YzE4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgUGFydENhcmQgfSBmcm9tIFwiQC9jb21wb25lbnRzL1BhcnRDYXJkXCI7XG5cbmludGVyZmFjZSBDYXRlZ29yeUNvbHVtblByb3BzIHtcbiAgY2F0ZWdvcnk6IENhdGVnb3J5O1xuICBwYXJ0czogUGFydFtdO1xuICBzZWxlY3RlZFBhcnRJZD86IHN0cmluZztcbiAgb25TZWxlY3RQYXJ0OiAocGFydElkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXRlZ29yeUNvbHVtbih7XG4gIGNhdGVnb3J5LFxuICBwYXJ0cyxcbiAgc2VsZWN0ZWRQYXJ0SWQsXG4gIG9uU2VsZWN0UGFydCxcbn06IENhdGVnb3J5Q29sdW1uUHJvcHMpIHtcbiAgLy8gU2hvdyBzZWxlY3RlZCBwYXJ0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHNob3cgcGxhY2Vob2xkZXJcbiAgY29uc3QgZGlzcGxheWVkUGFydCA9IHNlbGVjdGVkUGFydElkXG4gICAgPyBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZFBhcnRJZClcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTNcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4xNWVtXSB0ZXh0LXppbmMtNDAwIHVwcGVyY2FzZVwiPlxuICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICB7cGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5ObyBwYXJ0cyBhdmFpbGFibGUgeWV0LjwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNwbGF5ZWRQYXJ0ICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgbWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPk5vIHBhcnQgc2VsZWN0ZWQ8L3A+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzYwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTIwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy01MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy00IGgtNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9XG4gICAgICAgICAgICAgICAgICBkPVwiTTEyIDR2MTZtOC04SDRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBDaG9vc2UgYSBQYXJ0XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtkaXNwbGF5ZWRQYXJ0ICYmIChcbiAgICAgICAgICA8UGFydENhcmRcbiAgICAgICAgICAgIGtleT17ZGlzcGxheWVkUGFydC5pZH1cbiAgICAgICAgICAgIHBhcnQ9e2Rpc3BsYXllZFBhcnR9XG4gICAgICAgICAgICBzZWxlY3RlZD17ZGlzcGxheWVkUGFydC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWR9XG4gICAgICAgICAgICBvblNlbGVjdD17KCkgPT4gb25TZWxlY3RQYXJ0KGRpc3BsYXllZFBhcnQuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtwYXJ0cy5sZW5ndGggPj0gMSAmJiAoXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnkuaWR9YH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtdC0yIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgVmlldyBBbGwgKHtwYXJ0cy5sZW5ndGh9KVxuICAgICAgICA8L0xpbms+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sIm5hbWVzIjpbIkxpbmsiLCJQYXJ0Q2FyZCIsIkNhdGVnb3J5Q29sdW1uIiwiY2F0ZWdvcnkiLCJwYXJ0cyIsInNlbGVjdGVkUGFydElkIiwib25TZWxlY3RQYXJ0IiwiZGlzcGxheWVkUGFydCIsImZpbmQiLCJwIiwiaWQiLCJkaXYiLCJjbGFzc05hbWUiLCJoMiIsIm5hbWUiLCJsZW5ndGgiLCJocmVmIiwic3ZnIiwiZmlsbCIsInN0cm9rZSIsInZpZXdCb3giLCJwYXRoIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwicGFydCIsInNlbGVjdGVkIiwib25TZWxlY3QiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); /***/ }), @@ -101,7 +101,18 @@ eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* har /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n {\n id: \"lower\",\n name: \"Lower Receiver\"\n },\n {\n id: \"upper\",\n name: \"Upper Receiver\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\"\n },\n {\n id: \"handguard\",\n name: \"Handguard\"\n },\n {\n id: \"stock\",\n name: \"Stock\"\n },\n {\n id: \"optic\",\n name: \"Optic\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEM7UUFBRUMsSUFBSTtRQUFTQyxNQUFNO0lBQWlCO0lBQ3RDO1FBQUVELElBQUk7UUFBU0MsTUFBTTtJQUFpQjtJQUN0QztRQUFFRCxJQUFJO1FBQVVDLE1BQU07SUFBUztJQUMvQjtRQUFFRCxJQUFJO1FBQWFDLE1BQU07SUFBWTtJQUNyQztRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtJQUM3QjtRQUFFRCxJQUFJO1FBQVNDLE1BQU07SUFBUTtDQUM5QixDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFTixJQUFJO1FBQ0pDLE1BQU07UUFDTkUsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VOLElBQUk7UUFDSkMsTUFBTTtRQUNORSxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRU4sSUFBSTtRQUNKQyxNQUFNO1FBQ05FLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIHsgaWQ6IFwibG93ZXJcIiwgbmFtZTogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwidXBwZXJcIiwgbmFtZTogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgaWQ6IFwiYmFycmVsXCIsIG5hbWU6IFwiQmFycmVsXCIgfSxcbiAgeyBpZDogXCJoYW5kZ3VhcmRcIiwgbmFtZTogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IGlkOiBcInN0b2NrXCIsIG5hbWU6IFwiU3RvY2tcIiB9LFxuICB7IGlkOiBcIm9wdGljXCIsIG5hbWU6IFwiT3B0aWNcIiB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJQQVJUUyIsImJyYW5kIiwiY2F0ZWdvcnlJZCIsInByaWNlIiwiYWZmaWxpYXRlVXJsIiwibm90ZXMiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); /***/ }), diff --git a/.next/static/chunks/app/layout.js b/.next/static/chunks/app/layout.js index cf86008..3364878 100644 --- a/.next/static/chunks/app/layout.js +++ b/.next/static/chunks/app/layout.js @@ -25,7 +25,7 @@ eval(__webpack_require__.ts("Promise.resolve(/*! import() eager */).then(__webpa /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"e222be0d16ad\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJlMjIyYmUwZDE2YWRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"c92bc8e6af0b\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJjOTJiYzhlNmFmMGJcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); /***/ }) diff --git a/.next/static/chunks/webpack.js b/.next/static/chunks/webpack.js index a110c0f..b28c764 100644 --- a/.next/static/chunks/webpack.js +++ b/.next/static/chunks/webpack.js @@ -192,7 +192,7 @@ /******/ /******/ /* webpack/runtime/getFullHash */ /******/ !function() { -/******/ __webpack_require__.h = function() { return "a6f46b17097acafc"; } +/******/ __webpack_require__.h = function() { return "7f1da3c97852a23d"; } /******/ }(); /******/ /******/ /* webpack/runtime/global */ diff --git a/.next/static/css/app/layout.css b/.next/static/css/app/layout.css index 551904e..002df37 100644 --- a/.next/static/css/app/layout.css +++ b/.next/static/css/app/layout.css @@ -763,6 +763,14 @@ video { .rounded-sm { border-radius: 0.125rem; } +.rounded-l-md { + border-top-left-radius: 0.375rem; + border-bottom-left-radius: 0.375rem; +} +.rounded-r-md { + border-top-right-radius: 0.375rem; + border-bottom-right-radius: 0.375rem; +} .border { border-width: 1px; } @@ -772,6 +780,9 @@ video { .border-t { border-top-width: 1px; } +.border-r { + border-right-width: 1px; +} .border-amber-400 { --tw-border-opacity: 1; border-color: rgb(251 191 36 / var(--tw-border-opacity)); @@ -977,6 +988,10 @@ video { padding-top: 2rem; padding-bottom: 2rem; } +.px-2\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} .pb-2 { padding-bottom: 0.5rem; } @@ -1329,6 +1344,10 @@ body { flex-direction: row; } + .md\:items-start { + align-items: flex-start; + } + .md\:items-end { align-items: flex-end; } diff --git a/.next/static/webpack/0154b3b16227569b.webpack.hot-update.json b/.next/static/webpack/0154b3b16227569b.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/0154b3b16227569b.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/04e447b5b4d809a6.webpack.hot-update.json b/.next/static/webpack/04e447b5b4d809a6.webpack.hot-update.json new file mode 100644 index 0000000..20fa880 --- /dev/null +++ b/.next/static/webpack/04e447b5b4d809a6.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/076391ec6128273f.webpack.hot-update.json b/.next/static/webpack/076391ec6128273f.webpack.hot-update.json new file mode 100644 index 0000000..3823c4c --- /dev/null +++ b/.next/static/webpack/076391ec6128273f.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/29420e8fdb9e3559.webpack.hot-update.json b/.next/static/webpack/29420e8fdb9e3559.webpack.hot-update.json new file mode 100644 index 0000000..20fa880 --- /dev/null +++ b/.next/static/webpack/29420e8fdb9e3559.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/33ba52be098c161e.webpack.hot-update.json b/.next/static/webpack/33ba52be098c161e.webpack.hot-update.json new file mode 100644 index 0000000..5c82546 --- /dev/null +++ b/.next/static/webpack/33ba52be098c161e.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/37b5e01eea8ed1bc.webpack.hot-update.json b/.next/static/webpack/37b5e01eea8ed1bc.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/37b5e01eea8ed1bc.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/3caf0b9ac0e57aa2.webpack.hot-update.json b/.next/static/webpack/3caf0b9ac0e57aa2.webpack.hot-update.json new file mode 100644 index 0000000..c5900ee --- /dev/null +++ b/.next/static/webpack/3caf0b9ac0e57aa2.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/admin/category-mappings/page","webpack"],"r":["app/_not-found/page"],"m":["(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js"]} \ No newline at end of file diff --git a/.next/static/webpack/421a9585f365390e.webpack.hot-update.json b/.next/static/webpack/421a9585f365390e.webpack.hot-update.json new file mode 100644 index 0000000..87c11e0 --- /dev/null +++ b/.next/static/webpack/421a9585f365390e.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","webpack"],"r":["app/_not-found/page"],"m":["(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js"]} \ No newline at end of file diff --git a/.next/static/webpack/4600e69efa6f77ed.webpack.hot-update.json b/.next/static/webpack/4600e69efa6f77ed.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/4600e69efa6f77ed.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/5371990b51e58af5.webpack.hot-update.json b/.next/static/webpack/5371990b51e58af5.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/5371990b51e58af5.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/53c171f01978c097.webpack.hot-update.json b/.next/static/webpack/53c171f01978c097.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/53c171f01978c097.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/6aeb98c2de082c28.webpack.hot-update.json b/.next/static/webpack/6aeb98c2de082c28.webpack.hot-update.json new file mode 100644 index 0000000..b77309c --- /dev/null +++ b/.next/static/webpack/6aeb98c2de082c28.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","app/gunbuilder/build/page","app/gunbuilder/[categoryId]/[partId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/6d78bd22f79ae832.webpack.hot-update.json b/.next/static/webpack/6d78bd22f79ae832.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/6d78bd22f79ae832.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/6f38bb490ac1fcd5.webpack.hot-update.json b/.next/static/webpack/6f38bb490ac1fcd5.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/6f38bb490ac1fcd5.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/711cbdf6e524d616.webpack.hot-update.json b/.next/static/webpack/711cbdf6e524d616.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/711cbdf6e524d616.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/7a92340dcdac6dd1.webpack.hot-update.json b/.next/static/webpack/7a92340dcdac6dd1.webpack.hot-update.json new file mode 100644 index 0000000..5c82546 --- /dev/null +++ b/.next/static/webpack/7a92340dcdac6dd1.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/80d755756c628dcb.webpack.hot-update.json b/.next/static/webpack/80d755756c628dcb.webpack.hot-update.json new file mode 100644 index 0000000..3823c4c --- /dev/null +++ b/.next/static/webpack/80d755756c628dcb.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/89a404237f86ae33.webpack.hot-update.json b/.next/static/webpack/89a404237f86ae33.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/89a404237f86ae33.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/8bf7e463053525e1.webpack.hot-update.json b/.next/static/webpack/8bf7e463053525e1.webpack.hot-update.json new file mode 100644 index 0000000..5c82546 --- /dev/null +++ b/.next/static/webpack/8bf7e463053525e1.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/8ed00c0ffa8517ea.webpack.hot-update.json b/.next/static/webpack/8ed00c0ffa8517ea.webpack.hot-update.json new file mode 100644 index 0000000..3823c4c --- /dev/null +++ b/.next/static/webpack/8ed00c0ffa8517ea.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/91342a80eaa2cbe0.webpack.hot-update.json b/.next/static/webpack/91342a80eaa2cbe0.webpack.hot-update.json new file mode 100644 index 0000000..20fa880 --- /dev/null +++ b/.next/static/webpack/91342a80eaa2cbe0.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/9536828ef4709968.webpack.hot-update.json b/.next/static/webpack/9536828ef4709968.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/9536828ef4709968.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/9f5a73668c8e9d1f.webpack.hot-update.json b/.next/static/webpack/9f5a73668c8e9d1f.webpack.hot-update.json new file mode 100644 index 0000000..5c82546 --- /dev/null +++ b/.next/static/webpack/9f5a73668c8e9d1f.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/a6f46b17097acafc.webpack.hot-update.json b/.next/static/webpack/a6f46b17097acafc.webpack.hot-update.json new file mode 100644 index 0000000..b77309c --- /dev/null +++ b/.next/static/webpack/a6f46b17097acafc.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","app/gunbuilder/build/page","app/gunbuilder/[categoryId]/[partId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/adf656cf7013b288.webpack.hot-update.json b/.next/static/webpack/adf656cf7013b288.webpack.hot-update.json new file mode 100644 index 0000000..2e7398d --- /dev/null +++ b/.next/static/webpack/adf656cf7013b288.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":["app/_not-found/page"],"m":["(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js"]} \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.6aeb98c2de082c28.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.6aeb98c2de082c28.hot-update.js new file mode 100644 index 0000000..8e1ca72 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.6aeb98c2de082c28.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/[partId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n// This is old and can probably be deleted\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFRiwwQ0FBMEM7QUFDbkMsTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG5cbi8vIFRoaXMgaXMgb2xkIGFuZCBjYW4gcHJvYmFibHkgYmUgZGVsZXRlZFxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.a6f46b17097acafc.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.a6f46b17097acafc.hot-update.js new file mode 100644 index 0000000..0554c79 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.a6f46b17097acafc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/[partId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\n// Example – extend CATEGORIES\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsOEJBQThCO0FBQ3ZCLE1BQU1BLGFBQXVFO0lBQ2xGLFFBQVE7SUFDUjtRQUNFQyxJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUVBLFFBQVE7SUFDUjtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7Q0FDRCxDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gRXhhbXBsZSDigJMgZXh0ZW5kIENBVEVHT1JJRVNcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiB7IGlkOiBDYXRlZ29yeUlkOyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH1bXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.c7be720f450ad784.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.c7be720f450ad784.hot-update.js new file mode 100644 index 0000000..51988a4 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.c7be720f450ad784.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/[partId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.f984af7569671cf9.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.f984af7569671cf9.hot-update.js new file mode 100644 index 0000000..3421df6 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/[partId]/page.f984af7569671cf9.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/[partId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFSyxNQUFNQyxRQUFnQjtJQUMzQjtRQUNFSCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.0154b3b16227569b.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.0154b3b16227569b.hot-update.js new file mode 100644 index 0000000..8621bb5 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.0154b3b16227569b.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 444,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0FBQ2xCO0FBT0EsTUFBTUMsY0FBYztBQUVMLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTcEIsMERBQVNBO0lBQ3hCLE1BQU1xQixhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNyQiwwREFBU0E7SUFFeEIsTUFBTSxDQUFDc0IsVUFBVUMsWUFBWSxHQUFHMUIsK0NBQVFBLENBQVc7SUFDbkQsTUFBTSxDQUFDMkIsT0FBT0MsU0FBUyxHQUFHNUIsK0NBQVFBLENBQVMsRUFBRTtJQUM3QyxNQUFNLENBQUM2QixTQUFTQyxXQUFXLEdBQUc5QiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUMrQixPQUFPQyxTQUFTLEdBQUdoQywrQ0FBUUEsQ0FBZ0I7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sQ0FBQ2lDLGFBQWFDLGVBQWUsR0FBR2xDLCtDQUFRQSxDQUFTO0lBQ3ZELE1BQU0sQ0FBQ21DLFFBQVFDLFVBQVUsR0FBR3BDLCtDQUFRQSxDQUFhO0lBQ2pELE1BQU0sQ0FB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Ozs7Ozs7Ozs7a0VBSWpCLDhEQUFDaUM7d0RBQUlELFdBQVU7a0VBQ1pxQixLQUFLM0QsS0FBSzs7Ozs7O2tFQUViLDhEQUFDdUM7d0RBQUlELFdBQVU7OzREQUFxRDs0REFDaEVxQixLQUFLMUQsS0FBSyxDQUFDMkQsT0FBTyxDQUFDOzs7Ozs7O2tFQUV2Qiw4REFBQ3JCO3dEQUFJRCxXQUFVOzswRUFDYiw4REFBQ2pILGlEQUFJQTtnRUFDSG9ILE1BQU0sZUFBNkJrQixPQUFkaEgsWUFBVyxLQUFXLE9BQVJnSCxLQUFLckYsRUFBRTtnRUFDMUNnRSxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNNO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1BsQyxpQkFBaUJqRSxZQUFZZ0gsS0FBS3JGLEVBQUU7Z0VBRXRDZ0UsV0FBVyxvRkFJVixPQUhDeEIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0ExQ3JDNkMsS0FBS3JGLEVBQUU7Ozs7O29DQWdEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0FwZHdCN0I7O1FBQ1BuQixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRmtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbmNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcbn07XG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0Iiwibm9ybWFsaXplZFF1ZXJ5IiwidHJpbSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJzZWxlY3RlZElkIiwic2VsZWN0ZWQiLCJvdGhlcnMiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJpbnB1dCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwicGxhY2Vob2xkZXIiLCJzZWxlY3QiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.04e447b5b4d809a6.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.04e447b5b4d809a6.hot-update.js new file mode 100644 index 0000000..ca68d63 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.04e447b5b4d809a6.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optics: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpY3M6IFtcIm9wdGljXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFtcInRyaWdnZXJcIiwgXCJ0cmlnZ2VyLWtpdFwiXSxcbiAgZ3JpcDogW1wicGlzdG9sLWdyaXBcIiwgXCJncmlwXCJdLFxuICBzYWZldHk6IFtcInNhZmV0eVwiLCBcInNhZmV0eS1zZWxlY3RvclwiXSxcbiAgY29tcGxldGVMb3dlcjogW1wiY29tcGxldGUtbG93ZXJcIl0sXG5cbiAgLy8gTkVXIFVQUEVSIFBBUlRTXG4gIGNvbXBsZXRlVXBwZXI6IFtcImNvbXBsZXRlLXVwcGVyXCJdLFxuICBiY2c6IFtcImJjZ1wiLCBcImJvbHQtY2Fycmllci1ncm91cFwiXSxcbiAgZ2FzQmxvY2s6IFtcImdhcy1ibG9ja1wiXSxcbiAgZ2FzVHViZTogW1wiZ2FzLXR1YmVcIl0sXG4gIG11enpsZURldmljZTogW1wibXV6emxlLWRldmljZVwiLCBcImNvbXBlbnNhdG9yXCIsIFwiYnJha2VcIl0sXG4gIHN1cHByZXNzb3I6IFtcInN1cHByZXNzb3JcIl0sXG59O1xuXG4vLyBJbnZlcnQgdG8gZ2V0IHBhcnRSb2xlIC0+IENhdGVnb3J5SWRcbmV4cG9ydCBjb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0gT2JqZWN0XG4gIC5lbnRyaWVzKENBVEVHT1JZX1RPX1BBUlRfUk9MRVMpXG4gIC5yZWR1Y2UoKGFjYywgW2NhdGVnb3J5SWQsIHJvbGVzXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgYWNjW3JvbGVdID0gY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPik7Il0sIm5hbWVzIjpbIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWNzIiwic3RvY2siLCJ0cmlnZ2VyIiwiZ3JpcCIsInNhZmV0eSIsImNvbXBsZXRlTG93ZXIiLCJjb21wbGV0ZVVwcGVyIiwiYmNnIiwiZ2FzQmxvY2siLCJnYXNUdWJlIiwibXV6emxlRGV2aWNlIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.29420e8fdb9e3559.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.29420e8fdb9e3559.hot-update.js new file mode 100644 index 0000000..855cd5b --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.29420e8fdb9e3559.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optics\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFTO0lBQ2pCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNzXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFtcInRyaWdnZXJcIiwgXCJ0cmlnZ2VyLWtpdFwiXSxcbiAgZ3JpcDogW1wicGlzdG9sLWdyaXBcIiwgXCJncmlwXCJdLFxuICBzYWZldHk6IFtcInNhZmV0eVwiLCBcInNhZmV0eS1zZWxlY3RvclwiXSxcbiAgY29tcGxldGVMb3dlcjogW1wiY29tcGxldGUtbG93ZXJcIl0sXG5cbiAgLy8gTkVXIFVQUEVSIFBBUlRTXG4gIGNvbXBsZXRlVXBwZXI6IFtcImNvbXBsZXRlLXVwcGVyXCJdLFxuICBiY2c6IFtcImJjZ1wiLCBcImJvbHQtY2Fycmllci1ncm91cFwiXSxcbiAgZ2FzQmxvY2s6IFtcImdhcy1ibG9ja1wiXSxcbiAgZ2FzVHViZTogW1wiZ2FzLXR1YmVcIl0sXG4gIG11enpsZURldmljZTogW1wibXV6emxlLWRldmljZVwiLCBcImNvbXBlbnNhdG9yXCIsIFwiYnJha2VcIl0sXG4gIHN1cHByZXNzb3I6IFtcInN1cHByZXNzb3JcIl0sXG59O1xuXG4vLyBJbnZlcnQgdG8gZ2V0IHBhcnRSb2xlIC0+IENhdGVnb3J5SWRcbmV4cG9ydCBjb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0gT2JqZWN0XG4gIC5lbnRyaWVzKENBVEVHT1JZX1RPX1BBUlRfUk9MRVMpXG4gIC5yZWR1Y2UoKGFjYywgW2NhdGVnb3J5SWQsIHJvbGVzXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgYWNjW3JvbGVdID0gY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPik7Il0sIm5hbWVzIjpbIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsInRyaWdnZXIiLCJncmlwIiwic2FmZXR5IiwiY29tcGxldGVMb3dlciIsImNvbXBsZXRlVXBwZXIiLCJiY2ciLCJnYXNCbG9jayIsImdhc1R1YmUiLCJtdXp6bGVEZXZpY2UiLCJzdXBwcmVzc29yIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsImFjYyIsImNhdGVnb3J5SWQiLCJyb2xlcyIsInJvbGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.37b5e01eea8ed1bc.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.37b5e01eea8ed1bc.hot-update.js new file mode 100644 index 0000000..8621bb5 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.37b5e01eea8ed1bc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 444,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0FBQ2xCO0FBT0EsTUFBTUMsY0FBYztBQUVMLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTcEIsMERBQVNBO0lBQ3hCLE1BQU1xQixhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNyQiwwREFBU0E7SUFFeEIsTUFBTSxDQUFDc0IsVUFBVUMsWUFBWSxHQUFHMUIsK0NBQVFBLENBQVc7SUFDbkQsTUFBTSxDQUFDMkIsT0FBT0MsU0FBUyxHQUFHNUIsK0NBQVFBLENBQVMsRUFBRTtJQUM3QyxNQUFNLENBQUM2QixTQUFTQyxXQUFXLEdBQUc5QiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUMrQixPQUFPQyxTQUFTLEdBQUdoQywrQ0FBUUEsQ0FBZ0I7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sQ0FBQ2lDLGFBQWFDLGVBQWUsR0FBR2xDLCtDQUFRQSxDQUFTO0lBQ3ZELE1BQU0sQ0FBQ21DLFFBQVFDLFVBQVUsR0FBR3BDLCtDQUFRQSxDQUFhO0lBQ2pELE1BQU0sQ0FB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Ozs7Ozs7Ozs7a0VBSWpCLDhEQUFDaUM7d0RBQUlELFdBQVU7a0VBQ1pxQixLQUFLM0QsS0FBSzs7Ozs7O2tFQUViLDhEQUFDdUM7d0RBQUlELFdBQVU7OzREQUFxRDs0REFDaEVxQixLQUFLMUQsS0FBSyxDQUFDMkQsT0FBTyxDQUFDOzs7Ozs7O2tFQUV2Qiw4REFBQ3JCO3dEQUFJRCxXQUFVOzswRUFDYiw4REFBQ2pILGlEQUFJQTtnRUFDSG9ILE1BQU0sZUFBNkJrQixPQUFkaEgsWUFBVyxLQUFXLE9BQVJnSCxLQUFLckYsRUFBRTtnRUFDMUNnRSxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNNO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1BsQyxpQkFBaUJqRSxZQUFZZ0gsS0FBS3JGLEVBQUU7Z0VBRXRDZ0UsV0FBVyxvRkFJVixPQUhDeEIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0ExQ3JDNkMsS0FBS3JGLEVBQUU7Ozs7O29DQWdEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0FwZHdCN0I7O1FBQ1BuQixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRmtCIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbmNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcbn07XG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0Iiwibm9ybWFsaXplZFF1ZXJ5IiwidHJpbSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJzZWxlY3RlZElkIiwic2VsZWN0ZWQiLCJvdGhlcnMiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJpbnB1dCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwicGxhY2Vob2xkZXIiLCJzZWxlY3QiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.421a9585f365390e.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.421a9585f365390e.hot-update.js new file mode 100644 index 0000000..5035448 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.421a9585f365390e.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optics: [\n \"optics\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpY3M6IFtcIm9wdGljc1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuXG4gIC8vIE5FVyBMT1dFUiBQQVJUU1xuICB0cmlnZ2VyOiBbXCJ0cmlnZ2VyXCIsIFwidHJpZ2dlci1raXRcIl0sXG4gIGdyaXA6IFtcInBpc3RvbC1ncmlwXCIsIFwiZ3JpcFwiXSxcbiAgc2FmZXR5OiBbXCJzYWZldHlcIiwgXCJzYWZldHktc2VsZWN0b3JcIl0sXG4gIGNvbXBsZXRlTG93ZXI6IFtcImNvbXBsZXRlLWxvd2VyXCJdLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBjb21wbGV0ZVVwcGVyOiBbXCJjb21wbGV0ZS11cHBlclwiXSxcbiAgYmNnOiBbXCJiY2dcIiwgXCJib2x0LWNhcnJpZXItZ3JvdXBcIl0sXG4gIGdhc0Jsb2NrOiBbXCJnYXMtYmxvY2tcIl0sXG4gIGdhc1R1YmU6IFtcImdhcy10dWJlXCJdLFxuICBtdXp6bGVEZXZpY2U6IFtcIm11enpsZS1kZXZpY2VcIiwgXCJjb21wZW5zYXRvclwiLCBcImJyYWtlXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxufTtcblxuLy8gSW52ZXJ0IHRvIGdldCBwYXJ0Um9sZSAtPiBDYXRlZ29yeUlkXG5leHBvcnQgY29uc3QgUEFSVF9ST0xFX1RPX0NBVEVHT1JZOiBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPiA9IE9iamVjdFxuICAuZW50cmllcyhDQVRFR09SWV9UT19QQVJUX1JPTEVTKVxuICAucmVkdWNlKChhY2MsIFtjYXRlZ29yeUlkLCByb2xlc10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgIGFjY1tyb2xlXSA9IGNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4pOyJdLCJuYW1lcyI6WyJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljcyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.4600e69efa6f77ed.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.4600e69efa6f77ed.hot-update.js new file mode 100644 index 0000000..4369c6c --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.4600e69efa6f77ed.hot-update.js @@ -0,0 +1,32 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n // FIX: determine which backend partRoles map to this category\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 211,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 214,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 209,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 231,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 245,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 286,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 303,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 330,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 359,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 375,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 396,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 399,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 415,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 384,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 379,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 436,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 437,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 438,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 460,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 455,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 472,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 471,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 454,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 441,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 282,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 227,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUMwQjtBQUNIO0FBQ2E7SUFpQi9EUTtBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQVExQyxNQUFNSSxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNWLDBEQUFTQTtJQUN4QixNQUFNVyxhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNYLDBEQUFTQTtJQUV4QixNQUFNLENBQUNZLFVBQVVDLFlBQVksR0FBR2hCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR2xCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDbUIsU0FBU0MsV0FBVyxHQUFHcEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDcUIsT0FBT0MsU0FBUyxHQUFHdEIsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUN1QixhQUFhQyxlQUFlLEdBQUd4QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUN5QixRQUFRQyxVQUFVLEdBQUcxQiwrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUMyQixhQUFhQyxlQUFlLEdBQUc1QiwrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDNkIsT0FBT0MsU0FBUyxHQUFHOUIsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU0rQixTQUFTQyxPQUFPQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ3hCO1lBQzNDLE9BQU9xQixTQUFVSSxLQUFLQyxLQUFLLENBQUNMLFVBQXlCLENBQUM7UUFDeEQsRUFBRSxVQUFNO1lBQ04s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ckYsRUFBRTtnRUFDMUNnRSxXQUFVOzBFQUNYOzs7Ozs7MEVBR0QsOERBQUNNO2dFQUNDQyxNQUFLO2dFQUNMQyxTQUFTLElBQ1BsQyxpQkFBaUJqRSxZQUFZZ0gsS0FBS3JGLEVBQUU7Z0VBRXRDZ0UsV0FBVyxvRkFJVixPQUhDeEIsYUFDSSx1RUFDQTswRUFHTEEsYUFBYSxzQkFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzsyQ0ExQ3JDNkMsS0FBS3JGLEVBQUU7Ozs7O29DQWdEbEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRaEI7R0FyZHdCN0I7O1FBQ1BULHNEQUFTQTtRQUVUQyxzREFBU0E7OztLQUhGUSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB7IENBVEVHT1JZX1RPX1BBUlRfUk9MRVMgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgLy8gRklYOiBkZXRlcm1pbmUgd2hpY2ggYmFja2VuZCBwYXJ0Um9sZXMgbWFwIHRvIHRoaXMgY2F0ZWdvcnlcbiAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJTVE9SQUdFX0tFWSIsIkNhdGVnb3J5UGFnZSIsInBhcmFtcyIsImNhdGVnb3J5SWQiLCJyb3V0ZXIiLCJ2aWV3TW9kZSIsInNldFZpZXdNb2RlIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJyYW5kRmlsdGVyIiwic2V0QnJhbmRGaWx0ZXIiLCJzb3J0QnkiLCJzZXRTb3J0QnkiLCJzZWFyY2hRdWVyeSIsInNldFNlYXJjaFF1ZXJ5IiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsIndpbmRvdyIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjYXRlZ29yeSIsImZpbmQiLCJjIiwiaWQiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJoYW5kbGVUb2dnbGVQYXJ0IiwicGFydElkIiwiaXNTZWxlY3RlZCIsInByZXYiLCJ1cGRhdGVkIiwicHVzaCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm5vcm1hbGl6ZWRRdWVyeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwic2VsZWN0ZWRJZCIsInNlbGVjdGVkIiwib3RoZXJzIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsInBsYWNlaG9sZGVyIiwic2VsZWN0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.53c171f01978c097.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.53c171f01978c097.hot-update.js new file mode 100644 index 0000000..6b761a2 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.53c171f01978c097.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 218,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 252,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 274,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 247,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 346,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 340,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 402,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 394,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 444,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 478,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 456,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQW9CMUMsTUFBTUksY0FBYztBQUVMLFNBQVNDOztJQUN0QixNQUFNQyxTQUFTVCwwREFBU0E7SUFDeEIsTUFBTVUsYUFBYUQsT0FBT0MsVUFBVTtJQUNwQyxNQUFNQyxTQUFTViwwREFBU0E7SUFFeEIsTUFBTSxDQUFDVyxVQUFVQyxZQUFZLEdBQUdmLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ2dCLE9BQU9DLFNBQVMsR0FBR2pCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDa0IsU0FBU0MsV0FBVyxHQUFHbkIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDb0IsT0FBT0MsU0FBUyxHQUFHckIsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUNzQixhQUFhQyxlQUFlLEdBQUd2QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUN3QixRQUFRQyxVQUFVLEdBQUd6QiwrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUMwQixhQUFhQyxlQUFlLEdBQUczQiwrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDNEIsT0FBT0MsU0FBUyxHQUFHN0IsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU04QixTQUFTQyxPQUFPQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ3hCO1lBQzNDLE9BQU9xQixTQUFVSSxLQUFLQyxLQUFLLENBQUNMLFVBQXlCLENBQUM7UUFDeEQsRUFBRSxVQUFNO1lBQ04sT0FBTyxD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QVU7MEVBQ1g7Ozs7OzswRUFHRCw4REFBQ007Z0VBQ0NDLE1BQUs7Z0VBQ0xDLFNBQVMsSUFDUGxDLGlCQUFpQmxFLFlBQVlpSCxLQUFLdEYsRUFBRTtnRUFFdENpRSxXQUFXLG9GQUlWLE9BSEN4QixhQUNJLHVFQUNBOzBFQUdMQSxhQUFhLHNCQUFzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJDQTFDckM2QyxLQUFLdEYsRUFBRTs7Ozs7b0NBZ0RsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFoQjtHQXBkd0I3Qjs7UUFDUFIsc0RBQVNBO1FBRVRDLHNEQUFTQTs7O0tBSEZPIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeD84YjVkIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbi8vIGNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4vLyAgIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbi8vICAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4vLyAgIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuLy8gICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuLy8gICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4vLyAgIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbi8vICAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbi8vICAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuLy8gICBvcHRpYzogW1wib3B0aWNcIl0sXG4vLyAgIHN0b2NrOiBbXCJzdG9ja1wiXSxcbi8vIH07XG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsImxlbmd0aCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJoYW5kbGVUb2dnbGVQYXJ0IiwicGFydElkIiwiaXNTZWxlY3RlZCIsInByZXYiLCJ1cGRhdGVkIiwicHVzaCIsImF2YWlsYWJsZUJyYW5kcyIsIkFycmF5IiwiZnJvbSIsIlNldCIsImZpbHRlciIsIkJvb2xlYW4iLCJzb3J0IiwiYSIsImIiLCJsb2NhbGVDb21wYXJlIiwiZmlsdGVyZWRQYXJ0cyIsInJlc3VsdCIsIm5vcm1hbGl6ZWRRdWVyeSIsInRyaW0iLCJ0b0xvd2VyQ2FzZSIsImluY2x1ZGVzIiwic2VsZWN0ZWRJZCIsInNlbGVjdGVkIiwib3RoZXJzIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImgxIiwiaHJlZiIsImhlYWRlciIsInNwYW4iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImFyaWEtbGFiZWwiLCJzZWN0aW9uIiwibGFiZWwiLCJodG1sRm9yIiwiaW5wdXQiLCJ2YWx1ZSIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsInBsYWNlaG9sZGVyIiwic2VsZWN0Iiwib3B0aW9uIiwicGFydCIsInRvRml4ZWQiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.6aeb98c2de082c28.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.6aeb98c2de082c28.hot-update.js new file mode 100644 index 0000000..420e611 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.6aeb98c2de082c28.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n// This is old and can probably be deleted\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFRiwwQ0FBMEM7QUFDbkMsTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG5cbi8vIFRoaXMgaXMgb2xkIGFuZCBjYW4gcHJvYmFibHkgYmUgZGVsZXRlZFxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.89a404237f86ae33.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.89a404237f86ae33.hot-update.js new file mode 100644 index 0000000..ad63c89 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.89a404237f86ae33.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 211,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 207,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 206,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 205,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 228,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 234,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 227,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 289,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 300,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 321,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 333,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 327,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 320,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 342,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 353,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 354,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 294,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 282,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 364,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 372,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 396,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 390,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 401,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 412,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 405,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 381,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 376,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 432,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 433,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 431,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 453,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 457,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 452,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 462,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 469,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 475,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 451,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 443,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 438,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 279,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 225,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 224,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFrQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQVExQyxNQUFNSSxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNULDBEQUFTQTtJQUN4QixNQUFNVSxhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNWLDBEQUFTQTtJQUV4QixNQUFNLENBQUNXLFVBQVVDLFlBQVksR0FBR2YsK0NBQVFBLENBQVc7SUFDbkQsTUFBTSxDQUFDZ0IsT0FBT0MsU0FBUyxHQUFHakIsK0NBQVFBLENBQVMsRUFBRTtJQUM3QyxNQUFNLENBQUNrQixTQUFTQyxXQUFXLEdBQUduQiwrQ0FBUUEsQ0FBQztJQUN2QyxNQUFNLENBQUNvQixPQUFPQyxTQUFTLEdBQUdyQiwrQ0FBUUEsQ0FBZ0I7SUFFbEQsc0JBQXNCO0lBQ3RCLE1BQU0sQ0FBQ3NCLGFBQWFDLGVBQWUsR0FBR3ZCLCtDQUFRQSxDQUFTO0lBQ3ZELE1BQU0sQ0FBQ3dCLFFBQVFDLFVBQVUsR0FBR3pCLCtDQUFRQSxDQUFhO0lBQ2pELE1BQU0sQ0FBQzBCLGFBQWFDLGVBQWUsR0FBRzNCLCtDQUFRQSxDQUFTO0lBRXZELHVEQUF1RDtJQUN2RCxNQUFNLENBQUM0QixPQUFPQyxTQUFTLEdBQUc3QiwrQ0FBUUEsQ0FBYTtRQUM3QyxJQUFJLEtBQTZCLEVBQUUsRUFBVTtRQUM3QyxJQUFJO1lBQ0YsTUFBTThCLFNBQVNDLE9BQU9DLFlBQVksQ0FBQ0MsT0FBTyxDQUFDeEI7WUFDM0MsT0FBT3FCLFNBQVVJLEtBQUtDLEtBQUssQ0FBQ0wsVUFBeUIsQ0FBQztRQUN4RCxFQUFFLFVBQU07WUFDTixPQUFPLENB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QUV0Q2dFLFdBQVcsb0ZBSVYsT0FIQ3hCLGFBQ0ksdUVBQ0E7MEVBR0xBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBbGR3QjdCOztRQUNQUixzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRk8iLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvW2NhdGVnb3J5SWRdL3BhZ2UudHN4PzhiNWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgeyBQQVJUX1JPTEVfVE9fQ0FURUdPUlkgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hDYXRlZ29yeVBhcnRzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbY2F0ZWdvcnlJZF0pO1xuXG4gIC8vICBwZXJzaXN0IGJ1aWxkIHRvIGxvY2FsU3RvcmFnZSB3aGVuZXZlciBpdCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeShidWlsZCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gaWdub3JlXG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICAvLyAgaGFuZGxlciB0byB0b2dnbGUgQWRkIC8gUmVtb3ZlIGZvciB0aGlzIGNhdGVnb3J5XG4gIGNvbnN0IGhhbmRsZVRvZ2dsZVBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnRJZDtcblxuICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAvLyBSZW1vdmUgZnJvbSBidWlsZFxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZDogQnVpbGRTdGF0ZSA9IHsgLi4ucHJldiB9O1xuICAgICAgICBkZWxldGUgdXBkYXRlZFtjYXRlZ29yeUlkXTtcbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQWRkIHRvIGJ1aWxkIGFuZCBuYXZpZ2F0ZSBiYWNrIHRvIG1haW4gZ3VuYnVpbGRlciBwYWdlXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgICAgLi4ucHJldixcbiAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICB9KSk7XG4gICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJyb2xlcyIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0Iiwibm9ybWFsaXplZFF1ZXJ5IiwidHJpbSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJzZWxlY3RlZElkIiwic2VsZWN0ZWQiLCJvdGhlcnMiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJpbnB1dCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwicGxhY2Vob2xkZXIiLCJzZWxlY3QiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.91342a80eaa2cbe0.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.91342a80eaa2cbe0.hot-update.js new file mode 100644 index 0000000..9db7fe2 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.91342a80eaa2cbe0.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.a6f46b17097acafc.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.a6f46b17097acafc.hot-update.js new file mode 100644 index 0000000..1ddf6c3 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.a6f46b17097acafc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\n// Example – extend CATEGORIES\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsOEJBQThCO0FBQ3ZCLE1BQU1BLGFBQXVFO0lBQ2xGLFFBQVE7SUFDUjtRQUNFQyxJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUVBLFFBQVE7SUFDUjtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7Q0FDRCxDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gRXhhbXBsZSDigJMgZXh0ZW5kIENBVEVHT1JJRVNcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiB7IGlkOiBDYXRlZ29yeUlkOyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH1bXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.adf656cf7013b288.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.adf656cf7013b288.hot-update.js new file mode 100644 index 0000000..b6dcf78 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.adf656cf7013b288.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\n// Simple in-memory cache so navigating back to a category is instant\nconst categoryPartsCache = {};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n // Use cached parts immediately if available for this category\n const cachedParts = categoryPartsCache[categoryId];\n if (cachedParts && cachedParts.length > 0) {\n setParts(cachedParts);\n setLoading(false);\n } else {\n setLoading(true);\n }\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n // If we had cached data, we’re doing a silent refresh.\n // If not, loading was already set to true above.\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n categoryPartsCache[categoryId] = normalized;\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n if (true) {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n } catch (e) {\n // ignore storage errors\n }\n }\n return updated;\n });\n } else {\n // Add to build and jump back to the main gunbuilder page,\n // using history when possible so the page comes back instantly.\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n } catch (e) {\n // ignore storage errors\n }\n }\n return updated;\n });\n if ( true && window.history.length > 1) {\n router.back();\n } else {\n router.push(\"/gunbuilder\");\n }\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 267,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 261,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 284,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 292,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 295,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 305,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 317,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 304,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 290,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 283,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 345,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 339,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 352,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 365,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 351,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 377,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 389,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 383,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 376,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 409,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 410,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 411,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 412,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 401,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 397,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 420,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 424,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 428,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 449,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 452,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 457,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 462,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 461,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 437,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 432,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 488,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 489,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 490,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 491,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 487,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 509,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 513,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 508,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 518,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 521,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 525,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 531,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 524,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 507,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 499,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 494,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 281,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 280,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0FBQ2xCO0FBRUEscUVBQXFFO0FBQ3JFLE1BQU1DLHFCQUEwRCxDQUFDO0FBT2pFLE1BQU1DLGNBQWM7QUFFTCxTQUFTQzs7SUFDdEIsTUFBTUMsU0FBU3JCLDBEQUFTQTtJQUN4QixNQUFNc0IsYUFBYUQsT0FBT0MsVUFBVTtJQUNwQyxNQUFNQyxTQUFTdEIsMERBQVNBO0lBRXhCLE1BQU0sQ0FBQ3VCLFVBQVVDLFlBQVksR0FBRzNCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDOEIsU0FBU0MsV0FBVyxHQUFHL0IsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDZ0MsT0FBT0MsU0FBUyxHQUFHakMsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUNrQyxhQUFhQyxlQUFlLEdBQUduQywrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUNvQyxRQUFRQyxVQUFVLEdBQUdyQywrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUNzQyxhQUFhQyxlQUFlLEdBQUd2QywrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDd0MsT0FBT0MsU0FBUyxHQUFHekMsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU0wQyxTQUFTQyxPQUFPQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ3hCO1lBQzNDLE9BQU9xQixTQUFVSSxLQUFLQyxLQUFLLENBQUNMLFVBQXlCLENBQUM7UUFDeEQsRUFBRSxVQUFNO1lBQ04sT0FBTyxDQUFDO1FBQ1Y7SUFDRjtJQUVBLE1BQU1NLFdBQVdqRCw4Q0FBT0EsQ0FDdEIsSUFBTUssNkRBQVVBLENBQUM2QyxJQUFJLENBQUMsQ0FBQ0MsSUFBTUEsRUFBRUMsRUFBRSxLQUFLM0IsYUFDdEM7UUFBQ0E7S0FBVztJQUdkMUIsZ0RBQVNBLENBQUM7UUFDUixJQUFJLENBQUMwQixZQUFZO1FBRWpCLDhEQUE4RDtRQUM5RCxNQUFNNEIsY0FBY2hDLGtCQUFrQixDQUFDSSxXQUFXO1FBQ2xELElBQUk0QixlQUFlQSxZQUFZQyxNQUFNLEdBQUcsR0FBRztZQUN6Q3hCLFNBQVN1QjtZQUNUckIsV0FBVztRQUNiLE9BQU87WUFDTEEsV0FBVztRQUNiO1FBRUEsTUFBTXVCLGFBQWEsSUFBSUM7UUFFdkIsZUFBZUM7WUFDYixJQUFJO2dCQUNGLHVEQUF1RDtnQkFDdkQsaURBQWlEO2dCQUNqRHZCLFNBQVM7b0JBRUt4QjtnQkFBZCxNQUFNZ0QsUUFBUWhELENBQUFBLHFDQUFBQSxzQkFBc0IsQ0FBQ2UsV0FBVyxjQUFsQ2YsZ0RBQUFBLHFDQUFzQyxFQUFFO2dCQUV0RCxNQUFNaUQsU0FBUyxJQUFJQztnQkFDbkJELE9BQU9FLEdBQUcsQ0FBQyxZQUFZO2dCQUN2QkgsTUFBTUksT0FBTyxDQUFDLENBQUNDLElBQU1KLE9BQU9LLE1BQU0sQ0FBQyxhQUFhRDtnQkFFaEQsTUFBTUUsTUFBTSxHQUNWUCxPQURhbkQsY0FBYSw0QkFFM0IsT0FEQ21ELE1BQU1KLE1BQU0sR0FBRyxJQUFzQixPQUFsQkssT0FBT08sUUFBUSxNQUFPO2dCQUczQyxNQUFNQyxNQUFNLE1BQU1DLE1BQU1ILEtBQUs7b0JBQUVJLFFBQVFkLFdBQVdjLE1BQU07Z0JBQUM7Z0JBRXpELElBQUksQ0FBQ0YsSUFBSUcsRUFBRSxFQUFFO29CQUNYLE1BQU0sSUFBSUMsTUFBTSw0QkFBdUMsT0FBWEosSUFBSUssTUFBTSxFQUFDO2dCQUN6RDtnQkFFQSxNQUFNQyxPQUFtQyxNQUFNTixJQUFJTyxJQUFJO2dCQUV2RCxNQUFNQyxhQUFxQkYsS0FBS0csR0FBRyxDQUFDLENBQUNDO3dCQUs1QkEsVUFDR0EsaUJBQ0xBOzJCQVBxQzt3QkFDMUN6QixJQUFJeUIsRUFBRXpCLEVBQUU7d0JBQ1IzQjt3QkFDQXFELE1BQU1ELEVBQUVDLElBQUk7d0JBQ1pDLE9BQU9GLEVBQUVFLEtBQUs7d0JBQ2RDLE9BQU9ILENBQUFBLFdBQUFBLEVBQUVHLEtBQUssY0FBUEgsc0JBQUFBLFdBQVc7d0JBQ2xCSSxVQUFVSixDQUFBQSxrQkFBQUEsRUFBRUssWUFBWSxjQUFkTCw2QkFBQUEsa0JBQWtCTTt3QkFDNUJsQixLQUFLWSxDQUFBQSxZQUFBQSxFQUFFTyxNQUFNLGNBQVJQLHVCQUFBQSxZQUFZTTt3QkFDakJFLE9BQU9GO29CQUNUO2dCQUFBO2dCQUVBckQsU0FBUzZDO2dCQUNUdEQsa0JBQWtCLENBQUNJLFdBQVcsR0FBR2tEO1lBQ25DLEVBQUUsT0FBT1csS0FBVTtnQkFDakIsSUFBSUEsSUFBSVIsSUFBSSxLQUFLLGNBQWM7b0JBQ3RCUTtnQkFBVHBELFNBQVNvRCxDQUFBQSxlQUFBQSxJQUFJQyxPQUFPLGNBQVhELDBCQUFBQSxlQUFlO1lBQzFCLFNBQVU7Z0JBQ1IsSUFBSSxDQUFDL0IsV0FBV2MsTUFBTSxDQUFDbUIsT0FBTyxFQUFFO29CQUM5QnhELFdBQVc7Z0JBQ2I7WUFDRjtRQUNGO1FBRUF5QjtRQUVBLE9BQU8sSUFBTUYsV0FBV2tDLEtBQUs7SUFDL0IsR0FBRztRQUFDaEU7S0FBVztJQUVmLHFEQUFxRDtJQUNyRDFCLGdEQUFTQSxDQUFDO1FBQ1IsSUFBSSxLQUE2QixFQUFFLEVBQU87UUFDMUMsSUFBSTtZQUNGNkMsT0FBT0MsWUFBWSxDQUFDNkMsT0FBTyxDQUFDcEUsYUFBYXlCLEtBQUs0QyxTQUFTLENBQUNsRDtRQUMxRCxFQUFFLFVBQU07UUFDTixTQUFTO1FBQ1g7SUFDRixHQUFHO1FBQUNBO0tBQU07SUFFVixvREFBb0Q7SUFDcEQsTUFBTW1ELG1CQUFtQixDQUFDbkUsWUFBd0JvRTtRQUNoRCxNQUFNQyxhQUFhckQsS0FBSyxDQUFDaEIsV0FBVyxLQUFLb0U7UUFFekMsSUFBSUMsWUFBWTtZQUNkLG9CQUFvQjtZQUNwQnBELFNBQVMsQ0FBQ3FEO2dCQUNSLE1BQU1DLFVBQXNCO29CQUFFLEdBQUdELElBQUk7Z0JBQUM7Z0JBQ3RDLE9BQU9DLE9BQU8sQ0FBQ3ZFLFdBQVc7Z0JBRTFCLElBQUksSUFBNkIsRUFBRTtvQkFDakMsSUFBSTt3QkFDRm1CLE9BQU9DLFlBQVksQ0FBQzZDLE9BQU8sQ0FBQ3BFLGFBQWF5QixLQUFLNEMsU0FBUyxDQUFDSztvQkFDMUQsRUFBRSxVQUFNO29CQUNOLHdCQUF3QjtvQkFDMUI7Z0JBQ0Y7Z0JBRUEsT0FBT0E7WUFDVDtRQUNGLE9BQU87WUFDTCwwREFBMEQ7WUFDMUQsZ0VBQWdFO1lBQ2hFdEQsU0FBUyxDQUFDcUQ7Z0JBQ1IsTUFBTUMsVUFBc0I7b0JBQzFCLEdBQUdELElBQUk7b0JBQ1AsQ0FBQ3RFLFdBQVcsRUFBRW9FO2dCQUNoQjtnQkFFQSxJQUFJLElBQTZCLEVBQUU7b0JBQ2pDLElBQUk7d0JBQ0ZqRCxPQUFPQyxZQUFZLENBQUM2QyxPQUFPLENBQUNwRSxhQUFheUIsS0FBSzRDLFNBQVMsQ0FBQ0s7b0JBQzFELEVBQUUsVUFBTTtvQkFDTix3QkFBd0I7b0JBQzFCO2dCQUNGO2dCQUVBLE9BQU9BO1lBQ1Q7WUFFQSxJQUFJLEtBQTZCLElBQUlwRCxPQUFPcUQsT0FBTyxDQUFDM0MsTUFBTSxHQUFHLEdBQUc7Z0JBQzlENUIsT0FBT3dFLElBQUk7WUFDYixPQUFPO2dCQUNMeEUsT0FBT3lFLElBQUksQ0FBQztZQUNkO1FBQ0Y7SUFDRjtJQUVBLDhCQUE4QjtJQUM5QixNQUFNQyxrQkFBa0JwRyw4Q0FBT0EsQ0FDN0IsSUFDRXFHLE1BQU1DLElBQUksQ0FBQyxJQUFJQyxJQUFJMUUsTUFBTStDLEdBQUcsQ0FBQyxDQUFDQyxJQUFNQSxFQUFFRSxLQUFLLElBQ3hDeUIsTUFBTSxDQUFDQyxTQUNQQyxJQUFJLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUQsRUFBRUUsYUFBYSxDQUFDRCxLQUNwQztRQUFDL0U7S0FBTTtJQUdULDJEQUEyRDtJQUMzRCxNQUFNaUYsZ0JBQWdCOUcsOENBQU9BLENBQUM7UUFDNUIsSUFBSStHLFNBQVM7ZUFBSWxGO1NBQU07UUFFdkIsSUFBSU0sZ0JBQWdCLE9BQU87WUFDekI0RSxTQUFTQSxPQUFPUCxNQUFNLENBQUMsQ0FBQzNCLElBQU1BLEVBQUVFLEtBQUssS0FBSzVDO1FBQzVDO1FBRUEsTUFBTTZFLGtCQUFrQnpFLFlBQVkwRSxJQUFJLEdBQUdDLFdBQVc7UUFDdEQsSUFBSUYsaUJBQWlCO1lBQ25CRCxTQUFTQSxPQUFPUCxNQUFNLENBQUMsQ0FBQzNCO2dCQUN0QixNQUFNQyxPQUFPRCxFQUFFQyxJQUFJLENBQUNvQyxXQUFXO2dCQUMvQixNQUFNbkMsUUFBUUYsRUFBRUUsS0FBSyxDQUFDbUMsV0FBVztnQkFDakMsT0FDRXBDLEtBQUtxQyxRQUFRLENBQUNILG9CQUNkakMsTUFBTW9DLFFBQVEsQ0FBQ0g7WUFFbkI7UUFDRjtRQUVBLE9BQVEzRTtZQUNOLEtBQUs7Z0JBQ0gwRSxPQUFPTCxJQUFJLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUQsRUFBRTNCLEtBQUssR0FBRzRCLEVBQUU1QixLQUFLO2dCQUN2QztZQUNGLEtBQUs7Z0JBQ0grQixPQUFPTCxJQUFJLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUEsRUFBRTVCLEtBQUssR0FBRzJCLEVBQUUzQixLQUFLO2dCQUN2QztZQUNGLEtBQUs7Z0JBQ0grQixPQUFPTCxJQUFJLENBQUMsQ0FBQ0MsR0FBR0MsSUFBTUQsRUFBRTVCLEtBQUssQ0FBQzhCLGFBQWEsQ0FBQ0QsRUFBRTdCLEtBQUs7Z0JBQ25EO1lBQ0YsS0FBSztZQUNMO2dCQUVFO1FBQ0o7UUFFQSx5RUFBeUU7UUFDekUsTUFBTXFDLGFBQWEzRSxLQUFLLENBQUNoQixXQUFXO1FBQ3BDLElBQUkyRixZQUFZO1lBQ2QsTUFBTUMsV0FBV04sT0FBT1AsTUFBTSxDQUFDLENBQUMzQixJQUFNQSxFQUFFekIsRUFBRSxLQUFLZ0U7WUFDL0MsTUFBTUUsU0FBU1AsT0FBT1AsTUFBTSxDQUFDLENBQUMzQixJQUFNQSxFQUFFekIsRUFBRSxLQUFLZ0U7WUFDN0NMLFNBQVM7bUJBQUlNO21CQUFhQzthQUFPO1FBQ25DO1FBRUEsT0FBT1A7SUFDVCxHQUFHO1FBQUNsRjtRQUFPTTtRQUFhRTtRQUFRSTtRQUFPaEI7UUFBWWM7S0FBWTtJQUUvRCxJQUFJLENBQUNVLFVBQVU7UUFDYixxQkFDRSw4REFBQ3NFO1lBQUtDLFdBQVU7c0JBQ2QsNEVBQUNDO2dCQUFJRCxXQUFVOzBCQUNiLDRFQUFDQztvQkFBSUQsV0FBVTs7c0NBQ2IsOERBQUNFOzRCQUFHRixXQUFVO3NDQUEyQzs7Ozs7O3NDQUd6RCw4REFBQ3RILGlEQUFJQTs0QkFDSHlILE1BQUs7NEJBQ0xILFdBQVU7c0NBQ1g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFPWDtJQUVBLHFCQUNFLDhEQUFDRDtRQUFLQyxXQUFVO2tCQUNkLDRFQUFDQztZQUFJRCxXQUFVOzs4QkFFYiw4REFBQ0k7b0JBQU9KLFdBQVU7O3NDQUNoQiw4REFBQ3RILGlEQUFJQTs0QkFDSHlILE1BQUs7NEJBQ0xILFdBQVU7c0NBQ1g7Ozs7OztzQ0FHRCw4REFBQ0M7NEJBQUlELFdBQVU7OzhDQUNiLDhEQUFDQzs7c0RBQ0MsOERBQUM1Qzs0Q0FBRTJDLFdBQVU7c0RBQWlFOzs7Ozs7c0RBRzlFLDhEQUFDRTs0Q0FBR0YsV0FBVTs7Z0RBQ1h2RSxTQUFTNkIsSUFBSTtnREFBQzs4REFBQyw4REFBQytDO29EQUFLTCxXQUFVOzhEQUFpQjs7Ozs7Ozs7Ozs7O3NEQUVuRCw4REFBQzNDOzRDQUFFMkMsV0FBVTs7Z0RBQXNDO2dEQUMzQnZFLFNBQVM2QixJQUFJLENBQUNvQyxXQUFXO2dEQUFHOzs7Ozs7Ozs7Ozs7O2dDQUlyRCxDQUFDbkYsV0FBVyxDQUFDRSxTQUFTSixNQUFNeUIsTUFBTSxHQUFHLG1CQUNwQyw4REFBQ21FO29DQUFJRCxXQUFVOztzREFDYiw4REFBQ007NENBQ0NDLE1BQUs7NENBQ0xDLFNBQVMsSUFBTXBHLFlBQVk7NENBQzNCNEYsV0FBVyw2REFJVixPQUhDN0YsYUFBYSxTQUNULDZCQUNBOzRDQUVOc0csY0FBVztzREFDWjs7Ozs7O3NEQUdELDhEQUFDSDs0Q0FDQ0MsTUFBSzs0Q0FDTEMsU0FBUyxJQUFNcEcsWUFBWTs0Q0FDM0I0RixXQUFXLDZEQUlWLE9BSEM3RixhQUFhLFNBQ1QsNkJBQ0E7NENBRU5zRyxjQUFXO3NEQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OEJBU1QsOERBQUNDO29CQUFRVixXQUFVOzt3QkFFaEIsQ0FBQ3pGLFdBQVcsQ0FBQ0UsU0FBU0osTUFBTXlCLE1BQU0sR0FBRyxtQkFDcEMsOERBQUNtRTs0QkFBSUQsV0FBVTs7OENBQ2IsOERBQUNDO29DQUFJRCxXQUFVOzt3Q0FBd0I7d0NBQzdCO3NEQUNSLDhEQUFDSzs0Q0FBS0wsV0FBVTtzREFDYlYsY0FBY3hELE1BQU07Ozs7Ozt3Q0FDZjt3Q0FBSTt3Q0FDVDtzREFDSCw4REFBQ3VFOzRDQUFLTCxXQUFVO3NEQUNiM0YsTUFBTXlCLE1BQU07Ozs7Ozt3Q0FDUDt3Q0FBSTs7Ozs7Ozs4Q0FHZCw4REFBQ21FO29DQUFJRCxXQUFVOztzREFDZiw4REFBQ0M7NENBQUlELFdBQVU7OzhEQUNiLDhEQUFDVztvREFBTUMsU0FBUTtvREFBY1osV0FBVTs4REFBd0I7Ozs7Ozs4REFHL0QsOERBQUNDO29EQUFJRCxXQUFVOztzRUFDYiw4REFBQ2E7NERBQ0NqRixJQUFHOzREQUNIMkUsTUFBSzs0REFDTE8sT0FBTy9GOzREQUNQZ0csVUFBVSxDQUFDQyxJQUFNaEcsZUFBZWdHLEVBQUVDLE1BQU0sQ0FBQ0gsS0FBSzs0REFDOUNJLGFBQWEsVUFBc0MsT0FBNUJ6RixTQUFTNkIsSUFBSSxDQUFDb0MsV0FBVyxJQUFHOzREQUNuRE0sV0FBVTs7Ozs7O3dEQUVYakYsNkJBQ0MsOERBQUN1Rjs0REFDQ0MsTUFBSzs0REFDTEMsU0FBUyxJQUFNeEYsZUFBZTs0REFDOUJnRixXQUFVOzREQUNWUyxjQUFXO3NFQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7c0RBTUwsOERBQUNSOzRDQUFJRCxXQUFVOzs4REFDYiw4REFBQ1c7b0RBQ0NDLFNBQVE7b0RBQ1JaLFdBQVU7OERBQ1g7Ozs7Ozs4REFHRCw4REFBQ21CO29EQUNDdkYsSUFBRztvREFDSGtGLE9BQU9uRztvREFDUG9HLFVBQVUsQ0FBQ0MsSUFBTXBHLGVBQWVvRyxFQUFFQyxNQUFNLENBQUNILEtBQUs7b0RBQzlDZCxXQUFVOztzRUFFViw4REFBQ29COzREQUFPTixPQUFNO3NFQUFNOzs7Ozs7d0RBQ25CbEMsZ0JBQWdCeEIsR0FBRyxDQUFDLENBQUNnQyxrQkFDcEIsOERBQUNnQztnRUFBZU4sT0FBTzFCOzBFQUNwQkE7K0RBRFVBOzs7Ozs7Ozs7Ozs7Ozs7OztzREFNbkIsOERBQUNhOzRDQUFJRCxXQUFVOzs4REFDYiw4REFBQ1c7b0RBQU1DLFNBQVE7b0RBQVVaLFdBQVU7OERBQXdCOzs7Ozs7OERBRzNELDhEQUFDbUI7b0RBQ0N2RixJQUFHO29EQUNIa0YsT0FBT2pHO29EQUNQa0csVUFBVSxDQUFDQyxJQUNUbEcsVUFBVWtHLEVBQUVDLE1BQU0sQ0FBQ0gsS0FBSztvREFFMUJkLFdBQVU7O3NFQUVWLDhEQUFDb0I7NERBQU9OLE9BQU07c0VBQVk7Ozs7OztzRUFDMUIsOERBQUNNOzREQUFPTixPQUFNO3NFQUFZOzs7Ozs7c0VBQzFCLDhEQUFDTTs0REFBT04sT0FBTTtzRUFBYTs7Ozs7O3NFQUMzQiw4REFBQ007NERBQU9OLE9BQU07c0VBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt3QkFPbkN2Ryx3QkFDQyw4REFBQzhDOzRCQUFFMkMsV0FBVTs7Z0NBQXlDO2dDQUMzQ3ZFLFNBQVM2QixJQUFJLENBQUNvQyxXQUFXO2dDQUFHOzs7Ozs7bUNBRXJDakYsc0JBQ0YsOERBQUM0Qzs0QkFBRTJDLFdBQVU7O2dDQUNWdkY7Z0NBQU07Ozs7OzttQ0FFUDZFLGNBQWN4RCxNQUFNLEtBQUssa0JBQzNCLDhEQUFDdUI7NEJBQUUyQyxXQUFVO3NDQUF5Qzs7Ozs7bUNBR3BEN0YsYUFBYSx1QkFDZiw4REFBQzhGOzRCQUFJRCxXQUFVO3NDQUNaVixjQUFjbEMsR0FBRyxDQUFDLENBQUNpRTtnQ0FDbEIsTUFBTS9DLGFBQWFyRCxLQUFLLENBQUNoQixXQUFXLEtBQUtvSCxLQUFLekYsRUFBRTtnQ0FFaEQscUJBQ0UsOERBQUNxRTtvQ0FFQ0QsV0FBVyxrRkFJVixPQUhDMUIsYUFDSSxpRkFDQTs7c0RBR04sOERBQUMyQjs0Q0FBSUQsV0FBVTs7OERBQ2IsOERBQUNDO29EQUFJRCxXQUFVOztzRUFDYiw4REFBQ0M7NERBQUlELFdBQVU7O2dFQUNacUIsS0FBSzlELEtBQUs7Z0VBQUU7OEVBQ2IsOERBQUM4QztvRUFBS0wsV0FBVTs7d0VBQWM7d0VBQUdxQixLQUFLL0QsSUFBSTs7Ozs7Ozs7Ozs7Ozt3REFFM0MrRCxLQUFLeEQsS0FBSyxrQkFDVCw4REFBQ1I7NERBQUUyQyxXQUFVO3NFQUNWcUIsS0FBS3hELEtBQUs7Ozs7Ozs7Ozs7Ozs4REFJakIsOERBQUNvQztvREFBSUQsV0FBVTs7d0RBQXlEO3dEQUNwRXFCLEtBQUs3RCxLQUFLLENBQUM4RCxPQUFPLENBQUM7Ozs7Ozs7Ozs7Ozs7c0RBR3pCLDhEQUFDckI7NENBQUlELFdBQVU7OzhEQUNiLDhEQUFDdEgsaURBQUlBO29EQUNIeUgsTUFBTSxlQUE2QmtCLE9BQWRwSCxZQUFXLEtBQVcsT0FBUm9ILEtBQUt6RixFQUFFO29EQUMxQ29FLFdBQVU7OERBQ1g7Ozs7Ozs4REFHRCw4REFBQ007b0RBQ0NDLE1BQUs7b0RBQ0xDLFNBQVMsSUFBTXBDLGlCQUFpQm5FLFlBQVlvSCxLQUFLekYsRUFBRTtvREFDbkRvRSxXQUFXLG1GQUlWLE9BSEMxQixhQUNJLHVFQUNBOzhEQUdMQSxhQUFhLHNCQUFzQjs7Ozs7Ozs7Ozs7OzttQ0F2Q25DK0MsS0FBS3pGLEVBQUU7Ozs7OzRCQTRDbEI7Ozs7O2lEQUdGOzs4Q0FFRSw4REFBQ3FFO29DQUFJRCxXQUFVOztzREFDYiw4REFBQ0s7c0RBQUs7Ozs7OztzREFDTiw4REFBQ0E7c0RBQUs7Ozs7OztzREFDTiw4REFBQ0E7NENBQUtMLFdBQVU7c0RBQWE7Ozs7OztzREFDN0IsOERBQUNLOzRDQUFLTCxXQUFVO3NEQUFrQjs7Ozs7Ozs7Ozs7OzhDQUdwQyw4REFBQ0M7b0NBQUlELFdBQVU7OENBQ1pWLGNBQWNsQyxHQUFHLENBQUMsQ0FBQ2lFO3dDQUNsQixNQUFNL0MsYUFBYXJELEtBQUssQ0FBQ2hCLFdBQVcsS0FBS29ILEtBQUt6RixFQUFFO3dDQUVoRCxxQkFDRSw4REFBQ3FFOzRDQUVDRCxXQUFXLG9FQUlWLE9BSEMxQixhQUNJLGlGQUNBO3NEQUdOLDRFQUFDMkI7Z0RBQUlELFdBQVU7O2tFQUNiLDhEQUFDQzt3REFBSUQsV0FBVTs7MEVBQ2IsOERBQUNDO2dFQUFJRCxXQUFVOzBFQUNacUIsS0FBSy9ELElBQUk7Ozs7Ozs0REFFWCtELEtBQUt4RCxLQUFLLGtCQUNULDhEQUFDUjtnRUFBRTJDLFdBQVU7MEVBQ1ZxQixLQUFLeEQsS0FBSzs7Ozs7Ozs7Ozs7O2tFQUlqQiw4REFBQ29DO3dEQUFJRCxXQUFVO2tFQUNacUIsS0FBSzlELEtBQUs7Ozs7OztrRUFFYiw4REFBQzBDO3dEQUFJRCxXQUFVOzs0REFBcUQ7NERBQ2hFcUIsS0FBSzdELEtBQUssQ0FBQzhELE9BQU8sQ0FBQzs7Ozs7OztrRUFFdkIsOERBQUNyQjt3REFBSUQsV0FBVTs7MEVBQ2IsOERBQUN0SCxpREFBSUE7Z0VBQ0h5SCxNQUFNLGVBQTZCa0IsT0FBZHBILFlBQVcsS0FBVyxPQUFSb0gsS0FBS3pGLEVBQUU7Z0VBQzFDb0UsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDTTtnRUFDQ0MsTUFBSztnRUFDTEMsU0FBUyxJQUNQcEMsaUJBQWlCbkUsWUFBWW9ILEtBQUt6RixFQUFFO2dFQUV0Q29FLFdBQVcsb0ZBSVYsT0FIQzFCLGFBQ0ksdUVBQ0E7MEVBR0xBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQytDLEtBQUt6RixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBNWZ3QjdCOztRQUNQcEIsc0RBQVNBO1FBRVRDLHNEQUFTQTs7O0tBSEZtQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG4gIGxvd2VyOiBbXCJsb3dlci1yZWNlaXZlclwiXSxcbiAgb3B0aWM6IFtcIm9wdGljXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG59O1xuXG4vLyBTaW1wbGUgaW4tbWVtb3J5IGNhY2hlIHNvIG5hdmlnYXRpbmcgYmFjayB0byBhIGNhdGVnb3J5IGlzIGluc3RhbnRcbmNvbnN0IGNhdGVnb3J5UGFydHNDYWNoZTogUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgUGFydFtdPj4gPSB7fTtcblxuLy8gc29ydCBvcHRpb25zXG50eXBlIFNvcnRPcHRpb24gPSBcInJlbGV2YW5jZVwiIHwgXCJwcmljZS1hc2NcIiB8IFwicHJpY2UtZGVzY1wiIHwgXCJicmFuZC1hc2NcIjtcblxuLy8gYnVpbGQgc3RhdGUgdHlwZSArIHN0b3JhZ2Uga2V5IChtYXRjaGVzIC9ndW5idWlsZGVyKVxudHlwZSBCdWlsZFN0YXRlID0gUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nPj47XG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG5cbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBmaWx0ZXIgKyBzb3J0IHN0YXRlXG4gIGNvbnN0IFticmFuZEZpbHRlciwgc2V0QnJhbmRGaWx0ZXJdID0gdXNlU3RhdGU8c3RyaW5nPihcImFsbFwiKTtcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPFNvcnRPcHRpb24+KFwicmVsZXZhbmNlXCIpO1xuICBjb25zdCBbc2VhcmNoUXVlcnksIHNldFNlYXJjaFF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZz4oXCJcIik7XG5cbiAgLy8gIGJ1aWxkIHN0YXRlIGZvciB0aGlzIHBhZ2UsIHN5bmNlZCB3aXRoIGxvY2FsU3RvcmFnZVxuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgcmV0dXJuIHN0b3JlZCA/IChKU09OLnBhcnNlKHN0b3JlZCkgYXMgQnVpbGRTdGF0ZSkgOiB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNhdGVnb3J5ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpLFxuICAgIFtjYXRlZ29yeUlkXSxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2F0ZWdvcnlJZCkgcmV0dXJuO1xuXG4gICAgLy8gVXNlIGNhY2hlZCBwYXJ0cyBpbW1lZGlhdGVseSBpZiBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnlcbiAgICBjb25zdCBjYWNoZWRQYXJ0cyA9IGNhdGVnb3J5UGFydHNDYWNoZVtjYXRlZ29yeUlkXTtcbiAgICBpZiAoY2FjaGVkUGFydHMgJiYgY2FjaGVkUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgc2V0UGFydHMoY2FjaGVkUGFydHMpO1xuICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2F0ZWdvcnlQYXJ0cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIElmIHdlIGhhZCBjYWNoZWQgZGF0YSwgd2XigJlyZSBkb2luZyBhIHNpbGVudCByZWZyZXNoLlxuICAgICAgICAvLyBJZiBub3QsIGxvYWRpbmcgd2FzIGFscmVhZHkgc2V0IHRvIHRydWUgYWJvdmUuXG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQ0FURUdPUllfVE9fUEFSVF9ST0xFU1tjYXRlZ29yeUlkXSA/PyBbXTtcblxuICAgICAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIHNlYXJjaC5zZXQoXCJwbGF0Zm9ybVwiLCBcIkFSLTE1XCIpO1xuICAgICAgICByb2xlcy5mb3JFYWNoKChyKSA9PiBzZWFyY2guYXBwZW5kKFwicGFydFJvbGVzXCIsIHIpKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyJHtcbiAgICAgICAgICByb2xlcy5sZW5ndGggPyBgPyR7c2VhcmNoLnRvU3RyaW5nKCl9YCA6IFwiXCJcbiAgICAgICAgfWA7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGEubWFwKChwKSA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkLFxuICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICAgIGNhdGVnb3J5UGFydHNDYWNoZVtjYXRlZ29yeUlkXSA9IG5vcm1hbGl6ZWQ7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAoIWNvbnRyb2xsZXIuc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyAgcGVyc2lzdCBidWlsZCB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgLy8gIGhhbmRsZXIgdG8gdG9nZ2xlIEFkZCAvIFJlbW92ZSBmb3IgdGhpcyBjYXRlZ29yeVxuICBjb25zdCBoYW5kbGVUb2dnbGVQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0SWQ7XG5cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gUmVtb3ZlIGZyb20gYnVpbGRcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQ6IEJ1aWxkU3RhdGUgPSB7IC4uLnByZXYgfTtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbY2F0ZWdvcnlJZF07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgc3RvcmFnZSBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gYnVpbGQgYW5kIGp1bXAgYmFjayB0byB0aGUgbWFpbiBndW5idWlsZGVyIHBhZ2UsXG4gICAgICAvLyB1c2luZyBoaXN0b3J5IHdoZW4gcG9zc2libGUgc28gdGhlIHBhZ2UgY29tZXMgYmFjayBpbnN0YW50bHkuXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkOiBCdWlsZFN0YXRlID0ge1xuICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgW2NhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgc3RvcmFnZSBlcnJvcnNcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuaGlzdG9yeS5sZW5ndGggPiAxKSB7XG4gICAgICAgIHJvdXRlci5iYWNrKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3V0ZXIucHVzaChcIi9ndW5idWlsZGVyXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBhdmFpbGFibGUgYnJhbmRzIGZvciBmaWx0ZXJcbiAgY29uc3QgYXZhaWxhYmxlQnJhbmRzID0gdXNlTWVtbyhcbiAgICAoKSA9PlxuICAgICAgQXJyYXkuZnJvbShuZXcgU2V0KHBhcnRzLm1hcCgocCkgPT4gcC5icmFuZCkpKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpLFxuICAgIFtwYXJ0c10sXG4gICk7XG5cbiAgLy8gZmlsdGVyZWQgKyBzb3J0ZWQgcGFydHMgd2l0aCBzZWxlY3RlZCBwYXJ0IHBpbm5lZCB0byB0b3BcbiAgY29uc3QgZmlsdGVyZWRQYXJ0cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGxldCByZXN1bHQgPSBbLi4ucGFydHNdO1xuXG4gICAgaWYgKGJyYW5kRmlsdGVyICE9PSBcImFsbFwiKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmJyYW5kID09PSBicmFuZEZpbHRlcik7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9ybWFsaXplZFF1ZXJ5ID0gc2VhcmNoUXVlcnkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKG5vcm1hbGl6ZWRRdWVyeSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gcC5uYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gcC5icmFuZC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIG5hbWUuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KSB8fFxuICAgICAgICAgIGJyYW5kLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHN3aXRjaCAoc29ydEJ5KSB7XG4gICAgICBjYXNlIFwicHJpY2UtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLnByaWNlIC0gYi5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInByaWNlLWRlc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGIucHJpY2UgLSBhLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiYnJhbmQtYXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBhLmJyYW5kLmxvY2FsZUNvbXBhcmUoYi5icmFuZCkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJyZWxldmFuY2VcIjpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIC8vIGxlYXZlIGluIGJhY2tlbmQgb3JkZXJcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gUGluIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGFydCAoZm9yIHRoaXMgY2F0ZWdvcnkpIHRvIHRoZSB0b3AsIGlmIGFueVxuICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBidWlsZFtjYXRlZ29yeUlkXTtcbiAgICBpZiAoc2VsZWN0ZWRJZCkge1xuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZElkKTtcbiAgICAgIGNvbnN0IG90aGVycyA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgIT09IHNlbGVjdGVkSWQpO1xuICAgICAgcmVzdWx0ID0gWy4uLnNlbGVjdGVkLCAuLi5vdGhlcnNdO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0sIFtwYXJ0cywgYnJhbmRGaWx0ZXIsIHNvcnRCeSwgYnVpbGQsIGNhdGVnb3J5SWQsIHNlYXJjaFF1ZXJ5XSk7XG5cbiAgaWYgKCFjYXRlZ29yeSkge1xuICAgIHJldHVybiAoXG4gICAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cInRleHQtMnhsIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwIG1iLTRcIj5cbiAgICAgICAgICAgICAgQ2F0ZWdvcnkgTm90IEZvdW5kXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDAgaG92ZXI6dGV4dC1hbWJlci0yMDAgdW5kZXJsaW5lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgUmV0dXJuIHRvIEd1bmJ1aWxkZXJcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L21haW4+XG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02XCI+XG4gICAgICAgICAgPExpbmtcbiAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMCBtYi00IGlubGluZS1ibG9ja1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAg4oaQIEJhY2sgdG8gVGhlIEFybW9yeVxuICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00XCI+XG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgICB7Y2F0ZWdvcnkubmFtZX0gPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5QYXJ0czwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICBCcm93c2UgYWxsIGF2YWlsYWJsZSB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfSBvcHRpb25zIGZvclxuICAgICAgICAgICAgICAgIHlvdXIgYnVpbGQsIHB1bGxlZCBsaXZlIGZyb20geW91ciBCYWxsaXN0aWMgYmFja2VuZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZ2FwLTIgYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMSBiZy16aW5jLTk1MC82MFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJjYXJkXCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImNhcmRcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2FyZCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBDYXJkXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwibGlzdFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJMaXN0IHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3RcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogUGFydHMgR3JpZC9MaXN0ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvNjAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIHsvKiBGaWx0ZXIgKyBzb3J0IHRvb2xiYXIgKi99XG4gICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWNlbnRlciBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaG93aW5ne1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIG9me1wiIFwifVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0yMDAgZm9udC1tZWRpdW1cIj5cbiAgICAgICAgICAgICAgICAgIHtwYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtM1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJwYXJ0LXNlYXJjaFwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VhcmNoXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwYXJ0LXNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NlYXJjaFF1ZXJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNlYXJjaFF1ZXJ5KGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e2BTZWFyY2ggJHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9Li4uYH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgcHItNiBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB7c2VhcmNoUXVlcnkgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VhcmNoUXVlcnkoXCJcIil9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMSB0b3AtMS8yIC10cmFuc2xhdGUteS0xLzIgdGV4dC16aW5jLTUwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIHRleHQteHMgbGVhZGluZy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIMOXXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICAgICAgICAgIGh0bWxGb3I9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBCcmFuZFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJicmFuZC1maWx0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YnJhbmRGaWx0ZXJ9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QnJhbmRGaWx0ZXIoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImFsbFwiPkFsbCBicmFuZHM8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAge2F2YWlsYWJsZUJyYW5kcy5tYXAoKGIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17Yn0gdmFsdWU9e2J9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2J9XG4gICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGh0bWxGb3I9XCJzb3J0LWJ5XCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIFNvcnRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwic29ydC1ieVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzb3J0Qnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBzZXRTb3J0QnkoZS50YXJnZXQudmFsdWUgYXMgU29ydE9wdGlvbilcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBmb2N1czpvdXRsaW5lLW5vbmUgZm9jdXM6cmluZy0xIGZvY3VzOnJpbmctYW1iZXItNDAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInJlbGV2YW5jZVwiPlJlbGV2YW5jZTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtYXNjXCI+UHJpY2U6IExvdyDihpIgSGlnaDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicHJpY2UtZGVzY1wiPlByaWNlOiBIaWdoIOKGkiBMb3c8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImJyYW5kLWFzY1wiPkJyYW5kOiBBIOKGkiBaPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAge2xvYWRpbmcgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl94oCmXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGVycm9yID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGZpbHRlcmVkUGFydHMubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTm8gcGFydHMgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5IHlldC5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogdmlld01vZGUgPT09IFwiY2FyZFwiID8gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIG1kOmdyaWQtY29scy0yIGxnOmdyaWQtY29scy0zXCI+XG4gICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGZsZXggZmxleC1jb2wgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbm9ybWFsXCI+4oCUIHtwYXJ0Lm5hbWV9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMiBmbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGZsZXgtMSByb3VuZGVkLW1kIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIHsvKiBIZWFkZXIgcm93IGZvciBsaXN0IHZpZXcgKi99XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIG1kOmdyaWQgZ3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBnYXAtNCBweC0zIHBiLTIgdGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPlBhcnQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4+QnJhbmQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodFwiPlByaWNlPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHQgcHItMlwiPkFjdGlvbnM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZ3JvdXAgcmVsYXRpdmUgcm91bmRlZC1tZCBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGdhcC0yIG1kOmdyaWQgbWQ6Z3JpZC1jb2xzLVttaW5tYXgoMCwzZnIpX21pbm1heCgwLDFmcilfbWlubWF4KDAsMWZyKV9hdXRvXSBtZDppdGVtcy1jZW50ZXIgbWQ6Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG1pbi13LTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG1kOnRleHQtc20gdGV4dC16aW5jLTQwMCBtZDp0ZXh0LWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIG1kOnRleHQtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWVuZCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5SWR9LyR7cGFydC5pZH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTgwMC81MCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlVG9nZ2xlUGFydChjYXRlZ29yeUlkLCBwYXJ0LmlkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Byb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcCAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZU1lbW8iLCJ1c2VTdGF0ZSIsIkxpbmsiLCJ1c2VQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsImNhdGVnb3J5UGFydHNDYWNoZSIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNhY2hlZFBhcnRzIiwibGVuZ3RoIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnRlZCIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJoaXN0b3J5IiwiYmFjayIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJub3JtYWxpemVkUXVlcnkiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInNlbGVjdGVkSWQiLCJzZWxlY3RlZCIsIm90aGVycyIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsImlucHV0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJwbGFjZWhvbGRlciIsInNlbGVjdCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.b6c8dff37046039f.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.b6c8dff37046039f.hot-update.js new file mode 100644 index 0000000..bbebeb2 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.b6c8dff37046039f.hot-update.js @@ -0,0 +1,32 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _PART_ROLE_TO_CATEGORY_categoryId;\n const roles = (_PART_ROLE_TO_CATEGORY_categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_5__.PART_ROLE_TO_CATEGORY[categoryId]) !== null && _PART_ROLE_TO_CATEGORY_categoryId !== void 0 ? _PART_ROLE_TO_CATEGORY_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 210,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 213,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 209,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 208,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 207,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 230,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 244,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 229,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 287,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 291,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 285,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 302,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 311,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 301,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 337,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 329,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 322,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 344,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 358,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 347,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 343,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 284,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 366,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 374,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 395,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 398,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 392,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 414,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 407,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 383,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 378,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 436,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 437,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 433,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 455,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 459,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 454,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 467,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 471,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 477,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 470,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 453,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 440,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 281,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 227,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUMwQjtBQUNIO0FBQ1k7SUFpQjlEUTtBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQVExQyxNQUFNSSxjQUFjO0FBRUwsU0FBU0M7O0lBQ3RCLE1BQU1DLFNBQVNWLDBEQUFTQTtJQUN4QixNQUFNVyxhQUFhRCxPQUFPQyxVQUFVO0lBQ3BDLE1BQU1DLFNBQVNYLDBEQUFTQTtJQUV4QixNQUFNLENBQUNZLFVBQVVDLFlBQVksR0FBR2hCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR2xCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDbUIsU0FBU0MsV0FBVyxHQUFHcEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDcUIsT0FBT0MsU0FBUyxHQUFHdEIsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUN1QixhQUFhQyxlQUFlLEdBQUd4QiwrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUN5QixRQUFRQyxVQUFVLEdBQUcxQiwrQ0FBUUEsQ0FBYTtJQUNqRCxNQUFNLENBQUMyQixhQUFhQyxlQUFlLEdBQUc1QiwrQ0FBUUEsQ0FBUztJQUV2RCx1REFBdUQ7SUFDdkQsTUFBTSxDQUFDNkIsT0FBT0MsU0FBUyxHQUFHOUIsK0NBQVFBLENBQWE7UUFDN0MsSUFBSSxLQUE2QixFQUFFLEVBQVU7UUFDN0MsSUFBSTtZQUNGLE1BQU0rQixTQUFTQyxPQUFPQyxZQUFZLENBQUNDLE9BQU8sQ0FBQ3hCO1lBQzNDLE9BQU9xQixTQUFVSSxLQUFLQyxLQUFLLENBQUNMLFVBQXlCLENBQUM7UUFDeEQsRUFBRSxVQUFNO1lBQ04s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Z0UsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDTTtnRUFDQ0MsTUFBSztnRUFDTEMsU0FBUyxJQUNQbEMsaUJBQWlCakUsWUFBWWdILEtBQUtyRixFQUFFO2dFQUV0Q2dFLFdBQVcsb0ZBSVYsT0FIQ3hCLGFBQ0ksdUVBQ0E7MEVBR0xBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBcGR3QjdCOztRQUNQVCxzREFBU0E7UUFFVEMsc0RBQVNBOzs7S0FIRlEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvW2NhdGVnb3J5SWRdL3BhZ2UudHN4PzhiNWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgeyBQQVJUX1JPTEVfVE9fQ0FURUdPUlkgfSBmcm9tIFwiQC9kYXRhL3BhcnRSb2xlTWFwcGluZ3NcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IFBBUlRfUk9MRV9UT19DQVRFR09SWVtjYXRlZ29yeUlkXSA/PyBbXTtcblxuICAgICAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIHNlYXJjaC5zZXQoXCJwbGF0Zm9ybVwiLCBcIkFSLTE1XCIpO1xuICAgICAgICByb2xlcy5mb3JFYWNoKChyKSA9PiBzZWFyY2guYXBwZW5kKFwicGFydFJvbGVzXCIsIHIpKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyJHtcbiAgICAgICAgICByb2xlcy5sZW5ndGggPyBgPyR7c2VhcmNoLnRvU3RyaW5nKCl9YCA6IFwiXCJcbiAgICAgICAgfWA7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGEubWFwKChwKSA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkLFxuICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaENhdGVnb3J5UGFydHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtjYXRlZ29yeUlkXSk7XG5cbiAgLy8gIHBlcnNpc3QgYnVpbGQgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIC8vICBoYW5kbGVyIHRvIHRvZ2dsZSBBZGQgLyBSZW1vdmUgZm9yIHRoaXMgY2F0ZWdvcnlcbiAgY29uc3QgaGFuZGxlVG9nZ2xlUGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydElkO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIGJ1aWxkXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkOiBCdWlsZFN0YXRlID0geyAuLi5wcmV2IH07XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2NhdGVnb3J5SWRdO1xuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gYnVpbGQgYW5kIG5hdmlnYXRlIGJhY2sgdG8gbWFpbiBndW5idWlsZGVyIHBhZ2VcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICAgIH0pKTtcbiAgICAgIHJvdXRlci5wdXNoKFwiL2d1bmJ1aWxkZXJcIik7XG4gICAgfVxuICB9O1xuXG4gIC8vIGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBmaWx0ZXJlZCArIHNvcnRlZCBwYXJ0cyB3aXRoIHNlbGVjdGVkIHBhcnQgcGlubmVkIHRvIHRvcFxuICBjb25zdCBmaWx0ZXJlZFBhcnRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IFsuLi5wYXJ0c107XG5cbiAgICBpZiAoYnJhbmRGaWx0ZXIgIT09IFwiYWxsXCIpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuYnJhbmQgPT09IGJyYW5kRmlsdGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBzZWFyY2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZFF1ZXJ5KSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYnJhbmQgPSBwLmJyYW5kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbmFtZS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgICAgYnJhbmQuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgXCJwcmljZS1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEucHJpY2UgLSBiLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpY2UtZGVzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYi5wcmljZSAtIGEucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJicmFuZC1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuYnJhbmQubG9jYWxlQ29tcGFyZShiLmJyYW5kKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbGV2YW5jZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gbGVhdmUgaW4gYmFja2VuZCBvcmRlclxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBQaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJ0IChmb3IgdGhpcyBjYXRlZ29yeSkgdG8gdGhlIHRvcCwgaWYgYW55XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IGJ1aWxkW2NhdGVnb3J5SWRdO1xuICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgPT09IHNlbGVjdGVkSWQpO1xuICAgICAgY29uc3Qgb3RoZXJzID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gc2VsZWN0ZWRJZCk7XG4gICAgICByZXN1bHQgPSBbLi4uc2VsZWN0ZWQsIC4uLm90aGVyc107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5LCBidWlsZCwgY2F0ZWdvcnlJZCwgc2VhcmNoUXVlcnldKTtcblxuICBpZiAoIWNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTAgbWItNFwiPlxuICAgICAgICAgICAgICBDYXRlZ29yeSBOb3QgRm91bmRcbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMCBob3Zlcjp0ZXh0LWFtYmVyLTIwMCB1bmRlcmxpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXR1cm4gdG8gR3VuYnVpbGRlclxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWFpbj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTZcIj5cbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIG1iLTQgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDihpAgQmFjayB0byBUaGUgQXJtb3J5XG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfSA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPlBhcnRzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgIEJyb3dzZSBhbGwgYXZhaWxhYmxlIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9IG9wdGlvbnMgZm9yXG4gICAgICAgICAgICAgICAgeW91ciBidWlsZCwgcHVsbGVkIGxpdmUgZnJvbSB5b3VyIEJhbGxpc3RpYyBiYWNrZW5kLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0xIGJnLXppbmMtOTUwLzYwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImNhcmRcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDYXJkIHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENhcmRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkxpc3Qgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTGlzdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBQYXJ0cyBHcmlkL0xpc3QgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgey8qIEZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInBhcnQtc2VhcmNoXCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICBTZWFyY2hcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInBhcnQtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17YFNlYXJjaCAke2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0uLi5gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBwci02IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIHtzZWFyY2hRdWVyeSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWFyY2hRdWVyeShcIlwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0xIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LXppbmMtNTAwIGhvdmVyOnRleHQtemluYy0zMDAgdGV4dC14cyBsZWFkaW5nLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInNvcnQtYnlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbCBib3JkZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwXCJcbiAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHJvdW5kZWQtbWQgcHgtMyBweS0yIHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIEhlYWRlciByb3cgZm9yIGxpc3QgdmlldyAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6Z3JpZCBncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIGdhcC00IHB4LTMgcGItMiB0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+UGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5CcmFuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0XCI+UHJpY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodCBwci0yXCI+QWN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItYW1iZXItNDAwLzcwIGJnLWFtYmVyLTQwMC8xMCBzaGFkb3ctWzBfMF8wXzFweF9yZ2JhKDI1MSwxOTEsMzYsMC4yNSldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6Z3JpZCBtZDpncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIG1kOml0ZW1zLWNlbnRlciBtZDpnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1kOnRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgbWQ6dGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHJvdW5kZWQtbWQgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVN0YXRlIiwiTGluayIsInVzZVBhcmFtcyIsInVzZVJvdXRlciIsIkNBVEVHT1JJRVMiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiU1RPUkFHRV9LRVkiLCJDYXRlZ29yeVBhZ2UiLCJwYXJhbXMiLCJjYXRlZ29yeUlkIiwicm91dGVyIiwidmlld01vZGUiLCJzZXRWaWV3TW9kZSIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJicmFuZEZpbHRlciIsInNldEJyYW5kRmlsdGVyIiwic29ydEJ5Iiwic2V0U29ydEJ5Iiwic2VhcmNoUXVlcnkiLCJzZXRTZWFyY2hRdWVyeSIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiaGFuZGxlVG9nZ2xlUGFydCIsInBhcnRJZCIsImlzU2VsZWN0ZWQiLCJwcmV2IiwidXBkYXRlZCIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJub3JtYWxpemVkUXVlcnkiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInNlbGVjdGVkSWQiLCJzZWxlY3RlZCIsIm90aGVycyIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsImlucHV0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJwbGFjZWhvbGRlciIsInNlbGVjdCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert the map to get partRole → categoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLHlCQUF1RDtJQUNsRUMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtJQUNqQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxPQUFPO1FBQUM7S0FBUTtJQUNoQkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLFlBQVk7UUFBQztLQUFhO0FBRTVCLEVBQVc7QUFFWCw4Q0FBOEM7QUFDdkMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDZCx3QkFDUmUsTUFBTSxDQUFDLENBQUNDO1FBQUssQ0FBQ0MsWUFBWUMsTUFBTTtJQUMvQixLQUFLLE1BQU1DLFFBQVFELE1BQU87UUFDeEJGLEdBQUcsQ0FBQ0csS0FBSyxHQUFHRjtJQUNkO0lBQ0EsT0FBT0Q7QUFDVCxHQUFHLENBQUMsR0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9wYXJ0Um9sZU1hcHBpbmdzLnRzP2M2MjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkIH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxuICBsb3dlcjogW1wibG93ZXItcmVjZWl2ZXJcIl0sXG4gIG9wdGljOiBbXCJvcHRpY1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxuICAvLyBhZGQgbmV3IGNhdGVnb3JpZXMgaGVyZSBpbiBvbmUgcGxhY2Vcbn0gYXMgY29uc3Q7XG5cbi8vIEludmVydCB0aGUgbWFwIHRvIGdldCBwYXJ0Um9sZSDihpIgY2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.c7be720f450ad784.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.c7be720f450ad784.hot-update.js new file mode 100644 index 0000000..7f95609 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.c7be720f450ad784.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.dbb1cbd00734aac6.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.dbb1cbd00734aac6.hot-update.js new file mode 100644 index 0000000..c81d685 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.dbb1cbd00734aac6.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 226,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 222,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 243,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 251,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 255,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 254,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 276,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 300,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 304,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 298,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 311,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 315,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 314,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 310,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 336,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 348,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 342,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 357,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 360,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 379,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 383,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 387,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 408,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 406,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 411,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 405,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 416,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 421,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 427,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 420,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 396,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 391,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 449,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 450,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 468,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 472,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 467,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 477,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 480,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 484,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 490,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 483,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 458,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 453,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 294,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFrQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxZQUFZO1FBQUM7S0FBYTtBQUM1QjtBQU9BLE1BQU1DLGNBQWM7QUFFTCxTQUFTQzs7SUFDdEIsTUFBTUMsU0FBU3JCLDBEQUFTQTtJQUN4QixNQUFNc0IsYUFBYUQsT0FBT0MsVUFBVTtJQUNwQyxNQUFNQyxTQUFTdEIsMERBQVNBO0lBRXhCLE1BQU0sQ0FBQ3VCLFVBQVVDLFlBQVksR0FBRzNCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDOEIsU0FBU0MsV0FBVyxHQUFHL0IsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDZ0MsT0FBT0MsU0FBUyxHQUFHakMsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUNrQyxhQUFhQyxlQUFlLEdBQUduQywrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUNvQyxRQUFRQyxVQUFVLEdBQUdyQywrQ0FB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MEVBQ1ZxQixLQUFLckQsS0FBSzs7Ozs7Ozs7Ozs7O2tFQUlqQiw4REFBQ2lDO3dEQUFJRCxXQUFVO2tFQUNacUIsS0FBSzNELEtBQUs7Ozs7OztrRUFFYiw4REFBQ3VDO3dEQUFJRCxXQUFVOzs0REFBcUQ7NERBQ2hFcUIsS0FBSzFELEtBQUssQ0FBQzJELE9BQU8sQ0FBQzs7Ozs7OztrRUFFdkIsOERBQUNyQjt3REFBSUQsV0FBVTs7MEVBQ2IsOERBQUNsSCxpREFBSUE7Z0VBQ0hxSCxNQUFNLGVBQTZCa0IsT0FBZGhILFlBQVcsS0FBVyxPQUFSZ0gsS0FBS3JGLEVBQUU7Z0VBQzFDZ0UsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDTTtnRUFDQ0MsTUFBSztnRUFDTEMsU0FBUyxJQUNQbEMsaUJBQWlCakUsWUFBWWdILEtBQUtyRixFQUFFO2dFQUV0Q2dFLFdBQVcsb0ZBSVYsT0FIQ3hCLGFBQ0ksdUVBQ0E7MEVBR0xBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBcGR3QjdCOztRQUNQcEIsc0RBQVNBO1FBRVRDLHNEQUFTQTs7O0tBSEZtQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB7IFBBUlRfUk9MRV9UT19DQVRFR09SWSB9IGZyb20gXCJAL2RhdGEvcGFydFJvbGVNYXBwaW5nc1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG50eXBlIFZpZXdNb2RlID0gXCJjYXJkXCIgfCBcImxpc3RcIjtcblxudHlwZSBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGkgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbmNvbnN0IENBVEVHT1JZX1RPX1BBUlRfUk9MRVM6IFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmdbXT4gPSB7XG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSwgXG59O1xuXG4vLyBzb3J0IG9wdGlvbnNcbnR5cGUgU29ydE9wdGlvbiA9IFwicmVsZXZhbmNlXCIgfCBcInByaWNlLWFzY1wiIHwgXCJwcmljZS1kZXNjXCIgfCBcImJyYW5kLWFzY1wiO1xuXG4vLyBidWlsZCBzdGF0ZSB0eXBlICsgc3RvcmFnZSBrZXkgKG1hdGNoZXMgL2d1bmJ1aWxkZXIpXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjtcbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENhdGVnb3J5UGFnZSgpIHtcbiAgY29uc3QgcGFyYW1zID0gdXNlUGFyYW1zKCk7XG4gIGNvbnN0IGNhdGVnb3J5SWQgPSBwYXJhbXMuY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcblxuICBjb25zdCBbdmlld01vZGUsIHNldFZpZXdNb2RlXSA9IHVzZVN0YXRlPFZpZXdNb2RlPihcImxpc3RcIik7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIGZpbHRlciArIHNvcnQgc3RhdGVcbiAgY29uc3QgW2JyYW5kRmlsdGVyLCBzZXRCcmFuZEZpbHRlcl0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiYWxsXCIpO1xuICBjb25zdCBbc29ydEJ5LCBzZXRTb3J0QnldID0gdXNlU3RhdGU8U29ydE9wdGlvbj4oXCJyZWxldmFuY2VcIik7XG4gIGNvbnN0IFtzZWFyY2hRdWVyeSwgc2V0U2VhcmNoUXVlcnldID0gdXNlU3RhdGU8c3RyaW5nPihcIlwiKTtcblxuICAvLyAgYnVpbGQgc3RhdGUgZm9yIHRoaXMgcGFnZSwgc3luY2VkIHdpdGggbG9jYWxTdG9yYWdlXG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm4ge307XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICByZXR1cm4gc3RvcmVkID8gKEpTT04ucGFyc2Uoc3RvcmVkKSBhcyBCdWlsZFN0YXRlKSA6IHt9O1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgY2F0ZWdvcnkgPSB1c2VNZW1vKFxuICAgICgpID0+IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCksXG4gICAgW2NhdGVnb3J5SWRdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKCFjYXRlZ29yeUlkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hDYXRlZ29yeVBhcnRzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3Qgcm9sZXMgPSBDQVRFR09SWV9UT19QQVJUX1JPTEVTW2NhdGVnb3J5SWRdID8/IFtdO1xuXG4gICAgICAgIGNvbnN0IHNlYXJjaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICAgICAgc2VhcmNoLnNldChcInBsYXRmb3JtXCIsIFwiQVItMTVcIik7XG4gICAgICAgIHJvbGVzLmZvckVhY2goKHIpID0+IHNlYXJjaC5hcHBlbmQoXCJwYXJ0Um9sZXNcIiwgcikpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYXBpL3Byb2R1Y3RzL2d1bmJ1aWxkZXIke1xuICAgICAgICAgIHJvbGVzLmxlbmd0aCA/IGA/JHtzZWFyY2gudG9TdHJpbmcoKX1gIDogXCJcIlxuICAgICAgICB9YDtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YS5tYXAoKHApID0+ICh7XG4gICAgICAgICAgaWQ6IHAuaWQsXG4gICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICBpbWFnZVVybDogcC5tYWluSW1hZ2VVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgIH0pKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoQ2F0ZWdvcnlQYXJ0cygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW2NhdGVnb3J5SWRdKTtcblxuICAvLyAgcGVyc2lzdCBidWlsZCB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIGlnbm9yZVxuICAgIH1cbiAgfSwgW2J1aWxkXSk7XG5cbiAgLy8gIGhhbmRsZXIgdG8gdG9nZ2xlIEFkZCAvIFJlbW92ZSBmb3IgdGhpcyBjYXRlZ29yeVxuICBjb25zdCBoYW5kbGVUb2dnbGVQYXJ0ID0gKGNhdGVnb3J5SWQ6IENhdGVnb3J5SWQsIHBhcnRJZDogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0SWQ7XG5cbiAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgLy8gUmVtb3ZlIGZyb20gYnVpbGRcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWQ6IEJ1aWxkU3RhdGUgPSB7IC4uLnByZXYgfTtcbiAgICAgICAgZGVsZXRlIHVwZGF0ZWRbY2F0ZWdvcnlJZF07XG4gICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEFkZCB0byBidWlsZCBhbmQgbmF2aWdhdGUgYmFjayB0byBtYWluIGd1bmJ1aWxkZXIgcGFnZVxuICAgICAgc2V0QnVpbGQoKHByZXYpID0+ICh7XG4gICAgICAgIC4uLnByZXYsXG4gICAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgfSkpO1xuICAgICAgcm91dGVyLnB1c2goXCIvZ3VuYnVpbGRlclwiKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gYXZhaWxhYmxlIGJyYW5kcyBmb3IgZmlsdGVyXG4gIGNvbnN0IGF2YWlsYWJsZUJyYW5kcyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIEFycmF5LmZyb20obmV3IFNldChwYXJ0cy5tYXAoKHApID0+IHAuYnJhbmQpKSlcbiAgICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgICAuc29ydCgoYSwgYikgPT4gYS5sb2NhbGVDb21wYXJlKGIpKSxcbiAgICBbcGFydHNdLFxuICApO1xuXG4gIC8vIGZpbHRlcmVkICsgc29ydGVkIHBhcnRzIHdpdGggc2VsZWN0ZWQgcGFydCBwaW5uZWQgdG8gdG9wXG4gIGNvbnN0IGZpbHRlcmVkUGFydHMgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBsZXQgcmVzdWx0ID0gWy4uLnBhcnRzXTtcblxuICAgIGlmIChicmFuZEZpbHRlciAhPT0gXCJhbGxcIikge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5icmFuZCA9PT0gYnJhbmRGaWx0ZXIpO1xuICAgIH1cblxuICAgIGNvbnN0IG5vcm1hbGl6ZWRRdWVyeSA9IHNlYXJjaFF1ZXJ5LnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChub3JtYWxpemVkUXVlcnkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHAubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBjb25zdCBicmFuZCA9IHAuYnJhbmQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBuYW1lLmluY2x1ZGVzKG5vcm1hbGl6ZWRRdWVyeSkgfHxcbiAgICAgICAgICBicmFuZC5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHNvcnRCeSkge1xuICAgICAgY2FzZSBcInByaWNlLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5wcmljZSAtIGIucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJwcmljZS1kZXNjXCI6XG4gICAgICAgIHJlc3VsdC5zb3J0KChhLCBiKSA9PiBiLnByaWNlIC0gYS5wcmljZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImJyYW5kLWFzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYS5icmFuZC5sb2NhbGVDb21wYXJlKGIuYnJhbmQpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicmVsZXZhbmNlXCI6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICAvLyBsZWF2ZSBpbiBiYWNrZW5kIG9yZGVyXG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIFBpbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcnQgKGZvciB0aGlzIGNhdGVnb3J5KSB0byB0aGUgdG9wLCBpZiBhbnlcbiAgICBjb25zdCBzZWxlY3RlZElkID0gYnVpbGRbY2F0ZWdvcnlJZF07XG4gICAgaWYgKHNlbGVjdGVkSWQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5pZCA9PT0gc2VsZWN0ZWRJZCk7XG4gICAgICBjb25zdCBvdGhlcnMgPSByZXN1bHQuZmlsdGVyKChwKSA9PiBwLmlkICE9PSBzZWxlY3RlZElkKTtcbiAgICAgIHJlc3VsdCA9IFsuLi5zZWxlY3RlZCwgLi4ub3RoZXJzXTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9LCBbcGFydHMsIGJyYW5kRmlsdGVyLCBzb3J0QnksIGJ1aWxkLCBjYXRlZ29yeUlkLCBzZWFyY2hRdWVyeV0pO1xuXG4gIGlmICghY2F0ZWdvcnkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtemluYy01MCBtYi00XCI+XG4gICAgICAgICAgICAgIENhdGVnb3J5IE5vdCBGb3VuZFxuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwIGhvdmVyOnRleHQtYW1iZXItMjAwIHVuZGVybGluZVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIFJldHVybiB0byBHdW5idWlsZGVyXG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9tYWluPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy02eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIHsvKiBIZWFkZXIgKi99XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNlwiPlxuICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDAgbWItNCBpbmxpbmUtYmxvY2tcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIOKGkCBCYWNrIHRvIFRoZSBBcm1vcnlcbiAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LTJ4bCBtZDp0ZXh0LTN4bCBmb250LXNlbWlib2xkIHRyYWNraW5nLXRpZ2h0XCI+XG4gICAgICAgICAgICAgICAge2NhdGVnb3J5Lm5hbWV9IDxzcGFuIGNsYXNzTmFtZT1cInRleHQtYW1iZXItMzAwXCI+UGFydHM8L3NwYW4+XG4gICAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgQnJvd3NlIGFsbCBhdmFpbGFibGUge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0gb3B0aW9ucyBmb3JcbiAgICAgICAgICAgICAgICB5b3VyIGJ1aWxkLCBwdWxsZWQgbGl2ZSBmcm9tIHlvdXIgQmFsbGlzdGljIGJhY2tlbmQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiBwYXJ0cy5sZW5ndGggPiAwICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGdhcC0yIGJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTEgYmctemluYy05NTAvNjBcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwiY2FyZFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJjYXJkXCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNhcmQgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0Vmlld01vZGUoXCJsaXN0XCIpfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSByb3VuZGVkIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIHZpZXdNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtNTBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOnRleHQtemluYy0zMDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiTGlzdCB2aWV3XCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgey8qIFBhcnRzIEdyaWQvTGlzdCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7LyogRmlsdGVyICsgc29ydCB0b29sYmFyICovfVxuICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMyBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hvd2luZ3tcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgPC9zcGFuPntcIiBcIn1cbiAgICAgICAgICAgICAgICBvZntcIiBcIn1cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMjAwIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICB7cGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgcGFydHNcbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTNcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwicGFydC1zZWFyY2hcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlYXJjaFxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwicGFydC1zZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzZWFyY2hRdWVyeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRTZWFyY2hRdWVyeShlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtgU2VhcmNoICR7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfS4uLmB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIHByLTYgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAge3NlYXJjaFF1ZXJ5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlYXJjaFF1ZXJ5KFwiXCIpfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTEgdG9wLTEvMiAtdHJhbnNsYXRlLXktMS8yIHRleHQtemluYy01MDAgaG92ZXI6dGV4dC16aW5jLTMwMCB0ZXh0LXhzIGxlYWRpbmctbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICDDl1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbFxuICAgICAgICAgICAgICAgICAgICBodG1sRm9yPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQnJhbmRcbiAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgIGlkPVwiYnJhbmQtZmlsdGVyXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2JyYW5kRmlsdGVyfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldEJyYW5kRmlsdGVyKGUudGFyZ2V0LnZhbHVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJhbGxcIj5BbGwgYnJhbmRzPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIHthdmFpbGFibGVCcmFuZHMubWFwKChiKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e2J9IHZhbHVlPXtifT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtifVxuICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgIDxsYWJlbCBodG1sRm9yPVwic29ydC1ieVwiIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICBTb3J0XG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cInNvcnQtYnlcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c29ydEJ5fVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgc2V0U29ydEJ5KGUudGFyZ2V0LnZhbHVlIGFzIFNvcnRPcHRpb24pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQteHMgdGV4dC16aW5jLTIwMCBweC0yIHB5LTEgZm9jdXM6b3V0bGluZS1ub25lIGZvY3VzOnJpbmctMSBmb2N1czpyaW5nLWFtYmVyLTQwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJyZWxldmFuY2VcIj5SZWxldmFuY2U8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWFzY1wiPlByaWNlOiBMb3cg4oaSIEhpZ2g8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInByaWNlLWRlc2NcIj5QcmljZTogSGlnaCDihpIgTG93PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJicmFuZC1hc2NcIj5CcmFuZDogQSDihpIgWjwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHtsb2FkaW5nID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAgTG9hZGluZyB7Y2F0ZWdvcnkubmFtZS50b0xvd2VyQ2FzZSgpfeKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBlcnJvciA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwIHRleHQtY2VudGVyIHB5LThcIj5cbiAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBmaWx0ZXJlZFBhcnRzLmxlbmd0aCA9PT0gMCA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIE5vIHBhcnRzIGF2YWlsYWJsZSBmb3IgdGhpcyBjYXRlZ29yeSB5ZXQuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IHZpZXdNb2RlID09PSBcImNhcmRcIiA/IChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gYnVpbGRbY2F0ZWdvcnlJZF0gPT09IHBhcnQuaWQ7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBrZXk9e3BhcnQuaWR9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGdyb3VwIHJlbGF0aXZlIHJvdW5kZWQtbWQgcC0zIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBmbGV4IGZsZXgtY29sIGJvcmRlciAke1xuICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItYW1iZXItNDAwLzcwIGJnLWFtYmVyLTQwMC8xMCBzaGFkb3ctWzBfMF8wXzFweF9yZ2JhKDI1MSwxOTEsMzYsMC4yNSldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIDogXCJib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgaG92ZXI6Ym9yZGVyLWFtYmVyLTQwMC82MCBob3ZlcjpiZy1hbWJlci00MDAvMTBcIlxuICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW5vcm1hbFwiPuKAlCB7cGFydC5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTQwMCBsaW5lLWNsYW1wLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTIgZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcgRGV0YWlsc1xuICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BmbGV4LTEgcm91bmRlZC1tZCBweC0zIHB5LTIgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTEwMCBib3JkZXIgYm9yZGVyLXppbmMtNjAwIGhvdmVyOmJnLXppbmMtNzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICB7LyogSGVhZGVyIHJvdyBmb3IgbGlzdCB2aWV3ICovfVxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImhpZGRlbiBtZDpncmlkIGdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gZ2FwLTQgcHgtMyBwYi0yIHRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5QYXJ0PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPkJyYW5kPC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtcmlnaHRcIj5QcmljZTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0IHByLTJcIj5BY3Rpb25zPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtmaWx0ZXJlZFBhcnRzLm1hcCgocGFydCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGdyb3VwIHJlbGF0aXZlIHJvdW5kZWQtbWQgcC0zIHRyYW5zaXRpb24tYWxsIGR1cmF0aW9uLTIwMCBib3JkZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJvcmRlci1hbWJlci00MDAvNzAgYmctYW1iZXItNDAwLzEwIHNoYWRvdy1bMF8wXzBfMXB4X3JnYmEoMjUxLDE5MSwzNiwwLjI1KV1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwXCJcbiAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpncmlkIG1kOmdyaWQtY29scy1bbWlubWF4KDAsM2ZyKV9taW5tYXgoMCwxZnIpX21pbm1heCgwLDFmcilfYXV0b10gbWQ6aXRlbXMtY2VudGVyIG1kOmdhcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBtaW4tdy0wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3RlcyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0xXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5ub3Rlc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBtZDp0ZXh0LXNtIHRleHQtemluYy00MDAgbWQ6dGV4dC1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCBtZDp0ZXh0LXJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgganVzdGlmeS1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeUlkfS8ke3BhcnQuaWR9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy04MDAvNTAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtNzAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB3aGl0ZXNwYWNlLW5vd3JhcFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRvZ2dsZVBhcnQoY2F0ZWdvcnlJZCwgcGFydC5pZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgcm91bmRlZC1tZCBweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogXCJiZy1hbWJlci00MDAgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2lzU2VsZWN0ZWQgPyBcIlJlbW92ZSBmcm9tIEJ1aWxkXCIgOiBcIkFkZCB0byBCdWlsZFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJMaW5rIiwidXNlUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljIiwic3RvY2siLCJzdXBwcmVzc29yIiwiU1RPUkFHRV9LRVkiLCJDYXRlZ29yeVBhZ2UiLCJwYXJhbXMiLCJjYXRlZ29yeUlkIiwicm91dGVyIiwidmlld01vZGUiLCJzZXRWaWV3TW9kZSIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJicmFuZEZpbHRlciIsInNldEJyYW5kRmlsdGVyIiwic29ydEJ5Iiwic2V0U29ydEJ5Iiwic2VhcmNoUXVlcnkiLCJzZXRTZWFyY2hRdWVyeSIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoQ2F0ZWdvcnlQYXJ0cyIsInJvbGVzIiwic2VhcmNoIiwiVVJMU2VhcmNoUGFyYW1zIiwic2V0IiwiZm9yRWFjaCIsInIiLCJhcHBlbmQiLCJ1cmwiLCJsZW5ndGgiLCJ0b1N0cmluZyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwiYnV5VXJsIiwibm90ZXMiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiaGFuZGxlVG9nZ2xlUGFydCIsInBhcnRJZCIsImlzU2VsZWN0ZWQiLCJwcmV2IiwidXBkYXRlZCIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJub3JtYWxpemVkUXVlcnkiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInNlbGVjdGVkSWQiLCJzZWxlY3RlZCIsIm90aGVycyIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsImlucHV0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJwbGFjZWhvbGRlciIsInNlbGVjdCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.e6ab26d29cc9c4c8.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.e6ab26d29cc9c4c8.hot-update.js new file mode 100644 index 0000000..9db7fe2 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.e6ab26d29cc9c4c8.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.e77bac752e550447.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.e77bac752e550447.hot-update.js new file mode 100644 index 0000000..f3cee62 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.e77bac752e550447.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ]\n};\n// Simple in-memory cache so navigating back to a category is instant\nconst categoryPartsCache = {};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n // Use cached parts immediately if available for this category\n const cachedParts = categoryPartsCache[categoryId];\n if (cachedParts && cachedParts.length > 0) {\n setParts(cachedParts);\n setLoading(false);\n } else {\n setLoading(true);\n }\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n // If we had cached data, we’re doing a silent refresh.\n // If not, loading was already set to true above.\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n categoryPartsCache[categoryId] = normalized;\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 237,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 240,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 236,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 235,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 234,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 257,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 265,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 269,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 268,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 271,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 264,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 290,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 277,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 256,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 314,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 318,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 312,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 325,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 329,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 338,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 328,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 324,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 350,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 362,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 364,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 371,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 382,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 383,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 384,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 385,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 374,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 311,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 393,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 397,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 401,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 422,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 420,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 425,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 430,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 418,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 435,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 441,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 434,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 410,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 405,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 461,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 462,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 463,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 464,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 460,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 486,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 481,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 491,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 494,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 498,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 504,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 497,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 480,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 472,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 467,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 254,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0FBQ2xCO0FBRUEscUVBQXFFO0FBQ3JFLE1BQU1DLHFCQUEwRCxDQUFDO0FBT2pFLE1BQU1DLGNBQWM7QUFFTCxTQUFTQzs7SUFDdEIsTUFBTUMsU0FBU3JCLDBEQUFTQTtJQUN4QixNQUFNc0IsYUFBYUQsT0FBT0MsVUFBVTtJQUNwQyxNQUFNQyxTQUFTdEIsMERBQVNBO0lBRXhCLE1BQU0sQ0FBQ3VCLFVBQVVDLFlBQVksR0FBRzNCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDOEIsU0FBU0MsV0FBVyxHQUFHL0IsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDZ0MsT0FBT0MsU0FBUyxHQUFHakMsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUNrQyxhQUFhQyxlQUFlLEdBQUduQywrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUNvQyxRQUFRQyxV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Q0FDbEIsTUFBTTdDLGFBQWFyRCxLQUFLLENBQUNoQixXQUFXLEtBQUtrSCxLQUFLdkYsRUFBRTt3Q0FFaEQscUJBQ0UsOERBQUNtRTs0Q0FFQ0QsV0FBVyxvRUFJVixPQUhDeEIsYUFDSSxpRkFDQTtzREFHTiw0RUFBQ3lCO2dEQUFJRCxXQUFVOztrRUFDYiw4REFBQ0M7d0RBQUlELFdBQVU7OzBFQUNiLDhEQUFDQztnRUFBSUQsV0FBVTswRUFDWnFCLEtBQUs3RCxJQUFJOzs7Ozs7NERBRVg2RCxLQUFLdEQsS0FBSyxrQkFDVCw4REFBQ1I7Z0VBQUV5QyxXQUFVOzBFQUNWcUIsS0FBS3RELEtBQUs7Ozs7Ozs7Ozs7OztrRUFJakIsOERBQUNrQzt3REFBSUQsV0FBVTtrRUFDWnFCLEtBQUs1RCxLQUFLOzs7Ozs7a0VBRWIsOERBQUN3Qzt3REFBSUQsV0FBVTs7NERBQXFEOzREQUNoRXFCLEtBQUszRCxLQUFLLENBQUM0RCxPQUFPLENBQUM7Ozs7Ozs7a0VBRXZCLDhEQUFDckI7d0RBQUlELFdBQVU7OzBFQUNiLDhEQUFDcEgsaURBQUlBO2dFQUNIdUgsTUFBTSxlQUE2QmtCLE9BQWRsSCxZQUFXLEtBQVcsT0FBUmtILEtBQUt2RixFQUFFO2dFQUMxQ2tFLFdBQVU7MEVBQ1g7Ozs7OzswRUFHRCw4REFBQ007Z0VBQ0NDLE1BQUs7Z0VBQ0xDLFNBQVMsSUFDUGxDLGlCQUFpQm5FLFlBQVlrSCxLQUFLdkYsRUFBRTtnRUFFdENrRSxXQUFXLG9GQUlWLE9BSEN4QixhQUNJLHVFQUNBOzBFQUdMQSxhQUFhLHNCQUFzQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OzJDQTFDckM2QyxLQUFLdkYsRUFBRTs7Ozs7b0NBZ0RsQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVFoQjtHQWpld0I3Qjs7UUFDUHBCLHNEQUFTQTtRQUVUQyxzREFBU0E7OztLQUhGbUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvW2NhdGVnb3J5SWRdL3BhZ2UudHN4PzhiNWQiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbnR5cGUgVmlld01vZGUgPSBcImNhcmRcIiB8IFwibGlzdFwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxuICBsb3dlcjogW1wibG93ZXItcmVjZWl2ZXJcIl0sXG4gIG9wdGljOiBbXCJvcHRpY1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxufTtcblxuLy8gU2ltcGxlIGluLW1lbW9yeSBjYWNoZSBzbyBuYXZpZ2F0aW5nIGJhY2sgdG8gYSBjYXRlZ29yeSBpcyBpbnN0YW50XG5jb25zdCBjYXRlZ29yeVBhcnRzQ2FjaGU6IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4+ID0ge307XG5cbi8vIHNvcnQgb3B0aW9uc1xudHlwZSBTb3J0T3B0aW9uID0gXCJyZWxldmFuY2VcIiB8IFwicHJpY2UtYXNjXCIgfCBcInByaWNlLWRlc2NcIiB8IFwiYnJhbmQtYXNjXCI7XG5cbi8vIGJ1aWxkIHN0YXRlIHR5cGUgKyBzdG9yYWdlIGtleSAobWF0Y2hlcyAvZ3VuYnVpbGRlcilcbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+O1xuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlQYWdlKCkge1xuICBjb25zdCBwYXJhbXMgPSB1c2VQYXJhbXMoKTtcbiAgY29uc3QgY2F0ZWdvcnlJZCA9IHBhcmFtcy5jYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuXG4gIGNvbnN0IFt2aWV3TW9kZSwgc2V0Vmlld01vZGVdID0gdXNlU3RhdGU8Vmlld01vZGU+KFwibGlzdFwiKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgLy8gZmlsdGVyICsgc29ydCBzdGF0ZVxuICBjb25zdCBbYnJhbmRGaWx0ZXIsIHNldEJyYW5kRmlsdGVyXSA9IHVzZVN0YXRlPHN0cmluZz4oXCJhbGxcIik7XG4gIGNvbnN0IFtzb3J0QnksIHNldFNvcnRCeV0gPSB1c2VTdGF0ZTxTb3J0T3B0aW9uPihcInJlbGV2YW5jZVwiKTtcbiAgY29uc3QgW3NlYXJjaFF1ZXJ5LCBzZXRTZWFyY2hRdWVyeV0gPSB1c2VTdGF0ZTxzdHJpbmc+KFwiXCIpO1xuXG4gIC8vICBidWlsZCBzdGF0ZSBmb3IgdGhpcyBwYWdlLCBzeW5jZWQgd2l0aCBsb2NhbFN0b3JhZ2VcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09IFwidW5kZWZpbmVkXCIpIHJldHVybiB7fTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RvcmVkID0gd2luZG93LmxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIHJldHVybiBzdG9yZWQgPyAoSlNPTi5wYXJzZShzdG9yZWQpIGFzIEJ1aWxkU3RhdGUpIDoge307XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBjYXRlZ29yeSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKSxcbiAgICBbY2F0ZWdvcnlJZF0sXG4gICk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIWNhdGVnb3J5SWQpIHJldHVybjtcblxuICAgIC8vIFVzZSBjYWNoZWQgcGFydHMgaW1tZWRpYXRlbHkgaWYgYXZhaWxhYmxlIGZvciB0aGlzIGNhdGVnb3J5XG4gICAgY29uc3QgY2FjaGVkUGFydHMgPSBjYXRlZ29yeVBhcnRzQ2FjaGVbY2F0ZWdvcnlJZF07XG4gICAgaWYgKGNhY2hlZFBhcnRzICYmIGNhY2hlZFBhcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNldFBhcnRzKGNhY2hlZFBhcnRzKTtcbiAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaENhdGVnb3J5UGFydHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBJZiB3ZSBoYWQgY2FjaGVkIGRhdGEsIHdl4oCZcmUgZG9pbmcgYSBzaWxlbnQgcmVmcmVzaC5cbiAgICAgICAgLy8gSWYgbm90LCBsb2FkaW5nIHdhcyBhbHJlYWR5IHNldCB0byB0cnVlIGFib3ZlLlxuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByb2xlcyA9IENBVEVHT1JZX1RPX1BBUlRfUk9MRVNbY2F0ZWdvcnlJZF0gPz8gW107XG5cbiAgICAgICAgY29uc3Qgc2VhcmNoID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgICAgICBzZWFyY2guc2V0KFwicGxhdGZvcm1cIiwgXCJBUi0xNVwiKTtcbiAgICAgICAgcm9sZXMuZm9yRWFjaCgocikgPT4gc2VhcmNoLmFwcGVuZChcInBhcnRSb2xlc1wiLCByKSk7XG5cbiAgICAgICAgY29uc3QgdXJsID0gYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlciR7XG4gICAgICAgICAgcm9sZXMubGVuZ3RoID8gYD8ke3NlYXJjaC50b1N0cmluZygpfWAgOiBcIlwiXG4gICAgICAgIH1gO1xuXG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKHVybCwgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0pO1xuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBwcm9kdWN0cyAoJHtyZXMuc3RhdHVzfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRhdGE6IEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaVtdID0gYXdhaXQgcmVzLmpzb24oKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVkOiBQYXJ0W10gPSBkYXRhLm1hcCgocCkgPT4gKHtcbiAgICAgICAgICBpZDogcC5pZCxcbiAgICAgICAgICBjYXRlZ29yeUlkLFxuICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICBwcmljZTogcC5wcmljZSA/PyAwLFxuICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgbm90ZXM6IHVuZGVmaW5lZCxcbiAgICAgICAgfSkpO1xuXG4gICAgICAgIHNldFBhcnRzKG5vcm1hbGl6ZWQpO1xuICAgICAgICBjYXRlZ29yeVBhcnRzQ2FjaGVbY2F0ZWdvcnlJZF0gPSBub3JtYWxpemVkO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBsb2FkIHByb2R1Y3RzXCIpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKCFjb250cm9sbGVyLnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaENhdGVnb3J5UGFydHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtjYXRlZ29yeUlkXSk7XG5cbiAgLy8gIHBlcnNpc3QgYnVpbGQgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIC8vICBoYW5kbGVyIHRvIHRvZ2dsZSBBZGQgLyBSZW1vdmUgZm9yIHRoaXMgY2F0ZWdvcnlcbiAgY29uc3QgaGFuZGxlVG9nZ2xlUGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydElkO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIGJ1aWxkXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkOiBCdWlsZFN0YXRlID0geyAuLi5wcmV2IH07XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2NhdGVnb3J5SWRdO1xuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gYnVpbGQgYW5kIG5hdmlnYXRlIGJhY2sgdG8gbWFpbiBndW5idWlsZGVyIHBhZ2VcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICAgIH0pKTtcbiAgICAgIHJvdXRlci5wdXNoKFwiL2d1bmJ1aWxkZXJcIik7XG4gICAgfVxuICB9O1xuXG4gIC8vIGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBmaWx0ZXJlZCArIHNvcnRlZCBwYXJ0cyB3aXRoIHNlbGVjdGVkIHBhcnQgcGlubmVkIHRvIHRvcFxuICBjb25zdCBmaWx0ZXJlZFBhcnRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IFsuLi5wYXJ0c107XG5cbiAgICBpZiAoYnJhbmRGaWx0ZXIgIT09IFwiYWxsXCIpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuYnJhbmQgPT09IGJyYW5kRmlsdGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBzZWFyY2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZFF1ZXJ5KSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYnJhbmQgPSBwLmJyYW5kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbmFtZS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgICAgYnJhbmQuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgXCJwcmljZS1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEucHJpY2UgLSBiLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpY2UtZGVzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYi5wcmljZSAtIGEucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJicmFuZC1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuYnJhbmQubG9jYWxlQ29tcGFyZShiLmJyYW5kKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbGV2YW5jZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gbGVhdmUgaW4gYmFja2VuZCBvcmRlclxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBQaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJ0IChmb3IgdGhpcyBjYXRlZ29yeSkgdG8gdGhlIHRvcCwgaWYgYW55XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IGJ1aWxkW2NhdGVnb3J5SWRdO1xuICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgPT09IHNlbGVjdGVkSWQpO1xuICAgICAgY29uc3Qgb3RoZXJzID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gc2VsZWN0ZWRJZCk7XG4gICAgICByZXN1bHQgPSBbLi4uc2VsZWN0ZWQsIC4uLm90aGVyc107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5LCBidWlsZCwgY2F0ZWdvcnlJZCwgc2VhcmNoUXVlcnldKTtcblxuICBpZiAoIWNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTAgbWItNFwiPlxuICAgICAgICAgICAgICBDYXRlZ29yeSBOb3QgRm91bmRcbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMCBob3Zlcjp0ZXh0LWFtYmVyLTIwMCB1bmRlcmxpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXR1cm4gdG8gR3VuYnVpbGRlclxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWFpbj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTZcIj5cbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIG1iLTQgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDihpAgQmFjayB0byBUaGUgQXJtb3J5XG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfSA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPlBhcnRzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgIEJyb3dzZSBhbGwgYXZhaWxhYmxlIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9IG9wdGlvbnMgZm9yXG4gICAgICAgICAgICAgICAgeW91ciBidWlsZCwgcHVsbGVkIGxpdmUgZnJvbSB5b3VyIEJhbGxpc3RpYyBiYWNrZW5kLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0xIGJnLXppbmMtOTUwLzYwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImNhcmRcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDYXJkIHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENhcmRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkxpc3Qgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTGlzdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBQYXJ0cyBHcmlkL0xpc3QgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgey8qIEZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInBhcnQtc2VhcmNoXCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICBTZWFyY2hcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInBhcnQtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17YFNlYXJjaCAke2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0uLi5gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBwci02IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIHtzZWFyY2hRdWVyeSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWFyY2hRdWVyeShcIlwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0xIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LXppbmMtNTAwIGhvdmVyOnRleHQtemluYy0zMDAgdGV4dC14cyBsZWFkaW5nLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInNvcnQtYnlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbCBib3JkZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwXCJcbiAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHJvdW5kZWQtbWQgcHgtMyBweS0yIHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIEhlYWRlciByb3cgZm9yIGxpc3QgdmlldyAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6Z3JpZCBncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIGdhcC00IHB4LTMgcGItMiB0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+UGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5CcmFuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0XCI+UHJpY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodCBwci0yXCI+QWN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItYW1iZXItNDAwLzcwIGJnLWFtYmVyLTQwMC8xMCBzaGFkb3ctWzBfMF8wXzFweF9yZ2JhKDI1MSwxOTEsMzYsMC4yNSldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6Z3JpZCBtZDpncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIG1kOml0ZW1zLWNlbnRlciBtZDpnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1kOnRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgbWQ6dGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHJvdW5kZWQtbWQgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVN0YXRlIiwiTGluayIsInVzZVBhcmFtcyIsInVzZVJvdXRlciIsIkNBVEVHT1JJRVMiLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwiY2F0ZWdvcnlQYXJ0c0NhY2hlIiwiU1RPUkFHRV9LRVkiLCJDYXRlZ29yeVBhZ2UiLCJwYXJhbXMiLCJjYXRlZ29yeUlkIiwicm91dGVyIiwidmlld01vZGUiLCJzZXRWaWV3TW9kZSIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJicmFuZEZpbHRlciIsInNldEJyYW5kRmlsdGVyIiwic29ydEJ5Iiwic2V0U29ydEJ5Iiwic2VhcmNoUXVlcnkiLCJzZXRTZWFyY2hRdWVyeSIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJ3aW5kb3ciLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY2F0ZWdvcnkiLCJmaW5kIiwiYyIsImlkIiwiY2FjaGVkUGFydHMiLCJsZW5ndGgiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hDYXRlZ29yeVBhcnRzIiwicm9sZXMiLCJzZWFyY2giLCJVUkxTZWFyY2hQYXJhbXMiLCJzZXQiLCJmb3JFYWNoIiwiciIsImFwcGVuZCIsInVybCIsInRvU3RyaW5nIiwicmVzIiwiZmV0Y2giLCJzaWduYWwiLCJvayIsIkVycm9yIiwic3RhdHVzIiwiZGF0YSIsImpzb24iLCJub3JtYWxpemVkIiwibWFwIiwicCIsIm5hbWUiLCJicmFuZCIsInByaWNlIiwiaW1hZ2VVcmwiLCJtYWluSW1hZ2VVcmwiLCJ1bmRlZmluZWQiLCJidXlVcmwiLCJub3RlcyIsImVyciIsIm1lc3NhZ2UiLCJhYm9ydGVkIiwiYWJvcnQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiaGFuZGxlVG9nZ2xlUGFydCIsInBhcnRJZCIsImlzU2VsZWN0ZWQiLCJwcmV2IiwidXBkYXRlZCIsInB1c2giLCJhdmFpbGFibGVCcmFuZHMiLCJBcnJheSIsImZyb20iLCJTZXQiLCJmaWx0ZXIiLCJCb29sZWFuIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsImZpbHRlcmVkUGFydHMiLCJyZXN1bHQiLCJub3JtYWxpemVkUXVlcnkiLCJ0cmltIiwidG9Mb3dlckNhc2UiLCJpbmNsdWRlcyIsInNlbGVjdGVkSWQiLCJzZWxlY3RlZCIsIm90aGVycyIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoMSIsImhyZWYiLCJoZWFkZXIiLCJzcGFuIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJhcmlhLWxhYmVsIiwic2VjdGlvbiIsImxhYmVsIiwiaHRtbEZvciIsImlucHV0IiwidmFsdWUiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJwbGFjZWhvbGRlciIsInNlbGVjdCIsIm9wdGlvbiIsInBhcnQiLCJ0b0ZpeGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.f984af7569671cf9.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.f984af7569671cf9.hot-update.js new file mode 100644 index 0000000..c6015a1 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.f984af7569671cf9.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFSyxNQUFNQyxRQUFnQjtJQUMzQjtRQUNFSCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/[categoryId]/page.fa6ba7f604e88fea.hot-update.js b/.next/static/webpack/app/gunbuilder/[categoryId]/page.fa6ba7f604e88fea.hot-update.js new file mode 100644 index 0000000..b73fc40 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/[categoryId]/page.fa6ba7f604e88fea.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/[categoryId]/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx": +/*!**********************************************!*\ + !*** ./app/gunbuilder/[categoryId]/page.tsx ***! + \**********************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\nfunction CategoryPage() {\n _s();\n const params = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams)();\n const categoryId = params.categoryId;\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [viewMode, setViewMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"list\");\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n // filter + sort state\n const [brandFilter, setBrandFilter] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"all\");\n const [sortBy, setSortBy] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"relevance\");\n const [searchQuery, setSearchQuery] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"\");\n // build state for this page, synced with localStorage\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (false) {}\n try {\n const stored = window.localStorage.getItem(STORAGE_KEY);\n return stored ? JSON.parse(stored) : {};\n } catch (e) {\n return {};\n }\n });\n const category = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId), [\n categoryId\n ]);\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!categoryId) return;\n const controller = new AbortController();\n async function fetchCategoryParts() {\n try {\n setLoading(true);\n setError(null);\n var _CATEGORY_TO_PART_ROLES_categoryId;\n const roles = (_CATEGORY_TO_PART_ROLES_categoryId = CATEGORY_TO_PART_ROLES[categoryId]) !== null && _CATEGORY_TO_PART_ROLES_categoryId !== void 0 ? _CATEGORY_TO_PART_ROLES_categoryId : [];\n const search = new URLSearchParams();\n search.set(\"platform\", \"AR-15\");\n roles.forEach((r)=>search.append(\"partRoles\", r));\n const url = \"\".concat(API_BASE_URL, \"/api/products/gunbuilder\").concat(roles.length ? \"?\".concat(search.toString()) : \"\");\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: p.id,\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n });\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchCategoryParts();\n return ()=>controller.abort();\n }, [\n categoryId\n ]);\n // persist build to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (false) {}\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n } catch (e) {\n // ignore\n }\n }, [\n build\n ]);\n // handler to toggle Add / Remove for this category\n const handleTogglePart = (categoryId, partId)=>{\n const isSelected = build[categoryId] === partId;\n if (isSelected) {\n // Remove from build\n setBuild((prev)=>{\n const updated = {\n ...prev\n };\n delete updated[categoryId];\n return updated;\n });\n } else {\n // Add to build and navigate back to main gunbuilder page\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n router.push(\"/gunbuilder\");\n }\n };\n // available brands for filter\n const availableBrands = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>Array.from(new Set(parts.map((p)=>p.brand))).filter(Boolean).sort((a, b)=>a.localeCompare(b)), [\n parts\n ]);\n // filtered + sorted parts with selected part pinned to top\n const filteredParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n let result = [\n ...parts\n ];\n if (brandFilter !== \"all\") {\n result = result.filter((p)=>p.brand === brandFilter);\n }\n const normalizedQuery = searchQuery.trim().toLowerCase();\n if (normalizedQuery) {\n result = result.filter((p)=>{\n const name = p.name.toLowerCase();\n const brand = p.brand.toLowerCase();\n return name.includes(normalizedQuery) || brand.includes(normalizedQuery);\n });\n }\n switch(sortBy){\n case \"price-asc\":\n result.sort((a, b)=>a.price - b.price);\n break;\n case \"price-desc\":\n result.sort((a, b)=>b.price - a.price);\n break;\n case \"brand-asc\":\n result.sort((a, b)=>a.brand.localeCompare(b.brand));\n break;\n case \"relevance\":\n default:\n break;\n }\n // Pin the currently selected part (for this category) to the top, if any\n const selectedId = build[categoryId];\n if (selectedId) {\n const selected = result.filter((p)=>p.id === selectedId);\n const others = result.filter((p)=>p.id !== selectedId);\n result = [\n ...selected,\n ...others\n ];\n }\n return result;\n }, [\n parts,\n brandFilter,\n sortBy,\n build,\n categoryId,\n searchQuery\n ]);\n if (!category) {\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-center\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"text-2xl font-semibold text-zinc-50 mb-4\",\n children: \"Category Not Found\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 222,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-amber-300 hover:text-amber-200 underline\",\n children: \"Return to Gunbuilder\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 225,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 221,\n columnNumber: 11\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 220,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 219,\n columnNumber: 7\n }, this);\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder\",\n className: \"text-xs text-zinc-400 hover:text-zinc-300 mb-4 inline-block\",\n children: \"← Back to The Armory\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 242,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-start justify-between gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 250,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n category.name,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Parts\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 254,\n columnNumber: 33\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 253,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: [\n \"Browse all available \",\n category.name.toLowerCase(),\n \" options for your build, pulled live from your Ballistic backend.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 256,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 249,\n columnNumber: 13\n }, this),\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex gap-2 border border-zinc-800 rounded-md p-1 bg-zinc-950/60\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"card\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"card\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"Card view\",\n children: \"Card\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 263,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setViewMode(\"list\"),\n className: \"px-3 py-1.5 text-xs font-medium rounded transition-colors \".concat(viewMode === \"list\" ? \"bg-zinc-800 text-zinc-50\" : \"text-zinc-400 hover:text-zinc-300\"),\n \"aria-label\": \"List view\",\n children: \"List\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 275,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 262,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 248,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 241,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n !loading && !error && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-3 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n \"Showing\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: filteredParts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 299,\n columnNumber: 17\n }, this),\n \" \",\n \"of\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-200 font-medium\",\n children: parts.length\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 303,\n columnNumber: 17\n }, this),\n \" \",\n \"parts\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 297,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-wrap gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"part-search\",\n className: \"text-xs text-zinc-500\",\n children: \"Search\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 310,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"relative\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n id: \"part-search\",\n type: \"text\",\n value: searchQuery,\n onChange: (e)=>setSearchQuery(e.target.value),\n placeholder: \"Search \".concat(category.name.toLowerCase(), \"...\"),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 pr-6 focus:outline-none focus:ring-1 focus:ring-amber-400\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 314,\n columnNumber: 19\n }, this),\n searchQuery && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setSearchQuery(\"\"),\n className: \"absolute right-1 top-1/2 -translate-y-1/2 text-zinc-500 hover:text-zinc-300 text-xs leading-none\",\n \"aria-label\": \"Clear search\",\n children: \"\\xd7\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 323,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 313,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 309,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"brand-filter\",\n className: \"text-xs text-zinc-500\",\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 335,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"brand-filter\",\n value: brandFilter,\n onChange: (e)=>setBrandFilter(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"all\",\n children: \"All brands\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 347,\n columnNumber: 21\n }, this),\n availableBrands.map((b)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: b,\n children: b\n }, b, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 349,\n columnNumber: 23\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 341,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 334,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n htmlFor: \"sort-by\",\n className: \"text-xs text-zinc-500\",\n children: \"Sort\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 356,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n id: \"sort-by\",\n value: sortBy,\n onChange: (e)=>setSortBy(e.target.value),\n className: \"rounded-md border border-zinc-700 bg-zinc-900/70 text-xs text-zinc-200 px-2 py-1 focus:outline-none focus:ring-1 focus:ring-amber-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"relevance\",\n children: \"Relevance\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 367,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-asc\",\n children: \"Price: Low → High\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 368,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"price-desc\",\n children: \"Price: High → Low\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 369,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"brand-asc\",\n children: \"Brand: A → Z\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 370,\n columnNumber: 21\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 359,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 355,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 296,\n columnNumber: 13\n }, this),\n loading ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: [\n \"Loading \",\n category.name.toLowerCase(),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 378,\n columnNumber: 13\n }, this) : error ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400 text-center py-8\",\n children: [\n error,\n \" — check that the Ballistic API is running.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 382,\n columnNumber: 13\n }, this) : filteredParts.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500 text-center py-8\",\n children: \"No parts available for this category yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 386,\n columnNumber: 13\n }, this) : viewMode === \"card\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-3 md:grid-cols-2 lg:grid-cols-3\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 flex flex-col border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-between items-center gap-2 mb-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: [\n part.brand,\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"font-normal\",\n children: [\n \"— \",\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 407,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 405,\n columnNumber: 25\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-2\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 410,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 404,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 415,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 403,\n columnNumber: 21\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-2 flex gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"flex-1 rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors text-center\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 420,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"flex-1 rounded-md px-3 py-2 text-xs font-semibold transition-colors text-center \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 426,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 419,\n columnNumber: 21\n }, this)\n ]\n }, part.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 395,\n columnNumber: 19\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 390,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"hidden md:grid grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] gap-4 px-3 pb-2 text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Part\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 446,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Brand\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 447,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right\",\n children: \"Price\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 448,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-right pr-2\",\n children: \"Actions\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 449,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 445,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: filteredParts.map((part)=>{\n const isSelected = build[categoryId] === part.id;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"group relative rounded-md p-3 transition-all duration-200 border \".concat(isSelected ? \"border-amber-400/70 bg-amber-400/10 shadow-[0_0_0_1px_rgba(251,191,36,0.25)]\" : \"border-zinc-700 bg-zinc-900/50 hover:border-amber-400/60 hover:bg-amber-400/10\"),\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col gap-2 md:grid md:grid-cols-[minmax(0,3fr)_minmax(0,1fr)_minmax(0,1fr)_auto] md:items-center md:gap-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 min-w-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-zinc-50\",\n children: part.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 467,\n columnNumber: 27\n }, this),\n part.notes && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-1 text-xs text-zinc-400 line-clamp-1\",\n children: part.notes\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 471,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 466,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs md:text-sm text-zinc-400 md:text-left\",\n children: part.brand\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 476,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm font-semibold text-amber-300 md:text-right\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 479,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex justify-end gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/\".concat(categoryId, \"/\").concat(part.id),\n className: \"rounded-md border border-zinc-700 bg-zinc-800/50 px-3 py-1.5 text-xs font-medium text-zinc-300 hover:bg-zinc-700 hover:border-zinc-600 transition-colors whitespace-nowrap\",\n children: \"View Details\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 483,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>handleTogglePart(categoryId, part.id),\n className: \"rounded-md px-3 py-1.5 text-xs font-semibold transition-colors whitespace-nowrap \".concat(isSelected ? \"bg-zinc-800 text-zinc-100 border border-zinc-600 hover:bg-zinc-700\" : \"bg-amber-400 text-black hover:bg-amber-300\"),\n children: isSelected ? \"Remove from Build\" : \"Add to Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 489,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 482,\n columnNumber: 25\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 465,\n columnNumber: 23\n }, this)\n }, part.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 457,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 452,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 293,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 239,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx\",\n lineNumber: 238,\n columnNumber: 5\n }, this);\n}\n_s(CategoryPage, \"hQW9WjwScoo4vSowKyqHqdjUZSA=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = CategoryPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL1tjYXRlZ29yeUlkXS9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQzBCO0FBQ0g7SUFpQmxETztBQURGLE1BQU1DLGVBQ0pELENBQUFBLHdDQUFBQSxPQUFPQSxDQUFDRSxHQUFHLENBQUNDLHdCQUF3QixjQUFwQ0gsbURBQUFBLHdDQUF3QztBQUUxQyxNQUFNSSx5QkFBdUQ7SUFDM0RDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsUUFBUTtRQUFDO0tBQVM7SUFDbEJDLFdBQVc7UUFBQztLQUFZO0lBQ3hCQyxnQkFBZ0I7UUFBQztLQUFrQjtJQUNuQ0MsUUFBUTtRQUFDO0tBQWE7SUFDdEJDLFlBQVk7UUFBQztLQUFrQjtJQUMvQkMsUUFBUTtRQUFDO0tBQVE7SUFDakJDLE9BQU87UUFBQztLQUFpQjtJQUN6QkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxZQUFZO1FBQUM7S0FBYTtBQUM1QjtBQU9BLE1BQU1DLGNBQWM7QUFFTCxTQUFTQzs7SUFDdEIsTUFBTUMsU0FBU3JCLDBEQUFTQTtJQUN4QixNQUFNc0IsYUFBYUQsT0FBT0MsVUFBVTtJQUNwQyxNQUFNQyxTQUFTdEIsMERBQVNBO0lBRXhCLE1BQU0sQ0FBQ3VCLFVBQVVDLFlBQVksR0FBRzNCLCtDQUFRQSxDQUFXO0lBQ25ELE1BQU0sQ0FBQzRCLE9BQU9DLFNBQVMsR0FBRzdCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDOEIsU0FBU0MsV0FBVyxHQUFHL0IsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDZ0MsT0FBT0MsU0FBUyxHQUFHakMsK0NBQVFBLENBQWdCO0lBRWxELHNCQUFzQjtJQUN0QixNQUFNLENBQUNrQyxhQUFhQyxlQUFlLEdBQUduQywrQ0FBUUEsQ0FBUztJQUN2RCxNQUFNLENBQUNvQyxRQUFRQyxVQUFVLEdBQUdyQywrQ0FB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MEVBQ1ZxQixLQUFLckQsS0FBSzs7Ozs7Ozs7Ozs7O2tFQUlqQiw4REFBQ2lDO3dEQUFJRCxXQUFVO2tFQUNacUIsS0FBSzNELEtBQUs7Ozs7OztrRUFFYiw4REFBQ3VDO3dEQUFJRCxXQUFVOzs0REFBcUQ7NERBQ2hFcUIsS0FBSzFELEtBQUssQ0FBQzJELE9BQU8sQ0FBQzs7Ozs7OztrRUFFdkIsOERBQUNyQjt3REFBSUQsV0FBVTs7MEVBQ2IsOERBQUNsSCxpREFBSUE7Z0VBQ0hxSCxNQUFNLGVBQTZCa0IsT0FBZGhILFlBQVcsS0FBVyxPQUFSZ0gsS0FBS3JGLEVBQUU7Z0VBQzFDZ0UsV0FBVTswRUFDWDs7Ozs7OzBFQUdELDhEQUFDTTtnRUFDQ0MsTUFBSztnRUFDTEMsU0FBUyxJQUNQbEMsaUJBQWlCakUsWUFBWWdILEtBQUtyRixFQUFFO2dFQUV0Q2dFLFdBQVcsb0ZBSVYsT0FIQ3hCLGFBQ0ksdUVBQ0E7MEVBR0xBLGFBQWEsc0JBQXNCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7MkNBMUNyQzZDLEtBQUtyRixFQUFFOzs7OztvQ0FnRGxCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUWhCO0dBcGR3QjdCOztRQUNQcEIsc0RBQVNBO1FBRVRDLHNEQUFTQTs7O0tBSEZtQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9bY2F0ZWdvcnlJZF0vcGFnZS50c3g/OGI1ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxudHlwZSBWaWV3TW9kZSA9IFwiY2FyZFwiIHwgXCJsaXN0XCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG4gIGJyYW5kOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBzdHJpbmc7XG4gIHBhcnRSb2xlOiBzdHJpbmc7XG4gIHByaWNlOiBudW1iZXIgfCBudWxsO1xuICBtYWluSW1hZ2VVcmw6IHN0cmluZyB8IG51bGw7XG4gIGJ1eVVybDogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG5jb25zdCBDQVRFR09SWV9UT19QQVJUX1JPTEVTOiBSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nW10+ID0ge1xuICB1cHBlcjogW1widXBwZXItcmVjZWl2ZXJcIl0sXG4gIGJhcnJlbDogW1wiYmFycmVsXCJdLFxuICBoYW5kZ3VhcmQ6IFtcImhhbmRndWFyZFwiXSxcbiAgY2hhcmdpbmdIYW5kbGU6IFtcImNoYXJnaW5nLWhhbmRsZVwiXSxcbiAgYnVmZmVyOiBbXCJidWZmZXIta2l0XCJdLFxuICBsb3dlclBhcnRzOiBbXCJsb3dlci1wYXJ0cy1raXRcIl0sXG4gIHNpZ2h0czogW1wic2lnaHRcIl0sXG4gIGxvd2VyOiBbXCJsb3dlci1yZWNlaXZlclwiXSxcbiAgb3B0aWM6IFtcIm9wdGljXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG4gIHN1cHByZXNzb3I6IFtcInN1cHByZXNzb3JcIl0sIFxufTtcblxuLy8gc29ydCBvcHRpb25zXG50eXBlIFNvcnRPcHRpb24gPSBcInJlbGV2YW5jZVwiIHwgXCJwcmljZS1hc2NcIiB8IFwicHJpY2UtZGVzY1wiIHwgXCJicmFuZC1hc2NcIjtcblxuLy8gYnVpbGQgc3RhdGUgdHlwZSArIHN0b3JhZ2Uga2V5IChtYXRjaGVzIC9ndW5idWlsZGVyKVxudHlwZSBCdWlsZFN0YXRlID0gUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nPj47XG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeVBhZ2UoKSB7XG4gIGNvbnN0IHBhcmFtcyA9IHVzZVBhcmFtcygpO1xuICBjb25zdCBjYXRlZ29yeUlkID0gcGFyYW1zLmNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG5cbiAgY29uc3QgW3ZpZXdNb2RlLCBzZXRWaWV3TW9kZV0gPSB1c2VTdGF0ZTxWaWV3TW9kZT4oXCJsaXN0XCIpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcblxuICAvLyBmaWx0ZXIgKyBzb3J0IHN0YXRlXG4gIGNvbnN0IFticmFuZEZpbHRlciwgc2V0QnJhbmRGaWx0ZXJdID0gdXNlU3RhdGU8c3RyaW5nPihcImFsbFwiKTtcbiAgY29uc3QgW3NvcnRCeSwgc2V0U29ydEJ5XSA9IHVzZVN0YXRlPFNvcnRPcHRpb24+KFwicmVsZXZhbmNlXCIpO1xuICBjb25zdCBbc2VhcmNoUXVlcnksIHNldFNlYXJjaFF1ZXJ5XSA9IHVzZVN0YXRlPHN0cmluZz4oXCJcIik7XG5cbiAgLy8gIGJ1aWxkIHN0YXRlIGZvciB0aGlzIHBhZ2UsIHN5bmNlZCB3aXRoIGxvY2FsU3RvcmFnZVxuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHt9O1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgcmV0dXJuIHN0b3JlZCA/IChKU09OLnBhcnNlKHN0b3JlZCkgYXMgQnVpbGRTdGF0ZSkgOiB7fTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IGNhdGVnb3J5ID0gdXNlTWVtbyhcbiAgICAoKSA9PiBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpLFxuICAgIFtjYXRlZ29yeUlkXSxcbiAgKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghY2F0ZWdvcnlJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoQ2F0ZWdvcnlQYXJ0cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQ0FURUdPUllfVE9fUEFSVF9ST0xFU1tjYXRlZ29yeUlkXSA/PyBbXTtcblxuICAgICAgICBjb25zdCBzZWFyY2ggPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgICAgIHNlYXJjaC5zZXQoXCJwbGF0Zm9ybVwiLCBcIkFSLTE1XCIpO1xuICAgICAgICByb2xlcy5mb3JFYWNoKChyKSA9PiBzZWFyY2guYXBwZW5kKFwicGFydFJvbGVzXCIsIHIpKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyJHtcbiAgICAgICAgICByb2xlcy5sZW5ndGggPyBgPyR7c2VhcmNoLnRvU3RyaW5nKCl9YCA6IFwiXCJcbiAgICAgICAgfWA7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGEubWFwKChwKSA9PiAoe1xuICAgICAgICAgIGlkOiBwLmlkLFxuICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgIGJyYW5kOiBwLmJyYW5kLFxuICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICB1cmw6IHAuYnV5VXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICB9KSk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaENhdGVnb3J5UGFydHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtjYXRlZ29yeUlkXSk7XG5cbiAgLy8gIHBlcnNpc3QgYnVpbGQgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuO1xuICAgIHRyeSB7XG4gICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIC8vICBoYW5kbGVyIHRvIHRvZ2dsZSBBZGQgLyBSZW1vdmUgZm9yIHRoaXMgY2F0ZWdvcnlcbiAgY29uc3QgaGFuZGxlVG9nZ2xlUGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydElkO1xuXG4gICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgIC8vIFJlbW92ZSBmcm9tIGJ1aWxkXG4gICAgICBzZXRCdWlsZCgocHJldikgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkOiBCdWlsZFN0YXRlID0geyAuLi5wcmV2IH07XG4gICAgICAgIGRlbGV0ZSB1cGRhdGVkW2NhdGVnb3J5SWRdO1xuICAgICAgICByZXR1cm4gdXBkYXRlZDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBZGQgdG8gYnVpbGQgYW5kIG5hdmlnYXRlIGJhY2sgdG8gbWFpbiBndW5idWlsZGVyIHBhZ2VcbiAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICAgIH0pKTtcbiAgICAgIHJvdXRlci5wdXNoKFwiL2d1bmJ1aWxkZXJcIik7XG4gICAgfVxuICB9O1xuXG4gIC8vIGF2YWlsYWJsZSBicmFuZHMgZm9yIGZpbHRlclxuICBjb25zdCBhdmFpbGFibGVCcmFuZHMgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBBcnJheS5mcm9tKG5ldyBTZXQocGFydHMubWFwKChwKSA9PiBwLmJyYW5kKSkpXG4gICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSksXG4gICAgW3BhcnRzXSxcbiAgKTtcblxuICAvLyBmaWx0ZXJlZCArIHNvcnRlZCBwYXJ0cyB3aXRoIHNlbGVjdGVkIHBhcnQgcGlubmVkIHRvIHRvcFxuICBjb25zdCBmaWx0ZXJlZFBhcnRzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgbGV0IHJlc3VsdCA9IFsuLi5wYXJ0c107XG5cbiAgICBpZiAoYnJhbmRGaWx0ZXIgIT09IFwiYWxsXCIpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuYnJhbmQgPT09IGJyYW5kRmlsdGVyKTtcbiAgICB9XG5cbiAgICBjb25zdCBub3JtYWxpemVkUXVlcnkgPSBzZWFyY2hRdWVyeS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobm9ybWFsaXplZFF1ZXJ5KSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQuZmlsdGVyKChwKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3QgYnJhbmQgPSBwLmJyYW5kLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgbmFtZS5pbmNsdWRlcyhub3JtYWxpemVkUXVlcnkpIHx8XG4gICAgICAgICAgYnJhbmQuaW5jbHVkZXMobm9ybWFsaXplZFF1ZXJ5KVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzb3J0QnkpIHtcbiAgICAgIGNhc2UgXCJwcmljZS1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEucHJpY2UgLSBiLnByaWNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHJpY2UtZGVzY1wiOlxuICAgICAgICByZXN1bHQuc29ydCgoYSwgYikgPT4gYi5wcmljZSAtIGEucHJpY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgXCJicmFuZC1hc2NcIjpcbiAgICAgICAgcmVzdWx0LnNvcnQoKGEsIGIpID0+IGEuYnJhbmQubG9jYWxlQ29tcGFyZShiLmJyYW5kKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcInJlbGV2YW5jZVwiOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gbGVhdmUgaW4gYmFja2VuZCBvcmRlclxuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBQaW4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJ0IChmb3IgdGhpcyBjYXRlZ29yeSkgdG8gdGhlIHRvcCwgaWYgYW55XG4gICAgY29uc3Qgc2VsZWN0ZWRJZCA9IGJ1aWxkW2NhdGVnb3J5SWRdO1xuICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZCA9IHJlc3VsdC5maWx0ZXIoKHApID0+IHAuaWQgPT09IHNlbGVjdGVkSWQpO1xuICAgICAgY29uc3Qgb3RoZXJzID0gcmVzdWx0LmZpbHRlcigocCkgPT4gcC5pZCAhPT0gc2VsZWN0ZWRJZCk7XG4gICAgICByZXN1bHQgPSBbLi4uc2VsZWN0ZWQsIC4uLm90aGVyc107XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSwgW3BhcnRzLCBicmFuZEZpbHRlciwgc29ydEJ5LCBidWlsZCwgY2F0ZWdvcnlJZCwgc2VhcmNoUXVlcnldKTtcblxuICBpZiAoIWNhdGVnb3J5KSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICA8aDEgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTAgbWItNFwiPlxuICAgICAgICAgICAgICBDYXRlZ29yeSBOb3QgRm91bmRcbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXJcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMCBob3Zlcjp0ZXh0LWFtYmVyLTIwMCB1bmRlcmxpbmVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICBSZXR1cm4gdG8gR3VuYnVpbGRlclxuICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvbWFpbj5cbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTZcIj5cbiAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwIG1iLTQgaW5saW5lLWJsb2NrXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICDihpAgQmFjayB0byBUaGUgQXJtb3J5XG4gICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1zdGFydCBqdXN0aWZ5LWJldHdlZW4gZ2FwLTRcIj5cbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfSA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPlBhcnRzPC9zcGFuPlxuICAgICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgIEJyb3dzZSBhbGwgYXZhaWxhYmxlIHtjYXRlZ29yeS5uYW1lLnRvTG93ZXJDYXNlKCl9IG9wdGlvbnMgZm9yXG4gICAgICAgICAgICAgICAgeW91ciBidWlsZCwgcHVsbGVkIGxpdmUgZnJvbSB5b3VyIEJhbGxpc3RpYyBiYWNrZW5kLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBnYXAtMiBib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0xIGJnLXppbmMtOTUwLzYwXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRWaWV3TW9kZShcImNhcmRcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0zIHB5LTEuNSB0ZXh0LXhzIGZvbnQtbWVkaXVtIHJvdW5kZWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgdmlld01vZGUgPT09IFwiY2FyZFwiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy01MFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6dGV4dC16aW5jLTMwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDYXJkIHZpZXdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENhcmRcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFZpZXdNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gcm91bmRlZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICB2aWV3TW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctemluYy04MDAgdGV4dC16aW5jLTUwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3Zlcjp0ZXh0LXppbmMtMzAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkxpc3Qgdmlld1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgTGlzdFxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBQYXJ0cyBHcmlkL0xpc3QgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgey8qIEZpbHRlciArIHNvcnQgdG9vbGJhciAqL31cbiAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi00IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFNob3dpbmd7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubGVuZ3RofVxuICAgICAgICAgICAgICAgIDwvc3Bhbj57XCIgXCJ9XG4gICAgICAgICAgICAgICAgb2Z7XCIgXCJ9XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTIwMCBmb250LW1lZGl1bVwiPlxuICAgICAgICAgICAgICAgICAge3BhcnRzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+e1wiIFwifVxuICAgICAgICAgICAgICAgIHBhcnRzXG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC13cmFwIGdhcC0zXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInBhcnQtc2VhcmNoXCIgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICBTZWFyY2hcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInBhcnQtc2VhcmNoXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c2VhcmNoUXVlcnl9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2VhcmNoUXVlcnkoZS50YXJnZXQudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj17YFNlYXJjaCAke2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX0uLi5gfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNzAgdGV4dC14cyB0ZXh0LXppbmMtMjAwIHB4LTIgcHktMSBwci02IGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIHtzZWFyY2hRdWVyeSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRTZWFyY2hRdWVyeShcIlwiKX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSByaWdodC0xIHRvcC0xLzIgLXRyYW5zbGF0ZS15LTEvMiB0ZXh0LXppbmMtNTAwIGhvdmVyOnRleHQtemluYy0zMDAgdGV4dC14cyBsZWFkaW5nLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWFyY2hcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgw5dcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWxcbiAgICAgICAgICAgICAgICAgICAgaHRtbEZvcj1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEJyYW5kXG4gICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBpZD1cImJyYW5kLWZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXticmFuZEZpbHRlcn1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBzZXRCcmFuZEZpbHRlcihlLnRhcmdldC52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYWxsXCI+QWxsIGJyYW5kczwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICB7YXZhaWxhYmxlQnJhbmRzLm1hcCgoYikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtifSB2YWx1ZT17Yn0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Yn1cbiAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICA8bGFiZWwgaHRtbEZvcj1cInNvcnQtYnlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgU29ydFxuICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzb3J0LWJ5XCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3NvcnRCeX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHNldFNvcnRCeShlLnRhcmdldC52YWx1ZSBhcyBTb3J0T3B0aW9uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LXhzIHRleHQtemluYy0yMDAgcHgtMiBweS0xIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTEgZm9jdXM6cmluZy1hbWJlci00MDBcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwicmVsZXZhbmNlXCI+UmVsZXZhbmNlPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1hc2NcIj5QcmljZTogTG93IOKGkiBIaWdoPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJwcmljZS1kZXNjXCI+UHJpY2U6IEhpZ2gg4oaSIExvdzwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiYnJhbmQtYXNjXCI+QnJhbmQ6IEEg4oaSIFo8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG5cbiAgICAgICAgICB7bG9hZGluZyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIExvYWRpbmcge2NhdGVnb3J5Lm5hbWUudG9Mb3dlckNhc2UoKX3igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZXJyb3IgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMCB0ZXh0LWNlbnRlciBweS04XCI+XG4gICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogZmlsdGVyZWRQYXJ0cy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDAgdGV4dC1jZW50ZXIgcHktOFwiPlxuICAgICAgICAgICAgICBObyBwYXJ0cyBhdmFpbGFibGUgZm9yIHRoaXMgY2F0ZWdvcnkgeWV0LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiB2aWV3TW9kZSA9PT0gXCJjYXJkXCIgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTMgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAge2ZpbHRlcmVkUGFydHMubWFwKChwYXJ0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGJ1aWxkW2NhdGVnb3J5SWRdID09PSBwYXJ0LmlkO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAga2V5PXtwYXJ0LmlkfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgZmxleCBmbGV4LWNvbCBib3JkZXIgJHtcbiAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFwiYm9yZGVyLWFtYmVyLTQwMC83MCBiZy1hbWJlci00MDAvMTAgc2hhZG93LVswXzBfMF8xcHhfcmdiYSgyNTEsMTkxLDM2LDAuMjUpXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFwiYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIGhvdmVyOmJvcmRlci1hbWJlci00MDAvNjAgaG92ZXI6YmctYW1iZXItNDAwLzEwXCJcbiAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yIG1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiZm9udC1ub3JtYWxcIj7igJQge3BhcnQubmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5vdGVzICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy00MDAgbGluZS1jbGFtcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0yIGZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4LTEgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy03MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICBWaWV3IERldGFpbHNcbiAgICAgICAgICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgZmxleC0xIHJvdW5kZWQtbWQgcHgtMyBweS0yIHRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlciAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBcImJnLXppbmMtODAwIHRleHQtemluYy0xMDAgYm9yZGVyIGJvcmRlci16aW5jLTYwMCBob3ZlcjpiZy16aW5jLTcwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJnLWFtYmVyLTQwMCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aXNTZWxlY3RlZCA/IFwiUmVtb3ZlIGZyb20gQnVpbGRcIiA6IFwiQWRkIHRvIEJ1aWxkXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgey8qIEhlYWRlciByb3cgZm9yIGxpc3QgdmlldyAqL31cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6Z3JpZCBncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIGdhcC00IHB4LTMgcGItMiB0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4+UGFydDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj5CcmFuZDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXJpZ2h0XCI+UHJpY2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1yaWdodCBwci0yXCI+QWN0aW9uczwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7ZmlsdGVyZWRQYXJ0cy5tYXAoKHBhcnQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBidWlsZFtjYXRlZ29yeUlkXSA9PT0gcGFydC5pZDtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17cGFydC5pZH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2Bncm91cCByZWxhdGl2ZSByb3VuZGVkLW1kIHAtMyB0cmFuc2l0aW9uLWFsbCBkdXJhdGlvbi0yMDAgYm9yZGVyICR7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJib3JkZXItYW1iZXItNDAwLzcwIGJnLWFtYmVyLTQwMC8xMCBzaGFkb3ctWzBfMF8wXzFweF9yZ2JhKDI1MSwxOTEsMzYsMC4yNSldXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiBcImJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBob3Zlcjpib3JkZXItYW1iZXItNDAwLzYwIGhvdmVyOmJnLWFtYmVyLTQwMC8xMFwiXG4gICAgICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6Z3JpZCBtZDpncmlkLWNvbHMtW21pbm1heCgwLDNmcilfbWlubWF4KDAsMWZyKV9taW5tYXgoMCwxZnIpX2F1dG9dIG1kOml0ZW1zLWNlbnRlciBtZDpnYXAtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgbWluLXctMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXMgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNDAwIGxpbmUtY2xhbXAtMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubm90ZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgbWQ6dGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1kOnRleHQtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgbWQ6dGV4dC1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGp1c3RpZnktZW5kIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnlJZH0vJHtwYXJ0LmlkfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtODAwLzUwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTcwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgd2hpdGVzcGFjZS1ub3dyYXBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlldyBEZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVUb2dnbGVQYXJ0KGNhdGVnb3J5SWQsIHBhcnQuaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHJvdW5kZWQtbWQgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LXNlbWlib2xkIHRyYW5zaXRpb24tY29sb3JzIHdoaXRlc3BhY2Utbm93cmFwICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy16aW5jLTgwMCB0ZXh0LXppbmMtMTAwIGJvcmRlciBib3JkZXItemluYy02MDAgaG92ZXI6YmctemluYy03MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFwiYmctYW1iZXItNDAwIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtpc1NlbGVjdGVkID8gXCJSZW1vdmUgZnJvbSBCdWlsZFwiIDogXCJBZGQgdG8gQnVpbGRcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVN0YXRlIiwiTGluayIsInVzZVBhcmFtcyIsInVzZVJvdXRlciIsIkNBVEVHT1JJRVMiLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwic3VwcHJlc3NvciIsIlNUT1JBR0VfS0VZIiwiQ2F0ZWdvcnlQYWdlIiwicGFyYW1zIiwiY2F0ZWdvcnlJZCIsInJvdXRlciIsInZpZXdNb2RlIiwic2V0Vmlld01vZGUiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnJhbmRGaWx0ZXIiLCJzZXRCcmFuZEZpbHRlciIsInNvcnRCeSIsInNldFNvcnRCeSIsInNlYXJjaFF1ZXJ5Iiwic2V0U2VhcmNoUXVlcnkiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwid2luZG93IiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImNhdGVnb3J5IiwiZmluZCIsImMiLCJpZCIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaENhdGVnb3J5UGFydHMiLCJyb2xlcyIsInNlYXJjaCIsIlVSTFNlYXJjaFBhcmFtcyIsInNldCIsImZvckVhY2giLCJyIiwiYXBwZW5kIiwidXJsIiwibGVuZ3RoIiwidG9TdHJpbmciLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsImJ1eVVybCIsIm5vdGVzIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2V0SXRlbSIsInN0cmluZ2lmeSIsImhhbmRsZVRvZ2dsZVBhcnQiLCJwYXJ0SWQiLCJpc1NlbGVjdGVkIiwicHJldiIsInVwZGF0ZWQiLCJwdXNoIiwiYXZhaWxhYmxlQnJhbmRzIiwiQXJyYXkiLCJmcm9tIiwiU2V0IiwiZmlsdGVyIiwiQm9vbGVhbiIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJmaWx0ZXJlZFBhcnRzIiwicmVzdWx0Iiwibm9ybWFsaXplZFF1ZXJ5IiwidHJpbSIsInRvTG93ZXJDYXNlIiwiaW5jbHVkZXMiLCJzZWxlY3RlZElkIiwic2VsZWN0ZWQiLCJvdGhlcnMiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaDEiLCJocmVmIiwiaGVhZGVyIiwic3BhbiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiYXJpYS1sYWJlbCIsInNlY3Rpb24iLCJsYWJlbCIsImh0bWxGb3IiLCJpbnB1dCIsInZhbHVlIiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwicGxhY2Vob2xkZXIiLCJzZWxlY3QiLCJvcHRpb24iLCJwYXJ0IiwidG9GaXhlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/[categoryId]/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.3caf0b9ac0e57aa2.hot-update.js b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.3caf0b9ac0e57aa2.hot-update.js new file mode 100644 index 0000000..baa2bd3 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.3caf0b9ac0e57aa2.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/admin/category-mappings/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx": +/*!*********************************************************!*\ + !*** ./app/gunbuilder/admin/category-mappings/page.tsx ***! + \*********************************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ CategoryMappingsPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Keep this in sync with your backend `partRole` values\nconst PART_ROLE_OPTIONS = [\n {\n value: \"\",\n label: \"— Unmapped —\"\n },\n // Lower / fire control\n {\n value: \"lower-receiver\",\n label: \"Lower Receiver\"\n },\n {\n value: \"lower-parts-kit\",\n label: \"Lower Parts Kit\"\n },\n {\n value: \"trigger\",\n label: \"Trigger / Trigger Kit\"\n },\n {\n value: \"pistol-grip\",\n label: \"Pistol Grip\"\n },\n {\n value: \"safety-selector\",\n label: \"Safety Selector\"\n },\n // Upper\n {\n value: \"upper-receiver\",\n label: \"Upper Receiver\"\n },\n {\n value: \"barrel\",\n label: \"Barrel\"\n },\n {\n value: \"handguard\",\n label: \"Handguard\"\n },\n {\n value: \"gas-system\",\n label: \"Gas System / Gas Block\"\n },\n {\n value: \"muzzle-device\",\n label: \"Muzzle Device\"\n },\n {\n value: \"suppressor\",\n label: \"Suppressor\"\n },\n // Furniture / sights / optics\n {\n value: \"stock\",\n label: \"Stock\"\n },\n {\n value: \"buffer-kit\",\n label: \"Buffer Kit\"\n },\n {\n value: \"charging-handle\",\n label: \"Charging Handle\"\n },\n {\n value: \"sight\",\n label: \"Iron / Backup Sight\"\n },\n {\n value: \"optic\",\n label: \"Optic\"\n },\n {\n value: \"other\",\n label: \"Other / Ignore\"\n }\n];\nfunction CategoryMappingsPage() {\n var _merchants_find;\n _s();\n const [merchants, setMerchants] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [selectedMerchantId, setSelectedMerchantId] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [mappings, setMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loadingMappings, setLoadingMappings] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [saving, setSaving] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [successMessage, setSuccessMessage] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [showOnlyUnmapped, setShowOnlyUnmapped] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false);\n const sortedMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n // Mapped rows first, then unmapped; within each group, alpha by rawCategory\n return [\n ...mappings\n ].sort((a, b)=>{\n const aMapped = !!a.mappedPartRole;\n const bMapped = !!b.mappedPartRole;\n if (aMapped !== bMapped) {\n return aMapped ? -1 : 1; // mapped first\n }\n return a.rawCategory.localeCompare(b.rawCategory);\n });\n }, [\n mappings\n ]);\n const visibleMappings = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>showOnlyUnmapped ? sortedMappings.filter((m)=>!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyUnmapped\n ]);\n // Load merchants\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n async function fetchMerchants() {\n try {\n const res = await fetch(\"\".concat(API_BASE_URL, \"/admin/merchants\"));\n if (!res.ok) {\n throw new Error(\"Failed to load merchants (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMerchants(data);\n // Auto-select the first merchant if you want\n if (data.length > 0 && selectedMerchantId === null) {\n setSelectedMerchantId(data[0].id);\n }\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load merchants\");\n }\n }\n fetchMerchants();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n // Load mappings for selected merchant\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (!selectedMerchantId) return;\n const controller = new AbortController();\n async function fetchMappings() {\n try {\n setLoadingMappings(true);\n setError(null);\n setSuccessMessage(null);\n const url = \"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings?merchantId=\").concat(selectedMerchantId);\n const res = await fetch(url, {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load mappings (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n setMappings(data);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load mappings\");\n } finally{\n setLoadingMappings(false);\n }\n }\n fetchMappings();\n return ()=>controller.abort();\n }, [\n selectedMerchantId\n ]);\n const handleChangePartRole = (rawCategory, newRole)=>{\n setMappings((prev)=>prev.map((m)=>m.rawCategory === rawCategory ? {\n ...m,\n mappedPartRole: newRole || null\n } : m));\n };\n const handleSave = async ()=>{\n if (!selectedMerchantId) return;\n setSaving(true);\n setError(null);\n setSuccessMessage(null);\n try {\n // Save each mapping in parallel\n const requests = mappings.map((m)=>{\n const payload = {\n merchantId: selectedMerchantId,\n rawCategory: m.rawCategory,\n mappedPartRole: m.mappedPartRole\n };\n return fetch(\"\".concat(API_BASE_URL, \"/admin/merchant-category-mappings\"), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\"\n },\n body: JSON.stringify(payload)\n });\n });\n const responses = await Promise.all(requests);\n const failed = responses.filter((r)=>!r.ok);\n if (failed.length > 0) {\n throw new Error(\"Some mappings failed to save (\".concat(failed.length, \")\"));\n }\n setSuccessMessage(\"Mappings saved. Re-run the import to apply changes.\");\n } catch (err) {\n console.error(err);\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to save mappings\");\n } finally{\n setSaving(false);\n }\n };\n var _merchants_find_name;\n const selectedMerchantName = (_merchants_find_name = (_merchants_find = merchants.find((m)=>m.id === selectedMerchantId)) === null || _merchants_find === void 0 ? void 0 : _merchants_find.name) !== null && _merchants_find_name !== void 0 ? _merchants_find_name : \"—\";\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-5xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-3 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard / Admin\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 206,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: \"Merchant Category Mapping\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 209,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Normalize each merchant's category names into your internal part roles (upper, barrel, handguard, etc.). Unmapped categories will be skipped during import until they are mapped here.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 212,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 205,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"block text-xs font-semibold text-zinc-400 mb-1\",\n children: \"Select Merchant\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 220,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-3 py-2 text-sm text-zinc-100\",\n value: selectedMerchantId !== null && selectedMerchantId !== void 0 ? selectedMerchantId : \"\",\n onChange: (e)=>setSelectedMerchantId(e.target.value ? Number(e.target.value) : null),\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: \"\",\n children: \"— Choose merchant —\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 232,\n columnNumber: 15\n }, this),\n merchants.map((m)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: m.id,\n children: m.name\n }, m.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 234,\n columnNumber: 17\n }, this))\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 223,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 219,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 204,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-red-500/60 bg-red-500/10 px-3 py-2 text-xs text-red-200\",\n children: error\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n successMessage && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 rounded border border-emerald-500/60 bg-emerald-500/10 px-3 py-2 text-xs text-emerald-200\",\n children: successMessage\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 249,\n columnNumber: 13\n }, this),\n !selectedMerchantId ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Choose a merchant above to view category mappings.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this) : loadingMappings ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: [\n \"Loading mappings for \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 260,\n columnNumber: 36\n }, this),\n \"…\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this) : mappings.length === 0 ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No category rows yet for this merchant. Once you run an import, discovered categories will appear here automatically.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.Fragment, {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3 flex items-center justify-between gap-3 text-xs text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n \"Mappings for\",\n \" \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-300\",\n children: selectedMerchantName\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 272,\n columnNumber: 19\n }, this),\n \".\",\n \" \",\n \"Set a part role for each raw category. Unmapped categories will be skipped by the importer.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 270,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"label\", {\n className: \"inline-flex items-center gap-1 text-[0.7rem] text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"input\", {\n type: \"checkbox\",\n className: \"h-3 w-3 rounded border-zinc-600 bg-zinc-900\",\n checked: showOnlyUnmapped,\n onChange: (e)=>setShowOnlyUnmapped(e.target.checked)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 277,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n children: \"Show only unmapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 283,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 276,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 269,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"overflow-x-auto\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"table\", {\n className: \"min-w-full text-sm\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"thead\", {\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-800 text-xs uppercase tracking-[0.16em] text-zinc-500\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Raw Category\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 291,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Mapped Part Role\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 292,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"th\", {\n className: \"py-2 text-left pr-4\",\n children: \"Status\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 293,\n columnNumber: 23\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 290,\n columnNumber: 21\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 289,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: visibleMappings.map((m)=>/*#__PURE__*/ {\n var _m_mappedPartRole;\n return (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tr\", {\n className: \"border-b border-zinc-900 last:border-b-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-zinc-200\",\n children: m.rawCategory\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 302,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"select\", {\n className: \"rounded-md border border-zinc-700 bg-zinc-900 px-2 py-1 text-xs text-zinc-100\",\n value: (_m_mappedPartRole = m.mappedPartRole) !== null && _m_mappedPartRole !== void 0 ? _m_mappedPartRole : \"\",\n onChange: (e)=>handleChangePartRole(m.rawCategory, e.target.value),\n children: PART_ROLE_OPTIONS.map((opt)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"option\", {\n value: opt.value,\n children: opt.label\n }, opt.value, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 317,\n columnNumber: 31\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 306,\n columnNumber: 27\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 305,\n columnNumber: 25\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"td\", {\n className: \"py-2 pr-4 align-top text-sm\",\n children: m.mappedPartRole ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-emerald-500/10 px-2 py-0.5 text-[0.7rem] font-medium text-emerald-300\",\n children: \"Mapped\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 325,\n columnNumber: 29\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"inline-flex items-center rounded-full bg-zinc-700/40 px-2 py-0.5 text-[0.7rem] font-medium text-zinc-300\",\n children: \"Unmapped / Ignored\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 329,\n columnNumber: 29\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 323,\n columnNumber: 25\n }, this)\n ]\n }, m.rawCategory, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 298,\n columnNumber: 23\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 296,\n columnNumber: 19\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 288,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 287,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 flex justify-end\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: handleSave,\n disabled: saving,\n className: \"rounded-md bg-amber-400 px-4 py-2 text-sm font-semibold text-black hover:bg-amber-300 disabled:opacity-50\",\n children: saving ? \"Saving…\" : \"Save Mappings\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 341,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 340,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 203,\n columnNumber: 7\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx\",\n lineNumber: 202,\n columnNumber: 5\n }, this);\n}\n_s(CategoryMappingsPage, \"XrG2YFgqARx8YUXvuejT1mz+RHE=\");\n_c = CategoryMappingsPage;\nvar _c;\n$RefreshReg$(_c, \"CategoryMappingsPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFcUQ7SUFHbkRHO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBcUIxQyx3REFBd0Q7QUFDeEQsTUFBTUksb0JBQW9CO0lBQ3hCO1FBQUVDLE9BQU87UUFBSUMsT0FBTztJQUFlO0lBQ25DLHVCQUF1QjtJQUN2QjtRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFXQyxPQUFPO0lBQXdCO0lBQ25EO1FBQUVELE9BQU87UUFBZUMsT0FBTztJQUFjO0lBQzdDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFFckQsUUFBUTtJQUNSO1FBQUVELE9BQU87UUFBa0JDLE9BQU87SUFBaUI7SUFDbkQ7UUFBRUQsT0FBTztRQUFVQyxPQUFPO0lBQVM7SUFDbkM7UUFBRUQsT0FBTztRQUFhQyxPQUFPO0lBQVk7SUFDekM7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQXlCO0lBQ3ZEO1FBQUVELE9BQU87UUFBaUJDLE9BQU87SUFBZ0I7SUFDakQ7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQWE7SUFFM0MsOEJBQThCO0lBQzlCO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBY0MsT0FBTztJQUFhO0lBQzNDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFTQyxPQUFPO0lBQXNCO0lBQy9DO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFpQjtDQUMzQztBQUVjLFNB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bkIsV0FBVTtzRUFBc0I7Ozs7Ozs7Ozs7Ozs7Ozs7OzBEQUd4Qyw4REFBQ29COzBEQUNFaEUsZ0JBQWdCMEIsR0FBRyxDQUFDLENBQUN4Qjt3REFXUEE7MkRBVmIsOERBQUM0RDt3REFFQ2xCLFdBQVU7OzBFQUVWLDhEQUFDcUI7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRUosV0FBVzs7Ozs7OzBFQUVoQiw4REFBQ21FO2dFQUFHckIsV0FBVTswRUFDWiw0RUFBQ0s7b0VBQ0NMLFdBQVU7b0VBQ1Z4RSxPQUFPOEIsQ0FBQUEsb0JBQUFBLEVBQUVOLGNBQWMsY0FBaEJNLCtCQUFBQSxvQkFBb0I7b0VBQzNCZ0QsVUFBVSxDQUFDQyxJQUNUNUIscUJBQ0VyQixFQUFFSixXQUFXLEVBQ2JxRCxFQUFFQyxNQUFNLENBQUNoRixLQUFLOzhFQUlqQkQsa0JBQWtCdUQsR0FBRyxDQUFDLENBQUN3QyxvQkFDdEIsOERBQUNaOzRFQUF1QmxGLE9BQU84RixJQUFJOUYsS0FBSztzRkFDckM4RixJQUFJN0YsS0FBSzsyRUFEQzZGLElBQUk5RixLQUFLOzs7Ozs7Ozs7Ozs7Ozs7MEVBTTVCLDhEQUFDNkY7Z0VBQUdyQixXQUFVOzBFQUNYMUMsRUFBRU4sY0FBYyxpQkFDZiw4REFBQzREO29FQUFLWixXQUFVOzhFQUFpSDs7Ozs7eUZBSWpJLDhEQUFDWTtvRUFBS1osV0FBVTs4RUFBMkc7Ozs7Ozs7Ozs7Ozt1REE5QjFIMUMsRUFBRUosV0FBVzs7Ozs7Z0RBbUNoQjs7Ozs7Ozs7Ozs7Ozs7Ozs7OENBTVosOERBQUMrQztvQ0FBSUQsV0FBVTs4Q0FDYiw0RUFBQ3VCO3dDQUNDVCxNQUFLO3dDQUNMVSxTQUFTekM7d0NBQ1QwQyxVQUFVdEY7d0NBQ1Y2RCxXQUFVO2tEQUVUN0QsU0FBUyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTeEM7R0E5U3dCVDtLQUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/PyBcImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MFwiO1xuXG50eXBlIE1lcmNoYW50ID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG50eXBlIE1hcHBpbmcgPSB7XG4gIGlkOiBudW1iZXIgfCBudWxsOyAgICAgICAgICAgLy8gbWlnaHQgYmUgbnVsbCBpZiBqdXN0IGNyZWF0ZWQgY2xpZW50LXNpZGVcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICBtZXJjaGFudE5hbWU6IHN0cmluZztcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG50eXBlIFVwc2VydFJlcXVlc3QgPSB7XG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgcmF3Q2F0ZWdvcnk6IHN0cmluZztcbiAgbWFwcGVkUGFydFJvbGU6IHN0cmluZyB8IG51bGw7XG59O1xuXG4vLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHlvdXIgYmFja2VuZCBgcGFydFJvbGVgIHZhbHVlc1xuY29uc3QgUEFSVF9ST0xFX09QVElPTlMgPSBbXG4gIHsgdmFsdWU6IFwiXCIsIGxhYmVsOiBcIuKAlCBVbm1hcHBlZCDigJRcIiB9LFxuICAvLyBMb3dlciAvIGZpcmUgY29udHJvbFxuICB7IHZhbHVlOiBcImxvd2VyLXJlY2VpdmVyXCIsIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyXCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1wYXJ0cy1raXRcIiwgbGFiZWw6IFwiTG93ZXIgUGFydHMgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJ0cmlnZ2VyXCIsIGxhYmVsOiBcIlRyaWdnZXIgLyBUcmlnZ2VyIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwicGlzdG9sLWdyaXBcIiwgbGFiZWw6IFwiUGlzdG9sIEdyaXBcIiB9LFxuICB7IHZhbHVlOiBcInNhZmV0eS1zZWxlY3RvclwiLCBsYWJlbDogXCJTYWZldHkgU2VsZWN0b3JcIiB9LFxuXG4gIC8vIFVwcGVyXG4gIHsgdmFsdWU6IFwidXBwZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcImJhcnJlbFwiLCBsYWJlbDogXCJCYXJyZWxcIiB9LFxuICB7IHZhbHVlOiBcImhhbmRndWFyZFwiLCBsYWJlbDogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IHZhbHVlOiBcImdhcy1zeXN0ZW1cIiwgbGFiZWw6IFwiR2FzIFN5c3RlbSAvIEdhcyBCbG9ja1wiIH0sXG4gIHsgdmFsdWU6IFwibXV6emxlLWRldmljZVwiLCBsYWJlbDogXCJNdXp6bGUgRGV2aWNlXCIgfSxcbiAgeyB2YWx1ZTogXCJzdXBwcmVzc29yXCIsIGxhYmVsOiBcIlN1cHByZXNzb3JcIiB9LFxuXG4gIC8vIEZ1cm5pdHVyZSAvIHNpZ2h0cyAvIG9wdGljc1xuICB7IHZhbHVlOiBcInN0b2NrXCIsIGxhYmVsOiBcIlN0b2NrXCIgfSxcbiAgeyB2YWx1ZTogXCJidWZmZXIta2l0XCIsIGxhYmVsOiBcIkJ1ZmZlciBLaXRcIiB9LFxuICB7IHZhbHVlOiBcImNoYXJnaW5nLWhhbmRsZVwiLCBsYWJlbDogXCJDaGFyZ2luZyBIYW5kbGVcIiB9LFxuICB7IHZhbHVlOiBcInNpZ2h0XCIsIGxhYmVsOiBcIklyb24gLyBCYWNrdXAgU2lnaHRcIiB9LFxuICB7IHZhbHVlOiBcIm9wdGljXCIsIGxhYmVsOiBcIk9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJvdGhlclwiLCBsYWJlbDogXCJPdGhlciAvIElnbm9yZVwiIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeU1hcHBpbmdzUGFnZSgpIHtcbiAgY29uc3QgW21lcmNoYW50cywgc2V0TWVyY2hhbnRzXSA9IHVzZVN0YXRlPE1lcmNoYW50W10+KFtdKTtcbiAgY29uc3QgW3NlbGVjdGVkTWVyY2hhbnRJZCwgc2V0U2VsZWN0ZWRNZXJjaGFudElkXSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFttYXBwaW5ncywgc2V0TWFwcGluZ3NdID0gdXNlU3RhdGU8TWFwcGluZ1tdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nTWFwcGluZ3MsIHNldExvYWRpbmdNYXBwaW5nc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzdWNjZXNzTWVzc2FnZSwgc2V0U3VjY2Vzc01lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzaG93T25seVVubWFwcGVkLCBzZXRTaG93T25seVVubWFwcGVkXSA9IHVzZVN0YXRlKGZhbHNlKTtcblxuICBjb25zdCBzb3J0ZWRNYXBwaW5ncyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIE1hcHBlZCByb3dzIGZpcnN0LCB0aGVuIHVubWFwcGVkOyB3aXRoaW4gZWFjaCBncm91cCwgYWxwaGEgYnkgcmF3Q2F0ZWdvcnlcbiAgICByZXR1cm4gWy4uLm1hcHBpbmdzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICBjb25zdCBhTWFwcGVkID0gISFhLm1hcHBlZFBhcnRSb2xlO1xuICAgICAgY29uc3QgYk1hcHBlZCA9ICEhYi5tYXBwZWRQYXJ0Um9sZTtcblxuICAgICAgaWYgKGFNYXBwZWQgIT09IGJNYXBwZWQpIHtcbiAgICAgICAgcmV0dXJuIGFNYXBwZWQgPyAtMSA6IDE7IC8vIG1hcHBlZCBmaXJzdFxuICAgICAgfVxuXG4gICAgICByZXR1cm4gYS5yYXdDYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIucmF3Q2F0ZWdvcnkpO1xuICAgIH0pO1xuICB9LCBbbWFwcGluZ3NdKTtcblxuICBjb25zdCB2aXNpYmxlTWFwcGluZ3MgPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBzaG93T25seVVubWFwcGVkXG4gICAgICAgID8gc29ydGVkTWFwcGluZ3MuZmlsdGVyKChtKSA9PiAhbS5tYXBwZWRQYXJ0Um9sZSlcbiAgICAgICAgOiBzb3J0ZWRNYXBwaW5ncyxcbiAgICBbc29ydGVkTWFwcGluZ3MsIHNob3dPbmx5VW5tYXBwZWRdLFxuICApO1xuXG4gIC8vIExvYWQgbWVyY2hhbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXJjaGFudHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50c2ApO1xuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGE6IE1lcmNoYW50W10gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRNZXJjaGFudHMoZGF0YSk7XG5cbiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IG1lcmNoYW50IGlmIHlvdSB3YW50XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgc2VsZWN0ZWRNZXJjaGFudElkID09PSBudWxsKSB7XG4gICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKGRhdGFbMF0uaWQpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWVyY2hhbnRzKCk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbXSk7XG5cbiAgLy8gTG9hZCBtYXBwaW5ncyBmb3Igc2VsZWN0ZWQgbWVyY2hhbnRcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoTWFwcGluZ3MoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3ModHJ1ZSk7XG4gICAgICAgIHNldEVycm9yKG51bGwpO1xuICAgICAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgICAgICBjb25zdCB1cmwgPSBgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50LWNhdGVnb3J5LW1hcHBpbmdzP21lcmNoYW50SWQ9JHtzZWxlY3RlZE1lcmNoYW50SWR9YDtcbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIG1hcHBpbmdzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyBNYXBwaW5nW107XG4gICAgICAgIHNldE1hcHBpbmdzKGRhdGEpO1xuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSBcIkFib3J0RXJyb3JcIikgcmV0dXJuO1xuICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3NcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nTWFwcGluZ3MoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoTWFwcGluZ3MoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtzZWxlY3RlZE1lcmNoYW50SWRdKTtcblxuICBjb25zdCBoYW5kbGVDaGFuZ2VQYXJ0Um9sZSA9IChyYXdDYXRlZ29yeTogc3RyaW5nLCBuZXdSb2xlOiBzdHJpbmcpID0+IHtcbiAgICBzZXRNYXBwaW5ncygocHJldikgPT5cbiAgICAgIHByZXYubWFwKChtKSA9PlxuICAgICAgICBtLnJhd0NhdGVnb3J5ID09PSByYXdDYXRlZ29yeVxuICAgICAgICAgID8geyAuLi5tLCBtYXBwZWRQYXJ0Um9sZTogbmV3Um9sZSB8fCBudWxsIH1cbiAgICAgICAgICA6IG0sXG4gICAgICApLFxuICAgICk7XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlU2F2ZSA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIXNlbGVjdGVkTWVyY2hhbnRJZCkgcmV0dXJuO1xuICAgIHNldFNhdmluZyh0cnVlKTtcbiAgICBzZXRFcnJvcihudWxsKTtcbiAgICBzZXRTdWNjZXNzTWVzc2FnZShudWxsKTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBTYXZlIGVhY2ggbWFwcGluZyBpbiBwYXJhbGxlbFxuICAgICAgY29uc3QgcmVxdWVzdHM6IFByb21pc2U8UmVzcG9uc2U+W10gPSBtYXBwaW5ncy5tYXAoKG0pID0+IHtcbiAgICAgICAgY29uc3QgcGF5bG9hZDogVXBzZXJ0UmVxdWVzdCA9IHtcbiAgICAgICAgICBtZXJjaGFudElkOiBzZWxlY3RlZE1lcmNoYW50SWQsXG4gICAgICAgICAgcmF3Q2F0ZWdvcnk6IG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgbWFwcGVkUGFydFJvbGU6IG0ubWFwcGVkUGFydFJvbGUsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3NgLCB7XG4gICAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpLFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChyZXF1ZXN0cyk7XG4gICAgICBjb25zdCBmYWlsZWQgPSByZXNwb25zZXMuZmlsdGVyKChyKSA9PiAhci5vayk7XG5cbiAgICAgIGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFNvbWUgbWFwcGluZ3MgZmFpbGVkIHRvIHNhdmUgKCR7ZmFpbGVkLmxlbmd0aH0pYCk7XG4gICAgICB9XG5cbiAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKFwiTWFwcGluZ3Mgc2F2ZWQuIFJlLXJ1biB0aGUgaW1wb3J0IHRvIGFwcGx5IGNoYW5nZXMuXCIpO1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICBzZXRFcnJvcihlcnIubWVzc2FnZSA/PyBcIkZhaWxlZCB0byBzYXZlIG1hcHBpbmdzXCIpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBzZXRTYXZpbmcoZmFsc2UpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBzZWxlY3RlZE1lcmNoYW50TmFtZSA9XG4gICAgbWVyY2hhbnRzLmZpbmQoKG0pID0+IG0uaWQgPT09IHNlbGVjdGVkTWVyY2hhbnRJZCk/Lm5hbWUgPz8gXCLigJRcIjtcblxuICByZXR1cm4gKFxuICAgIDxtYWluIGNsYXNzTmFtZT1cIm1pbi1oLXNjcmVlbiBiZy1ibGFjayB0ZXh0LXppbmMtNTBcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBtYXgtdy01eGwgcHgtNCBweS02IGxnOnB5LTEwXCI+XG4gICAgICAgIDxoZWFkZXIgY2xhc3NOYW1lPVwibWItNiBmbGV4IGZsZXgtY29sIGdhcC0zIG1kOmZsZXgtcm93IG1kOml0ZW1zLWVuZCBtZDpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjJlbV0gdXBwZXJjYXNlIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgU2hhZG93IFN0YW5kYXJkIC8gQWRtaW5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgTWVyY2hhbnQgQ2F0ZWdvcnkgTWFwcGluZ1xuICAgICAgICAgICAgPC9oMT5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1zbSB0ZXh0LXppbmMtNDAwIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgIE5vcm1hbGl6ZSBlYWNoIG1lcmNoYW50JmFwb3M7cyBjYXRlZ29yeSBuYW1lcyBpbnRvIHlvdXIgaW50ZXJuYWxcbiAgICAgICAgICAgICAgcGFydCByb2xlcyAodXBwZXIsIGJhcnJlbCwgaGFuZGd1YXJkLCBldGMuKS4gVW5tYXBwZWQgY2F0ZWdvcmllc1xuICAgICAgICAgICAgICB3aWxsIGJlIHNraXBwZWQgZHVyaW5nIGltcG9ydCB1bnRpbCB0aGV5IGFyZSBtYXBwZWQgaGVyZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiYmxvY2sgdGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtemluYy00MDAgbWItMVwiPlxuICAgICAgICAgICAgICBTZWxlY3QgTWVyY2hhbnRcbiAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0zIHB5LTIgdGV4dC1zbSB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgdmFsdWU9e3NlbGVjdGVkTWVyY2hhbnRJZCA/PyBcIlwifVxuICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgc2V0U2VsZWN0ZWRNZXJjaGFudElkKFxuICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUgPyBOdW1iZXIoZS50YXJnZXQudmFsdWUpIDogbnVsbCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPuKAlCBDaG9vc2UgbWVyY2hhbnQg4oCUPC9vcHRpb24+XG4gICAgICAgICAgICAgIHttZXJjaGFudHMubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e20uaWR9IHZhbHVlPXttLmlkfT5cbiAgICAgICAgICAgICAgICAgIHttLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAge2Vycm9yICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItcmVkLTUwMC82MCBiZy1yZWQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtcmVkLTIwMFwiPlxuICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuICAgICAgICAgIHtzdWNjZXNzTWVzc2FnZSAmJiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgcm91bmRlZCBib3JkZXIgYm9yZGVyLWVtZXJhbGQtNTAwLzYwIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTMgcHktMiB0ZXh0LXhzIHRleHQtZW1lcmFsZC0yMDBcIj5cbiAgICAgICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cblxuICAgICAgICAgIHshc2VsZWN0ZWRNZXJjaGFudElkID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIENob29zZSBhIG1lcmNoYW50IGFib3ZlIHRvIHZpZXcgY2F0ZWdvcnkgbWFwcGluZ3MuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IGxvYWRpbmdNYXBwaW5ncyA/IChcbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBMb2FkaW5nIG1hcHBpbmdzIGZvciA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj7igKZcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbWFwcGluZ3MubGVuZ3RoID09PSAwID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIE5vIGNhdGVnb3J5IHJvd3MgeWV0IGZvciB0aGlzIG1lcmNoYW50LiBPbmNlIHlvdSBydW4gYW4gaW1wb3J0LFxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGNhdGVnb3JpZXMgd2lsbCBhcHBlYXIgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0zIHRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICBNYXBwaW5ncyBmb3J7XCIgXCJ9XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtMzAwXCI+e3NlbGVjdGVkTWVyY2hhbnROYW1lfTwvc3Bhbj4ue1wiIFwifVxuICAgICAgICAgICAgICAgICAgU2V0IGEgcGFydCByb2xlIGZvciBlYWNoIHJhdyBjYXRlZ29yeS4gVW5tYXBwZWQgY2F0ZWdvcmllcyB3aWxsXG4gICAgICAgICAgICAgICAgICBiZSBza2lwcGVkIGJ5IHRoZSBpbXBvcnRlci5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtMyB3LTMgcm91bmRlZCBib3JkZXItemluYy02MDAgYmctemluYy05MDBcIlxuICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtzaG93T25seVVubWFwcGVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNob3dPbmx5VW5tYXBwZWQoZS50YXJnZXQuY2hlY2tlZCl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+U2hvdyBvbmx5IHVubWFwcGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtODAwIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlJhdyBDYXRlZ29yeTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB5LTIgdGV4dC1sZWZ0IHByLTRcIj5NYXBwZWQgUGFydCBSb2xlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlN0YXR1czwvdGg+XG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxuICAgICAgICAgICAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgICAgICAgICB7dmlzaWJsZU1hcHBpbmdzLm1hcCgobSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgIDx0clxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtOTAwIGxhc3Q6Ym9yZGVyLWItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC16aW5jLTIwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTIgcHktMSB0ZXh0LXhzIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXttLm1hcHBlZFBhcnRSb2xlID8/IFwiXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlUGFydFJvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ucmF3Q2F0ZWdvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudGFyZ2V0LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtQQVJUX1JPTEVfT1BUSU9OUy5tYXAoKG9wdCkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBrZXk9e29wdC52YWx1ZX0gdmFsdWU9e29wdC52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtvcHQubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3AgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7bS5tYXBwZWRQYXJ0Um9sZSA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJnLWVtZXJhbGQtNTAwLzEwIHB4LTIgcHktMC41IHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC1lbWVyYWxkLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctemluYy03MDAvNDAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbm1hcHBlZCAvIElnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC90Ym9keT5cbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgZmxleCBqdXN0aWZ5LWVuZFwiPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlU2F2ZX1cbiAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzYXZpbmd9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJnLWFtYmVyLTQwMCBweC00IHB5LTIgdGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtYmxhY2sgaG92ZXI6YmctYW1iZXItMzAwIGRpc2FibGVkOm9wYWNpdHktNTBcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtzYXZpbmcgPyBcIlNhdmluZ+KAplwiIDogXCJTYXZlIE1hcHBpbmdzXCJ9XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC8+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VFZmZlY3QiLCJ1c2VTdGF0ZSIsInVzZU1lbW8iLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX09QVElPTlMiLCJ2YWx1ZSIsImxhYmVsIiwiQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UiLCJtZXJjaGFudHMiLCJzZXRNZXJjaGFudHMiLCJzZWxlY3RlZE1lcmNoYW50SWQiLCJzZXRTZWxlY3RlZE1lcmNoYW50SWQiLCJtYXBwaW5ncyIsInNldE1hcHBpbmdzIiwibG9hZGluZ01hcHBpbmdzIiwic2V0TG9hZGluZ01hcHBpbmdzIiwic2F2aW5nIiwic2V0U2F2aW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInN1Y2Nlc3NNZXNzYWdlIiwic2V0U3VjY2Vzc01lc3NhZ2UiLCJzaG93T25seVVubWFwcGVkIiwic2V0U2hvd09ubHlVbm1hcHBlZCIsInNvcnRlZE1hcHBpbmdzIiwic29ydCIsImEiLCJiIiwiYU1hcHBlZCIsIm1hcHBlZFBhcnRSb2xlIiwiYk1hcHBlZCIsInJhd0NhdGVnb3J5IiwibG9jYWxlQ29tcGFyZSIsInZpc2libGVNYXBwaW5ncyIsImZpbHRlciIsIm0iLCJmZXRjaE1lcmNoYW50cyIsInJlcyIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibGVuZ3RoIiwiaWQiLCJlcnIiLCJjb25zb2xlIiwibWVzc2FnZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaE1hcHBpbmdzIiwidXJsIiwic2lnbmFsIiwibmFtZSIsImFib3J0IiwiaGFuZGxlQ2hhbmdlUGFydFJvbGUiLCJuZXdSb2xlIiwicHJldiIsIm1hcCIsImhhbmRsZVNhdmUiLCJyZXF1ZXN0cyIsInBheWxvYWQiLCJtZXJjaGFudElkIiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJKU09OIiwic3RyaW5naWZ5IiwicmVzcG9uc2VzIiwiUHJvbWlzZSIsImFsbCIsImZhaWxlZCIsInIiLCJzZWxlY3RlZE1lcmNoYW50TmFtZSIsImZpbmQiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2IiwiaGVhZGVyIiwicCIsImgxIiwic2VsZWN0Iiwib25DaGFuZ2UiLCJlIiwidGFyZ2V0IiwiTnVtYmVyIiwib3B0aW9uIiwic2VjdGlvbiIsInNwYW4iLCJpbnB1dCIsInR5cGUiLCJjaGVja2VkIiwidGFibGUiLCJ0aGVhZCIsInRyIiwidGgiLCJ0Ym9keSIsInRkIiwib3B0IiwiYnV0dG9uIiwib25DbGljayIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/admin/category-mappings/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/build/page.6aeb98c2de082c28.hot-update.js b/.next/static/webpack/app/gunbuilder/build/page.6aeb98c2de082c28.hot-update.js new file mode 100644 index 0000000..868afb7 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/build/page.6aeb98c2de082c28.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/build/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n// This is old and can probably be deleted\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFRiwwQ0FBMEM7QUFDbkMsTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG5cbi8vIFRoaXMgaXMgb2xkIGFuZCBjYW4gcHJvYmFibHkgYmUgZGVsZXRlZFxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/build/page.a6f46b17097acafc.hot-update.js b/.next/static/webpack/app/gunbuilder/build/page.a6f46b17097acafc.hot-update.js new file mode 100644 index 0000000..1dab6fd --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/build/page.a6f46b17097acafc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/build/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\n// Example – extend CATEGORIES\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsOEJBQThCO0FBQ3ZCLE1BQU1BLGFBQXVFO0lBQ2xGLFFBQVE7SUFDUjtRQUNFQyxJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUVBLFFBQVE7SUFDUjtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7Q0FDRCxDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gRXhhbXBsZSDigJMgZXh0ZW5kIENBVEVHT1JJRVNcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiB7IGlkOiBDYXRlZ29yeUlkOyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH1bXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/build/page.c7be720f450ad784.hot-update.js b/.next/static/webpack/app/gunbuilder/build/page.c7be720f450ad784.hot-update.js new file mode 100644 index 0000000..54d0eb8 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/build/page.c7be720f450ad784.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/build/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/build/page.f984af7569671cf9.hot-update.js b/.next/static/webpack/app/gunbuilder/build/page.f984af7569671cf9.hot-update.js new file mode 100644 index 0000000..be27a94 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/build/page.f984af7569671cf9.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/build/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFSyxNQUFNQyxRQUFnQjtJQUMzQjtRQUNFSCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.04e447b5b4d809a6.hot-update.js b/.next/static/webpack/app/gunbuilder/page.04e447b5b4d809a6.hot-update.js new file mode 100644 index 0000000..5537c5a --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.04e447b5b4d809a6.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optics: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpY3M6IFtcIm9wdGljXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFtcInRyaWdnZXJcIiwgXCJ0cmlnZ2VyLWtpdFwiXSxcbiAgZ3JpcDogW1wicGlzdG9sLWdyaXBcIiwgXCJncmlwXCJdLFxuICBzYWZldHk6IFtcInNhZmV0eVwiLCBcInNhZmV0eS1zZWxlY3RvclwiXSxcbiAgY29tcGxldGVMb3dlcjogW1wiY29tcGxldGUtbG93ZXJcIl0sXG5cbiAgLy8gTkVXIFVQUEVSIFBBUlRTXG4gIGNvbXBsZXRlVXBwZXI6IFtcImNvbXBsZXRlLXVwcGVyXCJdLFxuICBiY2c6IFtcImJjZ1wiLCBcImJvbHQtY2Fycmllci1ncm91cFwiXSxcbiAgZ2FzQmxvY2s6IFtcImdhcy1ibG9ja1wiXSxcbiAgZ2FzVHViZTogW1wiZ2FzLXR1YmVcIl0sXG4gIG11enpsZURldmljZTogW1wibXV6emxlLWRldmljZVwiLCBcImNvbXBlbnNhdG9yXCIsIFwiYnJha2VcIl0sXG4gIHN1cHByZXNzb3I6IFtcInN1cHByZXNzb3JcIl0sXG59O1xuXG4vLyBJbnZlcnQgdG8gZ2V0IHBhcnRSb2xlIC0+IENhdGVnb3J5SWRcbmV4cG9ydCBjb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0gT2JqZWN0XG4gIC5lbnRyaWVzKENBVEVHT1JZX1RPX1BBUlRfUk9MRVMpXG4gIC5yZWR1Y2UoKGFjYywgW2NhdGVnb3J5SWQsIHJvbGVzXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgYWNjW3JvbGVdID0gY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPik7Il0sIm5hbWVzIjpbIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWNzIiwic3RvY2siLCJ0cmlnZ2VyIiwiZ3JpcCIsInNhZmV0eSIsImNvbXBsZXRlTG93ZXIiLCJjb21wbGV0ZVVwcGVyIiwiYmNnIiwiZ2FzQmxvY2siLCJnYXNUdWJlIiwibXV6emxlRGV2aWNlIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.29420e8fdb9e3559.hot-update.js b/.next/static/webpack/app/gunbuilder/page.29420e8fdb9e3559.hot-update.js new file mode 100644 index 0000000..f5528d2 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.29420e8fdb9e3559.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optics\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFTO0lBQ2pCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNzXCJdLFxuICBzdG9jazogW1wic3RvY2tcIl0sXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFtcInRyaWdnZXJcIiwgXCJ0cmlnZ2VyLWtpdFwiXSxcbiAgZ3JpcDogW1wicGlzdG9sLWdyaXBcIiwgXCJncmlwXCJdLFxuICBzYWZldHk6IFtcInNhZmV0eVwiLCBcInNhZmV0eS1zZWxlY3RvclwiXSxcbiAgY29tcGxldGVMb3dlcjogW1wiY29tcGxldGUtbG93ZXJcIl0sXG5cbiAgLy8gTkVXIFVQUEVSIFBBUlRTXG4gIGNvbXBsZXRlVXBwZXI6IFtcImNvbXBsZXRlLXVwcGVyXCJdLFxuICBiY2c6IFtcImJjZ1wiLCBcImJvbHQtY2Fycmllci1ncm91cFwiXSxcbiAgZ2FzQmxvY2s6IFtcImdhcy1ibG9ja1wiXSxcbiAgZ2FzVHViZTogW1wiZ2FzLXR1YmVcIl0sXG4gIG11enpsZURldmljZTogW1wibXV6emxlLWRldmljZVwiLCBcImNvbXBlbnNhdG9yXCIsIFwiYnJha2VcIl0sXG4gIHN1cHByZXNzb3I6IFtcInN1cHByZXNzb3JcIl0sXG59O1xuXG4vLyBJbnZlcnQgdG8gZ2V0IHBhcnRSb2xlIC0+IENhdGVnb3J5SWRcbmV4cG9ydCBjb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0gT2JqZWN0XG4gIC5lbnRyaWVzKENBVEVHT1JZX1RPX1BBUlRfUk9MRVMpXG4gIC5yZWR1Y2UoKGFjYywgW2NhdGVnb3J5SWQsIHJvbGVzXSkgPT4ge1xuICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcykge1xuICAgICAgYWNjW3JvbGVdID0gY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkO1xuICAgIH1cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPik7Il0sIm5hbWVzIjpbIkNBVEVHT1JZX1RPX1BBUlRfUk9MRVMiLCJ1cHBlciIsImJhcnJlbCIsImhhbmRndWFyZCIsImNoYXJnaW5nSGFuZGxlIiwiYnVmZmVyIiwibG93ZXJQYXJ0cyIsInNpZ2h0cyIsImxvd2VyIiwib3B0aWMiLCJzdG9jayIsInRyaWdnZXIiLCJncmlwIiwic2FmZXR5IiwiY29tcGxldGVMb3dlciIsImNvbXBsZXRlVXBwZXIiLCJiY2ciLCJnYXNCbG9jayIsImdhc1R1YmUiLCJtdXp6bGVEZXZpY2UiLCJzdXBwcmVzc29yIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwiT2JqZWN0IiwiZW50cmllcyIsInJlZHVjZSIsImFjYyIsImNhdGVnb3J5SWQiLCJyb2xlcyIsInJvbGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.421a9585f365390e.hot-update.js b/.next/static/webpack/app/gunbuilder/page.421a9585f365390e.hot-update.js new file mode 100644 index 0000000..c783bb1 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.421a9585f365390e.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optics: [\n \"optics\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpY3M6IFtcIm9wdGljc1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuXG4gIC8vIE5FVyBMT1dFUiBQQVJUU1xuICB0cmlnZ2VyOiBbXCJ0cmlnZ2VyXCIsIFwidHJpZ2dlci1raXRcIl0sXG4gIGdyaXA6IFtcInBpc3RvbC1ncmlwXCIsIFwiZ3JpcFwiXSxcbiAgc2FmZXR5OiBbXCJzYWZldHlcIiwgXCJzYWZldHktc2VsZWN0b3JcIl0sXG4gIGNvbXBsZXRlTG93ZXI6IFtcImNvbXBsZXRlLWxvd2VyXCJdLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBjb21wbGV0ZVVwcGVyOiBbXCJjb21wbGV0ZS11cHBlclwiXSxcbiAgYmNnOiBbXCJiY2dcIiwgXCJib2x0LWNhcnJpZXItZ3JvdXBcIl0sXG4gIGdhc0Jsb2NrOiBbXCJnYXMtYmxvY2tcIl0sXG4gIGdhc1R1YmU6IFtcImdhcy10dWJlXCJdLFxuICBtdXp6bGVEZXZpY2U6IFtcIm11enpsZS1kZXZpY2VcIiwgXCJjb21wZW5zYXRvclwiLCBcImJyYWtlXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxufTtcblxuLy8gSW52ZXJ0IHRvIGdldCBwYXJ0Um9sZSAtPiBDYXRlZ29yeUlkXG5leHBvcnQgY29uc3QgUEFSVF9ST0xFX1RPX0NBVEVHT1JZOiBSZWNvcmQ8c3RyaW5nLCBDYXRlZ29yeUlkPiA9IE9iamVjdFxuICAuZW50cmllcyhDQVRFR09SWV9UT19QQVJUX1JPTEVTKVxuICAucmVkdWNlKChhY2MsIFtjYXRlZ29yeUlkLCByb2xlc10pID0+IHtcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgIGFjY1tyb2xlXSA9IGNhdGVnb3J5SWQgYXMgQ2F0ZWdvcnlJZDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4pOyJdLCJuYW1lcyI6WyJDQVRFR09SWV9UT19QQVJUX1JPTEVTIiwidXBwZXIiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJjaGFyZ2luZ0hhbmRsZSIsImJ1ZmZlciIsImxvd2VyUGFydHMiLCJzaWdodHMiLCJsb3dlciIsIm9wdGljcyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.5371990b51e58af5.hot-update.js b/.next/static/webpack/app/gunbuilder/page.5371990b51e58af5.hot-update.js new file mode 100644 index 0000000..454f9d6 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.5371990b51e58af5.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./components/CategoryColumn.tsx": +/*!***************************************!*\ + !*** ./components/CategoryColumn.tsx ***! + \***************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts yet for this category.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7OzBDQUNiLDhEQUFDSDtnQ0FBRUcsV0FBVTswQ0FBd0I7Ozs7OzswQ0FDckMsOERBQUNaLGlEQUFJQTtnQ0FDSGdCLE1BQU0sZUFBMkIsT0FBWmIsU0FBU08sRUFBRTtnQ0FDaENFLFdBQVU7O2tEQUVWLDhEQUFDSzt3Q0FDQ0wsV0FBVTt3Q0FDVk0sTUFBSzt3Q0FDTEMsUUFBTzt3Q0FDUEMsU0FBUTtrREFFUiw0RUFBQ0M7NENBQ0NDLGVBQWM7NENBQ2RDLGdCQUFlOzRDQUNmQyxhQUFhOzRDQUNiQyxHQUFFOzs7Ozs7Ozs7OztvQ0FFQTs7Ozs7Ozs7Ozs7OztvQkFLWGxCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB5QixNQUFNbkI7d0JBQ05vQixVQUFVcEIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0J1QixVQUFVLElBQU10QixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sR0FBRyxtQkFDZCw4REFBQ2YsaURBQUlBO2dCQUNIZ0IsTUFBTSxlQUEyQixPQUFaYixTQUFTTyxFQUFFO2dCQUNoQ0UsV0FBVTs7b0JBQ1g7b0JBQ1lSLE1BQU1XLE1BQU07b0JBQUM7Ozs7Ozs7Ozs7Ozs7QUFLbEM7S0FqRWdCYiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeD85YzE4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgUGFydENhcmQgfSBmcm9tIFwiQC9jb21wb25lbnRzL1BhcnRDYXJkXCI7XG5cbmludGVyZmFjZSBDYXRlZ29yeUNvbHVtblByb3BzIHtcbiAgY2F0ZWdvcnk6IENhdGVnb3J5O1xuICBwYXJ0czogUGFydFtdO1xuICBzZWxlY3RlZFBhcnRJZD86IHN0cmluZztcbiAgb25TZWxlY3RQYXJ0OiAocGFydElkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXRlZ29yeUNvbHVtbih7XG4gIGNhdGVnb3J5LFxuICBwYXJ0cyxcbiAgc2VsZWN0ZWRQYXJ0SWQsXG4gIG9uU2VsZWN0UGFydCxcbn06IENhdGVnb3J5Q29sdW1uUHJvcHMpIHtcbiAgLy8gU2hvdyBzZWxlY3RlZCBwYXJ0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHNob3cgcGxhY2Vob2xkZXJcbiAgY29uc3QgZGlzcGxheWVkUGFydCA9IHNlbGVjdGVkUGFydElkXG4gICAgPyBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZFBhcnRJZClcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTNcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4xNWVtXSB0ZXh0LXppbmMtNDAwIHVwcGVyY2FzZVwiPlxuICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICB7cGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5ObyBwYXJ0cyB5ZXQgZm9yIHRoaXMgY2F0ZWdvcnkuPC9wPlxuICAgICAgICApfVxuICAgICAgICB7IWRpc3BsYXllZFBhcnQgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBtYi0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+Tm8gcGFydCBzZWxlY3RlZDwvcD5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNjAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMjAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTUwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNHYxNm04LThINFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENob29zZSBhIFBhcnRcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXllZFBhcnQgJiYgKFxuICAgICAgICAgIDxQYXJ0Q2FyZFxuICAgICAgICAgICAga2V5PXtkaXNwbGF5ZWRQYXJ0LmlkfVxuICAgICAgICAgICAgcGFydD17ZGlzcGxheWVkUGFydH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtkaXNwbGF5ZWRQYXJ0LmlkID09PSBzZWxlY3RlZFBhcnRJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNlbGVjdFBhcnQoZGlzcGxheWVkUGFydC5pZCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3BhcnRzLmxlbmd0aCA+IDEgJiYgKFxuICAgICAgICA8TGlua1xuICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgY2xhc3NOYW1lPVwibXQtMiB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXhzIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzIHRleHQtY2VudGVyXCJcbiAgICAgICAgPlxuICAgICAgICAgIFZpZXcgQWxsICh7cGFydHMubGVuZ3RofSlcbiAgICAgICAgPC9MaW5rPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJMaW5rIiwiUGFydENhcmQiLCJDYXRlZ29yeUNvbHVtbiIsImNhdGVnb3J5IiwicGFydHMiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImRpc3BsYXllZFBhcnQiLCJmaW5kIiwicCIsImlkIiwiZGl2IiwiY2xhc3NOYW1lIiwiaDIiLCJuYW1lIiwibGVuZ3RoIiwiaHJlZiIsInN2ZyIsImZpbGwiLCJzdHJva2UiLCJ2aWV3Qm94IiwicGF0aCIsInN0cm9rZUxpbmVjYXAiLCJzdHJva2VMaW5lam9pbiIsInN0cm9rZVdpZHRoIiwiZCIsInBhcnQiLCJzZWxlY3RlZCIsIm9uU2VsZWN0Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.6aeb98c2de082c28.hot-update.js b/.next/static/webpack/app/gunbuilder/page.6aeb98c2de082c28.hot-update.js new file mode 100644 index 0000000..425b304 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.6aeb98c2de082c28.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n// This is old and can probably be deleted\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFRiwwQ0FBMEM7QUFDbkMsTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JJRVM6IENhdGVnb3J5W10gPSBbXG4gIC8vIExPV0VSXG4gIHtcbiAgICBpZDogXCJsb3dlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemVkIGxvd2VyIOKAkyB0aGUgZm91bmRhdGlvbiBvZiB0aGUgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBMb3dlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkZhY3RvcnktYnVpbHQgbG93ZXIgd2l0aCBzdG9jaywgYnVmZmVyIHN5c3RlbSwgYW5kIGNvbnRyb2xzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibG93ZXJQYXJ0c1wiLFxuICAgIG5hbWU6IFwiTG93ZXIgUGFydHMgS2l0XCIsXG4gICAgZGVzY3JpcHRpb246IFwiUGlucywgc3ByaW5ncywgYW5kIGNvbnRyb2xzIGZvciB0aGUgbG93ZXIuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ0cmlnZ2VyXCIsXG4gICAgbmFtZTogXCJUcmlnZ2VyIC8gRmlyZSBDb250cm9sXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2luZ2xlLXN0YWdlLCB0d28tc3RhZ2UsIGFuZCBtYXRjaCB0cmlnZ2Vycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdyaXBcIixcbiAgICBuYW1lOiBcIlBpc3RvbCBHcmlwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiR3JpcHMgdGhhdCBzaGFwZSBob3cgdGhlIHJpZmxlIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzYWZldHlcIixcbiAgICBuYW1lOiBcIlNhZmV0eSAvIFNlbGVjdG9yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQW1iaSBzZWxlY3RvcnMgYW5kIGNvbnRyb2wgdXBncmFkZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJidWZmZXJcIixcbiAgICBuYW1lOiBcIkJ1ZmZlciBTeXN0ZW1cIixcbiAgICBkZXNjcmlwdGlvbjogXCJCdWZmZXIgdHViZSwgYnVmZmVyLCBzcHJpbmcsIGFuZCByZWxhdGVkIHBhcnRzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2tcIixcbiAgICBuYW1lOiBcIlN0b2NrIC8gQnJhY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBZGp1c3RhYmxlLCBmaXhlZCwgYW5kIG1pbmltYWxpc3Qgc3RvY2tzLlwiLFxuICB9LFxuXG4gIC8vIFVQUEVSXG4gIHtcbiAgICBpZDogXCJ1cHBlclwiLFxuICAgIG5hbWU6IFwiU3RyaXBwZWQgVXBwZXIgUmVjZWl2ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgY29yZSBvZiB0aGUgdG9wIGhhbGYgb2YgeW91ciBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlVXBwZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIFVwcGVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiUHJlLWFzc2VtYmxlZCB1cHBlcnMgcmVhZHkgdG8gcGluIGFuZCBzaG9vdC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJjZ1wiLFxuICAgIG5hbWU6IFwiQm9sdCBDYXJyaWVyIEdyb3VwXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGhlYXJ0YmVhdCBvZiB0aGUgcmlmbGXigJlzIGN5Y2xpbmcuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiYXJyZWxcIixcbiAgICBuYW1lOiBcIkJhcnJlbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBsZW5ndGhzLCBwcm9maWxlcywgYW5kIGNhbGliZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzQmxvY2tcIixcbiAgICBuYW1lOiBcIkdhcyBCbG9ja1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhZGp1c3RhYmxlIGdhcyBibG9ja3MuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNUdWJlXCIsXG4gICAgbmFtZTogXCJHYXMgVHViZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkNhcmJpbmUsIG1pZCwgcmlmbGUsIGFuZCBtb3JlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwibXV6emxlRGV2aWNlXCIsXG4gICAgbmFtZTogXCJNdXp6bGUgRGV2aWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnJha2VzLCBjb21wcywgYW5kIGZsYXNoIGhpZGVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN1cHByZXNzb3JcIixcbiAgICBuYW1lOiBcIlN1cHByZXNzb3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJIZWFyaW5nLXNhZmUgc2V0dXBzIGFuZCBob3N0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhhbmRndWFyZFwiLFxuICAgIG5hbWU6IFwiSGFuZGd1YXJkIC8gUmFpbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIk0tTE9LIHJhaWxzIGFuZCBmcm9udC1lbmQgZnVybml0dXJlLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICBuYW1lOiBcIkNoYXJnaW5nIEhhbmRsZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlN0YW5kYXJkIGFuZCBhbWJpIGNoYXJnaW5nIGhhbmRsZXMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzaWdodHNcIixcbiAgICBuYW1lOiBcIklyb24gU2lnaHRzXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQmFja3VwIGFuZCBwcmltYXJ5IGlyb25zLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwib3B0aWNcIixcbiAgICBuYW1lOiBcIk9wdGljXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTFBWT3MsIHJlZCBkb3RzLCBhbmQgbWFnbmlmaWVycy5cIixcbiAgfSxcbl07XG5cbi8vIFRoaXMgaXMgb2xkIGFuZCBjYW4gcHJvYmFibHkgYmUgZGVsZXRlZFxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.6d78bd22f79ae832.hot-update.js b/.next/static/webpack/app/gunbuilder/page.6d78bd22f79ae832.hot-update.js new file mode 100644 index 0000000..758a8d6 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.6d78bd22f79ae832.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./components/CategoryColumn.tsx": +/*!***************************************!*\ + !*** ./components/CategoryColumn.tsx ***! + \***************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts available yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length > 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7OzBDQUNiLDhEQUFDSDtnQ0FBRUcsV0FBVTswQ0FBd0I7Ozs7OzswQ0FDckMsOERBQUNaLGlEQUFJQTtnQ0FDSGdCLE1BQU0sZUFBMkIsT0FBWmIsU0FBU08sRUFBRTtnQ0FDaENFLFdBQVU7O2tEQUVWLDhEQUFDSzt3Q0FDQ0wsV0FBVTt3Q0FDVk0sTUFBSzt3Q0FDTEMsUUFBTzt3Q0FDUEMsU0FBUTtrREFFUiw0RUFBQ0M7NENBQ0NDLGVBQWM7NENBQ2RDLGdCQUFlOzRDQUNmQyxhQUFhOzRDQUNiQyxHQUFFOzs7Ozs7Ozs7OztvQ0FFQTs7Ozs7Ozs7Ozs7OztvQkFLWGxCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB5QixNQUFNbkI7d0JBQ05vQixVQUFVcEIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0J1QixVQUFVLElBQU10QixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sR0FBRyxtQkFDZCw4REFBQ2YsaURBQUlBO2dCQUNIZ0IsTUFBTSxlQUEyQixPQUFaYixTQUFTTyxFQUFFO2dCQUNoQ0UsV0FBVTs7b0JBQ1g7b0JBQ1lSLE1BQU1XLE1BQU07b0JBQUM7Ozs7Ozs7Ozs7Ozs7QUFLbEM7S0FqRWdCYiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeD85YzE4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgUGFydENhcmQgfSBmcm9tIFwiQC9jb21wb25lbnRzL1BhcnRDYXJkXCI7XG5cbmludGVyZmFjZSBDYXRlZ29yeUNvbHVtblByb3BzIHtcbiAgY2F0ZWdvcnk6IENhdGVnb3J5O1xuICBwYXJ0czogUGFydFtdO1xuICBzZWxlY3RlZFBhcnRJZD86IHN0cmluZztcbiAgb25TZWxlY3RQYXJ0OiAocGFydElkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXRlZ29yeUNvbHVtbih7XG4gIGNhdGVnb3J5LFxuICBwYXJ0cyxcbiAgc2VsZWN0ZWRQYXJ0SWQsXG4gIG9uU2VsZWN0UGFydCxcbn06IENhdGVnb3J5Q29sdW1uUHJvcHMpIHtcbiAgLy8gU2hvdyBzZWxlY3RlZCBwYXJ0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHNob3cgcGxhY2Vob2xkZXJcbiAgY29uc3QgZGlzcGxheWVkUGFydCA9IHNlbGVjdGVkUGFydElkXG4gICAgPyBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZFBhcnRJZClcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTNcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4xNWVtXSB0ZXh0LXppbmMtNDAwIHVwcGVyY2FzZVwiPlxuICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICB7cGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5ObyBwYXJ0cyBhdmFpbGFibGUgeWV0LjwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNwbGF5ZWRQYXJ0ICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgbWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPk5vIHBhcnQgc2VsZWN0ZWQ8L3A+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzYwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTIwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy01MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy00IGgtNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9XG4gICAgICAgICAgICAgICAgICBkPVwiTTEyIDR2MTZtOC04SDRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBDaG9vc2UgYSBQYXJ0XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtkaXNwbGF5ZWRQYXJ0ICYmIChcbiAgICAgICAgICA8UGFydENhcmRcbiAgICAgICAgICAgIGtleT17ZGlzcGxheWVkUGFydC5pZH1cbiAgICAgICAgICAgIHBhcnQ9e2Rpc3BsYXllZFBhcnR9XG4gICAgICAgICAgICBzZWxlY3RlZD17ZGlzcGxheWVkUGFydC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWR9XG4gICAgICAgICAgICBvblNlbGVjdD17KCkgPT4gb25TZWxlY3RQYXJ0KGRpc3BsYXllZFBhcnQuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtwYXJ0cy5sZW5ndGggPiAxICYmIChcbiAgICAgICAgPExpbmtcbiAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTIgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICBWaWV3IEFsbCAoe3BhcnRzLmxlbmd0aH0pXG4gICAgICAgIDwvTGluaz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwibmFtZXMiOlsiTGluayIsIlBhcnRDYXJkIiwiQ2F0ZWdvcnlDb2x1bW4iLCJjYXRlZ29yeSIsInBhcnRzIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJkaXNwbGF5ZWRQYXJ0IiwiZmluZCIsInAiLCJpZCIsImRpdiIsImNsYXNzTmFtZSIsImgyIiwibmFtZSIsImxlbmd0aCIsImhyZWYiLCJzdmciLCJmaWxsIiwic3Ryb2tlIiwidmlld0JveCIsInBhdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJzdHJva2VXaWR0aCIsImQiLCJwYXJ0Iiwic2VsZWN0ZWQiLCJvblNlbGVjdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.6f38bb490ac1fcd5.hot-update.js b/.next/static/webpack/app/gunbuilder/page.6f38bb490ac1fcd5.hot-update.js new file mode 100644 index 0000000..713c5f0 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.6f38bb490ac1fcd5.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./components/CategoryColumn.tsx": +/*!***************************************!*\ + !*** ./components/CategoryColumn.tsx ***! + \***************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts available yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length > +1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7OzBDQUNiLDhEQUFDSDtnQ0FBRUcsV0FBVTswQ0FBd0I7Ozs7OzswQ0FDckMsOERBQUNaLGlEQUFJQTtnQ0FDSGdCLE1BQU0sZUFBMkIsT0FBWmIsU0FBU08sRUFBRTtnQ0FDaENFLFdBQVU7O2tEQUVWLDhEQUFDSzt3Q0FDQ0wsV0FBVTt3Q0FDVk0sTUFBSzt3Q0FDTEMsUUFBTzt3Q0FDUEMsU0FBUTtrREFFUiw0RUFBQ0M7NENBQ0NDLGVBQWM7NENBQ2RDLGdCQUFlOzRDQUNmQyxhQUFhOzRDQUNiQyxHQUFFOzs7Ozs7Ozs7OztvQ0FFQTs7Ozs7Ozs7Ozs7OztvQkFLWGxCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB5QixNQUFNbkI7d0JBQ05vQixVQUFVcEIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0J1QixVQUFVLElBQU10QixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sR0FBRSxDQUFFLG1CQUNmLDhEQUFDZixpREFBSUE7Z0JBQ0hnQixNQUFNLGVBQTJCLE9BQVpiLFNBQVNPLEVBQUU7Z0JBQ2hDRSxXQUFVOztvQkFDWDtvQkFDWVIsTUFBTVcsTUFBTTtvQkFBQzs7Ozs7Ozs7Ozs7OztBQUtsQztLQWpFZ0JiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4PzljMTgiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5pbXBvcnQgeyBQYXJ0Q2FyZCB9IGZyb20gXCJAL2NvbXBvbmVudHMvUGFydENhcmRcIjtcblxuaW50ZXJmYWNlIENhdGVnb3J5Q29sdW1uUHJvcHMge1xuICBjYXRlZ29yeTogQ2F0ZWdvcnk7XG4gIHBhcnRzOiBQYXJ0W107XG4gIHNlbGVjdGVkUGFydElkPzogc3RyaW5nO1xuICBvblNlbGVjdFBhcnQ6IChwYXJ0SWQ6IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENhdGVnb3J5Q29sdW1uKHtcbiAgY2F0ZWdvcnksXG4gIHBhcnRzLFxuICBzZWxlY3RlZFBhcnRJZCxcbiAgb25TZWxlY3RQYXJ0LFxufTogQ2F0ZWdvcnlDb2x1bW5Qcm9wcykge1xuICAvLyBTaG93IHNlbGVjdGVkIHBhcnQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2Ugc2hvdyBwbGFjZWhvbGRlclxuICBjb25zdCBkaXNwbGF5ZWRQYXJ0ID0gc2VsZWN0ZWRQYXJ0SWRcbiAgICA/IHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHNlbGVjdGVkUGFydElkKVxuICAgIDogbnVsbDtcblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBoLWZ1bGxcIj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItM1wiPlxuICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE1ZW1dIHRleHQtemluYy00MDAgdXBwZXJjYXNlXCI+XG4gICAgICAgICAge2NhdGVnb3J5Lm5hbWV9XG4gICAgICAgIDwvaDI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwci0xXCI+XG4gICAgICAgIHtwYXJ0cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPk5vIHBhcnRzIGF2YWlsYWJsZSB5ZXQuPC9wPlxuICAgICAgICApfVxuICAgICAgICB7IWRpc3BsYXllZFBhcnQgJiYgcGFydHMubGVuZ3RoID4gMCAmJiAoXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgYm9yZGVyIGJvcmRlci16aW5jLTcwMCByb3VuZGVkLW1kIHAtMyBtYi0yIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtM1wiPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+Tm8gcGFydCBzZWxlY3RlZDwvcD5cbiAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgIGhyZWY9e2AvZ3VuYnVpbGRlci8ke2NhdGVnb3J5LmlkfWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNjAgcHgtMyBweS0xLjUgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMjAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTUwMCB0cmFuc2l0aW9uLWNvbG9yc1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzdmdcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LTQgaC00XCJcbiAgICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiXG4gICAgICAgICAgICAgICAgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcbiAgICAgICAgICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICBzdHJva2VMaW5lY2FwPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWpvaW49XCJyb3VuZFwiXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aD17Mn1cbiAgICAgICAgICAgICAgICAgIGQ9XCJNMTIgNHYxNm04LThINFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgIENob29zZSBhIFBhcnRcbiAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgICAge2Rpc3BsYXllZFBhcnQgJiYgKFxuICAgICAgICAgIDxQYXJ0Q2FyZFxuICAgICAgICAgICAga2V5PXtkaXNwbGF5ZWRQYXJ0LmlkfVxuICAgICAgICAgICAgcGFydD17ZGlzcGxheWVkUGFydH1cbiAgICAgICAgICAgIHNlbGVjdGVkPXtkaXNwbGF5ZWRQYXJ0LmlkID09PSBzZWxlY3RlZFBhcnRJZH1cbiAgICAgICAgICAgIG9uU2VsZWN0PXsoKSA9PiBvblNlbGVjdFBhcnQoZGlzcGxheWVkUGFydC5pZCl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgIDwvZGl2PlxuICAgICAge3BhcnRzLmxlbmd0aCA+KyAxICYmIChcbiAgICAgICAgPExpbmtcbiAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTIgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC14cyBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyB0ZXh0LWNlbnRlclwiXG4gICAgICAgID5cbiAgICAgICAgICBWaWV3IEFsbCAoe3BhcnRzLmxlbmd0aH0pXG4gICAgICAgIDwvTGluaz5cbiAgICAgICl9XG4gICAgPC9kaXY+XG4gICk7XG59XG4iXSwibmFtZXMiOlsiTGluayIsIlBhcnRDYXJkIiwiQ2F0ZWdvcnlDb2x1bW4iLCJjYXRlZ29yeSIsInBhcnRzIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJkaXNwbGF5ZWRQYXJ0IiwiZmluZCIsInAiLCJpZCIsImRpdiIsImNsYXNzTmFtZSIsImgyIiwibmFtZSIsImxlbmd0aCIsImhyZWYiLCJzdmciLCJmaWxsIiwic3Ryb2tlIiwidmlld0JveCIsInBhdGgiLCJzdHJva2VMaW5lY2FwIiwic3Ryb2tlTGluZWpvaW4iLCJzdHJva2VXaWR0aCIsImQiLCJwYXJ0Iiwic2VsZWN0ZWQiLCJvblNlbGVjdCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.711cbdf6e524d616.hot-update.js b/.next/static/webpack/app/gunbuilder/page.711cbdf6e524d616.hot-update.js new file mode 100644 index 0000000..ed1a881 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.711cbdf6e524d616.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx": +/*!*********************************!*\ + !*** ./app/gunbuilder/page.tsx ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n // EXISTING\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\",\n // NEW LOWER PARTS\n trigger: \"trigger\",\n \"trigger-kit\": \"trigger\",\n \"pistol-grip\": \"grip\",\n grip: \"grip\",\n safety: \"safety\",\n \"safety-selector\": \"safety\",\n \"complete-lower\": \"completeLower\",\n // NEW UPPER PARTS\n \"complete-upper\": \"completeUpper\",\n bcg: \"bcg\",\n \"bolt-carrier-group\": \"bcg\",\n \"gas-block\": \"gasBlock\",\n \"gas-tube\": \"gasTube\",\n \"muzzle-device\": \"muzzleDevice\",\n compensator: \"muzzleDevice\",\n brake: \"muzzleDevice\",\n suppressor: \"suppressor\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n const [layoutMode, setLayoutMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"cards\");\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 260,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 268,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 257,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 277,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 281,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 280,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 283,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 276,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 293,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 296,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 291,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"Choose one part per category. Switch layouts to browse by cards or a tighter list view.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 307,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"inline-flex items-center rounded-md border border-zinc-700 bg-zinc-900/70 text-[0.7rem]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"cards\"),\n className: \"px-2.5 py-1 rounded-l-md border-r border-zinc-700 transition-colors \".concat(layoutMode === \"cards\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"Card view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 311,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"list\"),\n className: \"px-2.5 py-1 rounded-r-md transition-colors \".concat(layoutMode === \"list\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"List view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 322,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 310,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 306,\n columnNumber: 13\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 336,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 341,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 361,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 365,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 359,\n columnNumber: 23\n }, this),\n layoutMode === \"cards\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 379,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 375,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 373,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60 flex flex-col md:flex-row md:items-start md:justify-between gap-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 397,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 393,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 25\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 358,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 347,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 305,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 418,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 424,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 442,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 453,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 446,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 458,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 441,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 429,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 422,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 470,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 480,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 497,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 469,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 417,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 303,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 506,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 510,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 511,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 515,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 519,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 509,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 505,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 528,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 532,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 533,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 534,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 535,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 536,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 531,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 527,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 273,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 256,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Gf0ADXJJ40AD6WNDCWO2nEU+pms=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFUztJQWMzRFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU1JLHdCQUFvRDtJQUN4RCxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCQyxRQUFRO0lBQ1JDLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQkMsT0FBTztJQUNQLGtCQUFrQjtJQUNsQkMsT0FBTztJQUNQQyxPQUFPO0lBRVAsa0JBQWtCO0lBQ2xCQyxTQUFTO0lBQ1QsZUFBZTtJQUNmLGVBQWU7SUFDZkMsTUFBTTtJQUNOQyxRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUVsQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCQyxLQUFLO0lBQ0wsc0JBQXNCO0lBQ3RCLGFBQWE7SUFDYixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCQyxhQUFhO0lBQ2JDLE9BQU87SUFDUEMsWUFBWTtBQUNkO0FBSUEsTUFBTUMsY0FBYztBQUVwQiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGFBQWE7QUFDYix1REFBdUQ7QUFDdkQsb0RBQW9EO0FBQ3BELE1BQU1DLGtCQUtBO0lBQ0o7UUFDRUMsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtB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MERBRVA7Ozs7OzswREFHRCw4REFBQ0U7Z0RBQ0NDLE1BQUs7Z0RBQ0xDLFNBQVM7b0RBQ1A1RSxTQUFTLENBQUM7b0RBQ1YsSUFBSSxJQUE2QixFQUFFO3dEQUNqQ0UsYUFBYXNGLFVBQVUsQ0FBQ3hHO29EQUMxQjtnREFDRjtnREFDQXlHLFVBQVVwQyxjQUFjbUIsTUFBTSxLQUFLO2dEQUNuQ04sV0FBVyxpS0FJVixPQUhDYixjQUFjbUIsTUFBTSxLQUFLLElBQ3JCLGtDQUNBOzBEQUVQOzs7Ozs7MERBR0QsOERBQUNuRDtnREFBRTZDLFdBQVU7MERBQW1DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBUXRELDhEQUFDTzt3QkFBUVAsV0FBVTs7MENBQ2pCLDhEQUFDYTtnQ0FBR2IsV0FBVTswQ0FBbUU7Ozs7OzswQ0FHakYsOERBQUNpQjtnQ0FBR2pCLFdBQVU7O2tEQUNaLDhEQUFDb0I7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFJSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFJSiw4REFBQ0E7a0RBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FRUiw4REFBQ2I7d0JBQVFQLFdBQVU7OzBDQUNqQiw4REFBQ2E7Z0NBQUdiLFdBQVU7MENBQW1FOzs7Ozs7MENBR2pGLDhEQUFDaUI7Z0NBQUdqQixXQUFVOztrREFDWiw4REFBQ29CO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFNaEI7R0E5YXdCaEc7O1FBQ0QzQiw0REFBZUE7UUFDckJDLHNEQUFTQTs7O0tBRkYwQiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9hcHAvZ3VuYnVpbGRlci9wYWdlLnRzeD8wNTQwIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VNZW1vLCB1c2VTdGF0ZSwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgeyB1c2VTZWFyY2hQYXJhbXMsIHVzZVJvdXRlciB9IGZyb20gXCJuZXh0L25hdmlnYXRpb25cIjtcbmltcG9ydCB7IENBVEVHT1JJRVMgfSBmcm9tIFwiQC9kYXRhL2d1bmJ1aWxkZXJQYXJ0c1wiO1xuaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkLCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgQ2F0ZWdvcnlDb2x1bW4gfSBmcm9tIFwiQC9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uXCI7XG5cbnR5cGUgR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpID0ge1xuICBpZDogbnVtYmVyOyAvLyBiYWNrZW5kIG51bWVyaWMgaWRcbiAgbmFtZTogc3RyaW5nO1xuICBicmFuZDogc3RyaW5nO1xuICBwbGF0Zm9ybTogc3RyaW5nO1xuICBwYXJ0Um9sZTogc3RyaW5nO1xuICBwcmljZTogbnVtYmVyIHwgbnVsbDtcbiAgbWFpbkltYWdlVXJsOiBzdHJpbmcgfCBudWxsO1xuICBidXlVcmw6IHN0cmluZyB8IG51bGw7XG59O1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxuLy8gTWFwIGJhY2tlbmQgcGFydFJvbGUgdG8geW91ciBleGlzdGluZyBDYXRlZ29yeUlkIHZhbHVlcy5cbmNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSB7XG4gIC8vIEVYSVNUSU5HXG4gIFwidXBwZXItcmVjZWl2ZXJcIjogXCJ1cHBlclwiLFxuICBiYXJyZWw6IFwiYmFycmVsXCIsXG4gIGhhbmRndWFyZDogXCJoYW5kZ3VhcmRcIixcbiAgXCJjaGFyZ2luZy1oYW5kbGVcIjogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICBcImJ1ZmZlci1raXRcIjogXCJidWZmZXJcIixcbiAgXCJsb3dlci1wYXJ0cy1raXRcIjogXCJsb3dlclBhcnRzXCIsXG4gIHNpZ2h0OiBcInNpZ2h0c1wiLFxuICBcImxvd2VyLXJlY2VpdmVyXCI6IFwibG93ZXJcIixcbiAgb3B0aWM6IFwib3B0aWNcIixcbiAgc3RvY2s6IFwic3RvY2tcIixcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogXCJ0cmlnZ2VyXCIsXG4gIFwidHJpZ2dlci1raXRcIjogXCJ0cmlnZ2VyXCIsXG4gIFwicGlzdG9sLWdyaXBcIjogXCJncmlwXCIsXG4gIGdyaXA6IFwiZ3JpcFwiLFxuICBzYWZldHk6IFwic2FmZXR5XCIsXG4gIFwic2FmZXR5LXNlbGVjdG9yXCI6IFwic2FmZXR5XCIsXG4gIFwiY29tcGxldGUtbG93ZXJcIjogXCJjb21wbGV0ZUxvd2VyXCIsXG5cbiAgLy8gTkVXIFVQUEVSIFBBUlRTXG4gIFwiY29tcGxldGUtdXBwZXJcIjogXCJjb21wbGV0ZVVwcGVyXCIsXG4gIGJjZzogXCJiY2dcIixcbiAgXCJib2x0LWNhcnJpZXItZ3JvdXBcIjogXCJiY2dcIixcbiAgXCJnYXMtYmxvY2tcIjogXCJnYXNCbG9ja1wiLFxuICBcImdhcy10dWJlXCI6IFwiZ2FzVHViZVwiLFxuICBcIm11enpsZS1kZXZpY2VcIjogXCJtdXp6bGVEZXZpY2VcIixcbiAgY29tcGVuc2F0b3I6IFwibXV6emxlRGV2aWNlXCIsXG4gIGJyYWtlOiBcIm11enpsZURldmljZVwiLFxuICBzdXBwcmVzc29yOiBcInN1cHByZXNzb3JcIixcbn07XG5cbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+OyAvLyBjYXRlZ29yeUlkIC0+IHBhcnRJZFxuXG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG4vLyBHcm91cCBjYXRlZ29yaWVzIGludG8gbG9naWNhbCBzZWN0aW9ucy5cbi8vXG4vLyBJTVBPUlRBTlQ6XG4vLyBUaGVzZSBJRHMgbXVzdCBtYXRjaCB0aGUgaWRzIHlvdSBoYXZlIGluIENBVEVHT1JJRVMuXG4vLyBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3Qgd2lsbCBqdXN0IGJlIHNraXBwZWQuXG5jb25zdCBDQVRFR09SWV9HUk9VUFM6IHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNhdGVnb3J5SWRzOiBDYXRlZ29yeUlkW107XG59W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV2ZXJ5dGhpbmcgZnJvbSB0aGUgc2VyaWFsaXplZCBsb3dlciB0byBzbWFsbCBwYXJ0cywgZmlyZSBjb250cm9sLCBhbmQgY29yZSBjb250cm9scy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJsb3dlclwiLFxuICAgICAgXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgICBcImxvd2VyUGFydHNcIixcbiAgICAgIFwidHJpZ2dlclwiLFxuICAgICAgXCJncmlwXCIsXG4gICAgICBcInNhZmV0eVwiLFxuICAgICAgXCJidWZmZXJcIixcbiAgICAgIFwic3RvY2tcIixcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJVcHBlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCYXJyZWwsIHVwcGVyLCBnYXMgc3lzdGVtLCBhbmQgdGhlIHBhcnRzIHRoYXQga2VlcCB0aGUgcmlmbGUgY3ljbGluZy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJ1cHBlclwiLFxuICAgICAgXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgICBcImJjZ1wiLFxuICAgICAgXCJiYXJyZWxcIixcbiAgICAgIFwiZ2FzQmxvY2tcIixcbiAgICAgIFwiZ2FzVHViZVwiLFxuICAgICAgXCJtdXp6bGVEZXZpY2VcIixcbiAgICAgIFwic3VwcHJlc3NvclwiLFxuICAgICAgXCJoYW5kZ3VhcmRcIixcbiAgICAgIFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICAgIFwic2lnaHRzXCIsXG4gICAgICBcIm9wdGljXCIsXG4gICAgXSxcbiAgfSxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEd1bmJ1aWxkZXJQYWdlKCkge1xuICBjb25zdCBzZWFyY2hQYXJhbXMgPSB1c2VTZWFyY2hQYXJhbXMoKTtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0b3JlZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH0pO1xuICBjb25zdCBbbGF5b3V0TW9kZSwgc2V0TGF5b3V0TW9kZV0gPSB1c2VTdGF0ZTxcImNhcmRzXCIgfCBcImxpc3RcIj4oXCJjYXJkc1wiKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaFByb2R1Y3RzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlcj9wbGF0Zm9ybT1BUi0xNWAsXG4gICAgICAgICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGFcbiAgICAgICAgICAubWFwKChwKTogUGFydCB8IG51bGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZCA9IFBBUlRfUk9MRV9UT19DQVRFR09SWVtwLnBhcnRSb2xlXTtcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAvLyBTa2lwIGFueSBwYXJ0cyB3ZSBkb24ndCBrbm93IGhvdyB0byBtYXAgeWV0XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpZDogU3RyaW5nKHAuaWQpLCAvLyBBTFdBWVMgc3RyaW5nXG4gICAgICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIFBhcnQgPT4gcCAhPT0gbnVsbCk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaFByb2R1Y3RzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSGFuZGxlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgZm9yIHBhcnQgc2VsZWN0aW9uICg/c2VsZWN0PXVwcGVyOjE2NSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RQYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJzZWxlY3RcIik7XG4gICAgaWYgKHNlbGVjdFBhcmFtKSB7XG4gICAgICBjb25zdCBbY2F0ZWdvcnlJZCwgcGFydElkXSA9IHNlbGVjdFBhcmFtLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjYXRlZ29yeUlkICYmIHBhcnRJZCAmJiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpKSB7XG4gICAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBbY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZXIucmVwbGFjZShcIi9ndW5idWlsZGVyXCIsIHsgc2Nyb2xsOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzZWFyY2hQYXJhbXMsIHJvdXRlcl0pO1xuXG4gIC8vIFBlcnNpc3QgYnVpbGQgc3RhdGUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICBjb25zdCBwYXJ0c0J5Q2F0ZWdvcnk6IFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBlZCA9IHt9IGFzIFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+O1xuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgQ0FURUdPUklFUykge1xuICAgICAgZ3JvdXBlZFtjYXRlZ29yeS5pZF0gPSBwYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwKSA9PiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5LmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwZWQ7XG4gIH0sIFtwYXJ0c10pO1xuXG4gIGNvbnN0IHNlbGVjdGVkUGFydHM6IFBhcnRbXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZClcbiAgICAgIC5tYXAoKFtjYXRlZ29yeUlkLCBwYXJ0SWRdKSA9PlxuICAgICAgICBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBwYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeUlkKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgUGFydFtdO1xuICB9LCBbYnVpbGQsIHBhcnRzXSk7XG5cbiAgY29uc3QgdG90YWxQcmljZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gc2VsZWN0ZWRQYXJ0cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5wcmljZSwgMCksXG4gICAgW3NlbGVjdGVkUGFydHNdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gVXNlIGdyb3VwIG9yZGVyaW5nIGZvciB0aGUgc3VtbWFyeSBhcyB3ZWxsXG4gIGNvbnN0IHN1bW1hcnlDYXRlZ29yeU9yZGVyOiBDYXRlZ29yeUlkW10gPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBDQVRFR09SWV9HUk9VUFMuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLmNhdGVnb3J5SWRzKS5maWx0ZXIoXG4gICAgICAgIChpZCkgPT4gQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBpZCksXG4gICAgICApLFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYW1iZXItNTAwLzIwIGJnLWFtYmVyLTUwMC81XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBmbGV4IG1heC13LTZ4bCBmbGV4LWNvbCBnYXAtMSBweC00IHB5LTIgdGV4dC1bMC43NXJlbV0gdGV4dC1hbWJlci0xMDAgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJvdW5kZWQtc20gYmctYW1iZXItNTAwLzIwIHB4LTIgcHktMC41IHRleHQtWzAuNjVyZW1dIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE4ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIEVhcmx5IEFjY2VzcyBCZXRhXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gdGV4dC1hbWJlci0xMDAvOTAgbWQ6aW5saW5lXCI+XG4gICAgICAgICAgICAgIFlvdSZhcG9zO3JlIHVzaW5nIGFuIGVhcmx5LWFjY2VzcyBwcm90b3R5cGUgb2YgVGhlIEFybW9yeS4gRGF0YSxcbiAgICAgICAgICAgICAgcHJpY2luZywgYW5kIGF2YWlsYWJsZSBwYXJ0cyBhcmUgc3RpbGwgZXZvbHZpbmcuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0xMDAvOTAgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICBFYXJseS1hY2Nlc3MgcHJvdG90eXBlLiBEYXRhIGFuZCBwcmljaW5nIG1heSBjaGFuZ2UuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgVGhlIEFybW9yeTogPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5FYXJseSBBY2Nlc3M8L3NwYW4+XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgRXhwbG9yZSBjb21wb25lbnRzIGZyb20gdHJ1c3RlZCBicmFuZHMsIGNob29zZSBvbmUgcGFydCBwZXJcbiAgICAgICAgICAgICAgY2F0ZWdvcnksIHRyYWNrIGxpdmUgcHJpY2VzLCBhbmQgd2F0Y2ggeW91ciB0b3RhbCBidWlsZCBjb3N0XG4gICAgICAgICAgICAgIHVwZGF0ZSBhcyB5b3UgZ28uIFRoaXMgZWFybHktYWNjZXNzIGJ1aWxkZXIga2VlcHMgeW91ciBzZXR1cCBzYXZlZFxuICAgICAgICAgICAgICBsb2NhbGx5IHNvIHlvdSBjYW4gY29tZSBiYWNrIGFuZCByZWZpbmUgaXQgYW55dGltZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMyBtZDptdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMFwiPkN1cnJlbnQgYnVpbGQgdG90YWw8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICAke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RofSAvIHtDQVRFR09SSUVTLmxlbmd0aH0gY2F0ZWdvcmllcyBmaWxsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogTGF5b3V0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbGc6Z3JpZC1jb2xzLVszZnIsMS4yNWZyXVwiPlxuICAgICAgICAgIHsvKiBDYXRlZ29yaWVzL3BhcnRzICovfVxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTQgZmxleCBmbGV4LWNvbCBnYXAtMiBzbTpmbGV4LXJvdyBzbTppdGVtcy1jZW50ZXIgc206anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIENob29zZSBvbmUgcGFydCBwZXIgY2F0ZWdvcnkuIFN3aXRjaCBsYXlvdXRzIHRvIGJyb3dzZSBieSBjYXJkcyBvciBhIHRpZ2h0ZXIgbGlzdCB2aWV3LlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC83MCB0ZXh0LVswLjdyZW1dXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRMYXlvdXRNb2RlKFwiY2FyZHNcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0yLjUgcHktMSByb3VuZGVkLWwtbWQgYm9yZGVyLXIgYm9yZGVyLXppbmMtNzAwIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICAgIGxheW91dE1vZGUgPT09IFwiY2FyZHNcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy1hbWJlci01MDAvMjAgdGV4dC1hbWJlci0yMDBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOmJnLXppbmMtODAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIENhcmQgdmlld1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0TGF5b3V0TW9kZShcImxpc3RcIil9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BweC0yLjUgcHktMSByb3VuZGVkLXItbWQgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0TW9kZSA9PT0gXCJsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICA/IFwiYmctYW1iZXItNTAwLzIwIHRleHQtYW1iZXItMjAwXCJcbiAgICAgICAgICAgICAgICAgICAgICA6IFwidGV4dC16aW5jLTQwMCBob3ZlcjpiZy16aW5jLTgwMFwiXG4gICAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICBMaXN0IHZpZXdcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIHtsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTG9hZGluZyBwYXJ0cyBmcm9tIGJhY2tlbmTigKZcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtlcnJvciAmJiAhbG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwXCI+XG4gICAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nIGFuZCBDT1JTIGlzXG4gICAgICAgICAgICAgICAgY29uZmlndXJlZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuICAgICAgICAgICAgICAgIHtDQVRFR09SWV9HUk9VUFMubWFwKChncm91cCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDYXRlZ29yaWVzID0gQ0FURUdPUklFUy5maWx0ZXIoKGMpID0+XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmNhdGVnb3J5SWRzLmluY2x1ZGVzKGMuaWQgYXMgQ2F0ZWdvcnlJZCksXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2dyb3VwLmlkfSBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtYmFzZWxpbmUganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwIG10LTEgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIHtsYXlvdXRNb2RlID09PSBcImNhcmRzXCIgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTIgbWQ6cC0zIGJnLXppbmMtOTUwLzYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9e2NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cz17cGFydHNCeUNhdGVnb3J5W2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0SWQ9e2J1aWxkW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3RQYXJ0PXsocGFydElkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdFBhcnQoY2F0ZWdvcnkuaWQsIHBhcnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTIgbWQ6cC0zIGJnLXppbmMtOTUwLzYwIGZsZXggZmxleC1jb2wgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtc3RhcnQgbWQ6anVzdGlmeS1iZXR3ZWVuIGdhcC0zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9e2NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0cz17cGFydHNCeUNhdGVnb3J5W2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0SWQ9e2J1aWxkW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3RQYXJ0PXsocGFydElkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVNlbGVjdFBhcnQoY2F0ZWdvcnkuaWQsIHBhcnRJZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgICB7LyogQnVpbGQgU3VtbWFyeSAqL31cbiAgICAgICAgICA8YXNpZGUgY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTQgZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4xNmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTQwMCBtYi0zXCI+XG4gICAgICAgICAgICAgIEN1cnJlbnQgQnVpbGRcbiAgICAgICAgICAgIDwvaDI+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LXktYXV0byBwci0xXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMCAmJiAoXG4gICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICBTZWxlY3QgYSBwYXJ0IGZyb20gZWFjaCBjYXRlZ29yeSB0byBzdGFydCB5b3VyIGJ1aWxkLlxuICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAge3N1bW1hcnlDYXRlZ29yeU9yZGVyLm1hcCgoY2F0ZWdvcnlJZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgY2F0ID0gQ0FURUdPUklFUy5maW5kKChjKSA9PiBjLmlkID09PSBjYXRlZ29yeUlkKTtcbiAgICAgICAgICAgICAgICAgIGlmICghY2F0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRQYXJ0SWQgPSBidWlsZFtjYXQuaWRdO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGFydCA9IHBhcnRzLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIHAuaWQgPT09IHNlbGVjdGVkUGFydElkICYmIHAuY2F0ZWdvcnlJZCA9PT0gY2F0LmlkLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGxpIGtleT17Y2F0LmlkfT5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtWzAuN3JlbV0gdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjYXQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICB7cGFydCA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMSBmbGV4IGp1c3RpZnktYmV0d2VlbiBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0LmJyYW5kfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwIHdoaXRlc3BhY2Utbm93cmFwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJ0LnByaWNlLnRvRml4ZWQoMil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMSB0ZXh0LXhzIHRleHQtemluYy02MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgTm90IHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7LyogQ1RBICovfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGJvcmRlci10IGJvcmRlci16aW5jLTgwMCBwdC0zIHNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICAgIGhyZWY9XCIvZ3VuYnVpbGRlci9idWlsZFwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgYmxvY2sgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci1hbWJlci00MDAvNjAgYmctYW1iZXItNDAwLzEwIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtYW1iZXItMjAwIGhvdmVyOmJnLWFtYmVyLTQwMC8xNSB0ZXh0LWNlbnRlciB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkIHBvaW50ZXItZXZlbnRzLW5vbmVcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEJ1aWxkIFN1bW1hcnlcbiAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2V0QnVpbGQoe30pO1xuICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gXCJvcGFjaXR5LTQwIGN1cnNvci1ub3QtYWxsb3dlZFwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQ2xlYXIgQnVpbGRcbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cIm10LTIgdGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgVmlldyB5b3VyIGJ1aWxkIGJyZWFrZG93biBhbmQgc2hhcmUgaXQgd2l0aCBvdGhlcnMuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvYXNpZGU+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIHsvKiBXaGF0J3MgTmV3ICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIE5ldyBpbiBFYXJseSBBY2Nlc3NcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC0yIHNwYWNlLXktMSB0ZXh0LXNtIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgIDxsaT7igKIgTGl2ZSBwYXJ0cyBhbmQgcHJpY2luZyBwdWxsZWQgZnJvbSBtdWx0aXBsZSBtZXJjaGFudHMuPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIEdyb3VwZWQgbGF5b3V0IGZvciBsb3dlciBhbmQgdXBwZXIgcmVjZWl2ZXIgcGFydHMgc28geW91IGNhbiBzZWVcbiAgICAgICAgICAgICAgYXQgYSBnbGFuY2Ugd2hpY2ggc2VjdGlvbnMgb2YgeW91ciBidWlsZCBhcmUgc3RpbGwgbWlzc2luZy5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBSdW5uaW5nIGJ1aWxkIHRvdGFsIHRoYXQgdXBkYXRlcyBhdXRvbWF0aWNhbGx5IGFzIHlvdSBhZGQgb3JcbiAgICAgICAgICAgICAgc3dhcCBjb21wb25lbnRzLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIExvY2FsIGJ1aWxkIHBlcnNpc3RlbmNlIHNvIHlvdXIgc2VsZWN0aW9ucyBzdGljayBhcm91bmQgYmV0d2VlblxuICAgICAgICAgICAgICB2aXNpdHMgb24gdGhpcyBkZXZpY2UuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICB7LyogUm9hZG1hcCAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibXQtOCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICBXaGF0JmFwb3M7cyBvbiBvdXIgcm9hZG1hcFxuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBQbGF0Zm9ybSBmaWx0ZXJzIChBUi0xNSwgQVItOSwgQVItMTApPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgTW9yZSBwYXJ0IGNhdGVnb3JpZXMgYW5kIGZ1cm5pdHVyZTwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFJpY2hlciBwcmljaW5nL3N0b2NrIHN5bmM8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBTbWFydGVyIGNvbXBhdGliaWxpdHkgY2hlY2tzIGJldHdlZW4gY29tcG9uZW50czwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIEFSOS9BUjEwIHN1cHBvcnQgYW5kIG1vcmU8L2xpPlxuICAgICAgICAgIDwvdWw+XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlTWVtbyIsInVzZVN0YXRlIiwidXNlRWZmZWN0IiwiTGluayIsInVzZVNlYXJjaFBhcmFtcyIsInVzZVJvdXRlciIsIkNBVEVHT1JJRVMiLCJDYXRlZ29yeUNvbHVtbiIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJiYXJyZWwiLCJoYW5kZ3VhcmQiLCJzaWdodCIsIm9wdGljIiwic3RvY2siLCJ0cmlnZ2VyIiwiZ3JpcCIsInNhZmV0eSIsImJjZyIsImNvbXBlbnNhdG9yIiwiYnJha2UiLCJzdXBwcmVzc29yIiwiU1RPUkFHRV9LRVkiLCJDQVRFR09SWV9HUk9VUFMiLCJpZCIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJjYXRlZ29yeUlkcyIsIkd1bmJ1aWxkZXJQYWdlIiwic2VhcmNoUGFyYW1zIiwicm91dGVyIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwibGF5b3V0TW9kZSIsInNldExheW91dE1vZGUiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hQcm9kdWN0cyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJjYXRlZ29yeUlkIiwicGFydFJvbGUiLCJTdHJpbmciLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwidXJsIiwiYnV5VXJsIiwibm90ZXMiLCJmaWx0ZXIiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZWxlY3RQYXJhbSIsImdldCIsInBhcnRJZCIsInNwbGl0Iiwic29tZSIsImMiLCJwcmV2IiwidXBkYXRlZCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJyZXBsYWNlIiwic2Nyb2xsIiwicGFydHNCeUNhdGVnb3J5IiwiZ3JvdXBlZCIsImNhdGVnb3J5Iiwic2VsZWN0ZWRQYXJ0cyIsIk9iamVjdCIsImVudHJpZXMiLCJmaW5kIiwiQm9vbGVhbiIsInRvdGFsUHJpY2UiLCJyZWR1Y2UiLCJzdW0iLCJoYW5kbGVTZWxlY3RQYXJ0Iiwic3VtbWFyeUNhdGVnb3J5T3JkZXIiLCJmbGF0TWFwIiwiZ3JvdXAiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2Iiwic3BhbiIsImhlYWRlciIsImgxIiwidG9GaXhlZCIsImxlbmd0aCIsInNlY3Rpb24iLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsImdyb3VwQ2F0ZWdvcmllcyIsImluY2x1ZGVzIiwiaDIiLCJzZWxlY3RlZFBhcnRJZCIsIm9uU2VsZWN0UGFydCIsImFzaWRlIiwidWwiLCJjYXQiLCJwYXJ0IiwibGkiLCJocmVmIiwicmVtb3ZlSXRlbSIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.91342a80eaa2cbe0.hot-update.js b/.next/static/webpack/app/gunbuilder/page.91342a80eaa2cbe0.hot-update.js new file mode 100644 index 0000000..950289d --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.91342a80eaa2cbe0.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.9536828ef4709968.hot-update.js b/.next/static/webpack/app/gunbuilder/page.9536828ef4709968.hot-update.js new file mode 100644 index 0000000..7f6e0cb --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.9536828ef4709968.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./components/CategoryColumn.tsx": +/*!***************************************!*\ + !*** ./components/CategoryColumn.tsx ***! + \***************************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CategoryColumn: function() { return /* binding */ CategoryColumn; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var _components_PartCard__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @/components/PartCard */ \"(app-pages-browser)/./components/PartCard.tsx\");\n/* __next_internal_client_entry_do_not_use__ CategoryColumn auto */ \n\n\nfunction CategoryColumn(param) {\n let { category, parts, selectedPartId, onSelectPart } = param;\n // Show selected part if available, otherwise show placeholder\n const displayedPart = selectedPartId ? parts.find((p)=>p.id === selectedPartId) : null;\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex flex-col h-full\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.15em] text-zinc-400 uppercase\",\n children: category.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 28,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 27,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n parts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"No parts available yet.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 34,\n columnNumber: 11\n }, this),\n !displayedPart && parts.length > 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"w-full border border-zinc-700 rounded-md p-3 mb-2 flex items-center justify-between gap-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"No part selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 38,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"inline-flex items-center gap-2 rounded-md border border-zinc-700 bg-zinc-900/60 px-3 py-1.5 text-xs font-medium text-zinc-200 hover:bg-zinc-800 hover:border-zinc-500 transition-colors\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"svg\", {\n className: \"w-4 h-4\",\n fill: \"none\",\n stroke: \"currentColor\",\n viewBox: \"0 0 24 24\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"path\", {\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 2,\n d: \"M12 4v16m8-8H4\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 49,\n columnNumber: 17\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 43,\n columnNumber: 15\n }, this),\n \"Choose a Part\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 39,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 37,\n columnNumber: 11\n }, this),\n displayedPart && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_PartCard__WEBPACK_IMPORTED_MODULE_2__.PartCard, {\n part: displayedPart,\n selected: displayedPart.id === selectedPartId,\n onSelect: ()=>onSelectPart(displayedPart.id)\n }, displayedPart.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 61,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 32,\n columnNumber: 7\n }, this),\n parts.length >= 1 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_1__[\"default\"], {\n href: \"/gunbuilder/\".concat(category.id),\n className: \"mt-2 w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-xs font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors text-center\",\n children: [\n \"View All (\",\n parts.length,\n \")\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 70,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx\",\n lineNumber: 26,\n columnNumber: 5\n }, this);\n}\n_c = CategoryColumn;\nvar _c;\n$RefreshReg$(_c, \"CategoryColumn\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW4udHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBRTZCO0FBRW9CO0FBUzFDLFNBQVNFLGVBQWUsS0FLVDtRQUxTLEVBQzdCQyxRQUFRLEVBQ1JDLEtBQUssRUFDTEMsY0FBYyxFQUNkQyxZQUFZLEVBQ1EsR0FMUztJQU03Qiw4REFBOEQ7SUFDOUQsTUFBTUMsZ0JBQWdCRixpQkFDbEJELE1BQU1JLElBQUksQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxFQUFFLEtBQUtMLGtCQUMzQjtJQUVKLHFCQUNFLDhEQUFDTTtRQUFJQyxXQUFVOzswQkFDYiw4REFBQ0Q7Z0JBQUlDLFdBQVU7MEJBQ2IsNEVBQUNDO29CQUFHRCxXQUFVOzhCQUNYVCxTQUFTVyxJQUFJOzs7Ozs7Ozs7OzswQkFHbEIsOERBQUNIO2dCQUFJQyxXQUFVOztvQkFDWlIsTUFBTVcsTUFBTSxLQUFLLG1CQUNoQiw4REFBQ047d0JBQUVHLFdBQVU7a0NBQXdCOzs7Ozs7b0JBRXRDLENBQUNMLGlCQUFpQkgsTUFBTVcsTUFBTSxHQUFHLG1CQUNoQyw4REFBQ0o7d0JBQUlDLFdBQVU7OzBDQUNiLDhEQUFDSDtnQ0FBRUcsV0FBVTswQ0FBd0I7Ozs7OzswQ0FDckMsOERBQUNaLGlEQUFJQTtnQ0FDSGdCLE1BQU0sZUFBMkIsT0FBWmIsU0FBU08sRUFBRTtnQ0FDaENFLFdBQVU7O2tEQUVWLDhEQUFDSzt3Q0FDQ0wsV0FBVTt3Q0FDVk0sTUFBSzt3Q0FDTEMsUUFBTzt3Q0FDUEMsU0FBUTtrREFFUiw0RUFBQ0M7NENBQ0NDLGVBQWM7NENBQ2RDLGdCQUFlOzRDQUNmQyxhQUFhOzRDQUNiQyxHQUFFOzs7Ozs7Ozs7OztvQ0FFQTs7Ozs7Ozs7Ozs7OztvQkFLWGxCLCtCQUNDLDhEQUFDTiwwREFBUUE7d0JBRVB5QixNQUFNbkI7d0JBQ05vQixVQUFVcEIsY0FBY0csRUFBRSxLQUFLTDt3QkFDL0J1QixVQUFVLElBQU10QixhQUFhQyxjQUFjRyxFQUFFO3VCQUh4Q0gsY0FBY0csRUFBRTs7Ozs7Ozs7Ozs7WUFPMUJOLE1BQU1XLE1BQU0sSUFBSSxtQkFDZiw4REFBQ2YsaURBQUlBO2dCQUNIZ0IsTUFBTSxlQUEyQixPQUFaYixTQUFTTyxFQUFFO2dCQUNoQ0UsV0FBVTs7b0JBQ1g7b0JBQ1lSLE1BQU1XLE1BQU07b0JBQUM7Ozs7Ozs7Ozs7Ozs7QUFLbEM7S0FqRWdCYiIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9jb21wb25lbnRzL0NhdGVnb3J5Q29sdW1uLnRzeD85YzE4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgTGluayBmcm9tIFwibmV4dC9saW5rXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuaW1wb3J0IHsgUGFydENhcmQgfSBmcm9tIFwiQC9jb21wb25lbnRzL1BhcnRDYXJkXCI7XG5cbmludGVyZmFjZSBDYXRlZ29yeUNvbHVtblByb3BzIHtcbiAgY2F0ZWdvcnk6IENhdGVnb3J5O1xuICBwYXJ0czogUGFydFtdO1xuICBzZWxlY3RlZFBhcnRJZD86IHN0cmluZztcbiAgb25TZWxlY3RQYXJ0OiAocGFydElkOiBzdHJpbmcpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYXRlZ29yeUNvbHVtbih7XG4gIGNhdGVnb3J5LFxuICBwYXJ0cyxcbiAgc2VsZWN0ZWRQYXJ0SWQsXG4gIG9uU2VsZWN0UGFydCxcbn06IENhdGVnb3J5Q29sdW1uUHJvcHMpIHtcbiAgLy8gU2hvdyBzZWxlY3RlZCBwYXJ0IGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIHNob3cgcGxhY2Vob2xkZXJcbiAgY29uc3QgZGlzcGxheWVkUGFydCA9IHNlbGVjdGVkUGFydElkXG4gICAgPyBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBzZWxlY3RlZFBhcnRJZClcbiAgICA6IG51bGw7XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaC1mdWxsXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTNcIj5cbiAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4xNWVtXSB0ZXh0LXppbmMtNDAwIHVwcGVyY2FzZVwiPlxuICAgICAgICAgIHtjYXRlZ29yeS5uYW1lfVxuICAgICAgICA8L2gyPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICB7cGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5ObyBwYXJ0cyBhdmFpbGFibGUgeWV0LjwvcD5cbiAgICAgICAgKX1cbiAgICAgICAgeyFkaXNwbGF5ZWRQYXJ0ICYmIHBhcnRzLmxlbmd0aCA+IDAgJiYgKFxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidy1mdWxsIGJvcmRlciBib3JkZXItemluYy03MDAgcm91bmRlZC1tZCBwLTMgbWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPk5vIHBhcnQgc2VsZWN0ZWQ8L3A+XG4gICAgICAgICAgICA8TGlua1xuICAgICAgICAgICAgICBocmVmPXtgL2d1bmJ1aWxkZXIvJHtjYXRlZ29yeS5pZH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzYwIHB4LTMgcHktMS41IHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTIwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy01MDAgdHJhbnNpdGlvbi1jb2xvcnNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidy00IGgtNFwiXG4gICAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIlxuICAgICAgICAgICAgICAgIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiXG4gICAgICAgICAgICAgICAgdmlld0JveD1cIjAgMCAyNCAyNFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cGF0aFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlTGluZWNhcD1cInJvdW5kXCJcbiAgICAgICAgICAgICAgICAgIHN0cm9rZUxpbmVqb2luPVwicm91bmRcIlxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg9ezJ9XG4gICAgICAgICAgICAgICAgICBkPVwiTTEyIDR2MTZtOC04SDRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvc3ZnPlxuICAgICAgICAgICAgICBDaG9vc2UgYSBQYXJ0XG4gICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICl9XG4gICAgICAgIHtkaXNwbGF5ZWRQYXJ0ICYmIChcbiAgICAgICAgICA8UGFydENhcmRcbiAgICAgICAgICAgIGtleT17ZGlzcGxheWVkUGFydC5pZH1cbiAgICAgICAgICAgIHBhcnQ9e2Rpc3BsYXllZFBhcnR9XG4gICAgICAgICAgICBzZWxlY3RlZD17ZGlzcGxheWVkUGFydC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWR9XG4gICAgICAgICAgICBvblNlbGVjdD17KCkgPT4gb25TZWxlY3RQYXJ0KGRpc3BsYXllZFBhcnQuaWQpfVxuICAgICAgICAgIC8+XG4gICAgICAgICl9XG4gICAgICA8L2Rpdj5cbiAgICAgIHtwYXJ0cy5sZW5ndGggPj0gMSAmJiAoXG4gICAgICAgIDxMaW5rXG4gICAgICAgICAgaHJlZj17YC9ndW5idWlsZGVyLyR7Y2F0ZWdvcnkuaWR9YH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJtdC0yIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAvNTAgcHgtMyBweS0yIHRleHQteHMgZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMCBob3ZlcjpiZy16aW5jLTgwMCBob3Zlcjpib3JkZXItemluYy02MDAgdHJhbnNpdGlvbi1jb2xvcnMgdGV4dC1jZW50ZXJcIlxuICAgICAgICA+XG4gICAgICAgICAgVmlldyBBbGwgKHtwYXJ0cy5sZW5ndGh9KVxuICAgICAgICA8L0xpbms+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApO1xufVxuIl0sIm5hbWVzIjpbIkxpbmsiLCJQYXJ0Q2FyZCIsIkNhdGVnb3J5Q29sdW1uIiwiY2F0ZWdvcnkiLCJwYXJ0cyIsInNlbGVjdGVkUGFydElkIiwib25TZWxlY3RQYXJ0IiwiZGlzcGxheWVkUGFydCIsImZpbmQiLCJwIiwiaWQiLCJkaXYiLCJjbGFzc05hbWUiLCJoMiIsIm5hbWUiLCJsZW5ndGgiLCJocmVmIiwic3ZnIiwiZmlsbCIsInN0cm9rZSIsInZpZXdCb3giLCJwYXRoIiwic3Ryb2tlTGluZWNhcCIsInN0cm9rZUxpbmVqb2luIiwic3Ryb2tlV2lkdGgiLCJkIiwicGFydCIsInNlbGVjdGVkIiwib25TZWxlY3QiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(app-pages-browser)/./components/CategoryColumn.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.a6f46b17097acafc.hot-update.js b/.next/static/webpack/app/gunbuilder/page.a6f46b17097acafc.hot-update.js new file mode 100644 index 0000000..417be81 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.a6f46b17097acafc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\n// Example – extend CATEGORIES\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsOEJBQThCO0FBQ3ZCLE1BQU1BLGFBQXVFO0lBQ2xGLFFBQVE7SUFDUjtRQUNFQyxJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUVBLFFBQVE7SUFDUjtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7Q0FDRCxDQUFDO0FBRUssTUFBTUMsUUFBZ0I7SUFDM0I7UUFDRUgsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7UUFDZEMsT0FBTztJQUNUO0lBQ0E7UUFDRVIsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7Q0FDRCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzPzczYWUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeSwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcblxuLy8gRXhhbXBsZSDigJMgZXh0ZW5kIENBVEVHT1JJRVNcbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiB7IGlkOiBDYXRlZ29yeUlkOyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nIH1bXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.c0c69fec5ef092df.hot-update.js b/.next/static/webpack/app/gunbuilder/page.c0c69fec5ef092df.hot-update.js new file mode 100644 index 0000000..e883e4d --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.c0c69fec5ef092df.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx": +/*!*********************************!*\ + !*** ./app/gunbuilder/page.tsx ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 238,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 241,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 237,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 246,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 236,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 235,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 255,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 261,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 254,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 271,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 269,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 253,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 285,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 290,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 310,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 314,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 309,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 327,\n columnNumber: 29\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 323,\n columnNumber: 27\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 321,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 307,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 296,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 283,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 347,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 353,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 371,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 377,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 376,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 382,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 375,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 387,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 370,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 358,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 351,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 399,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 409,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 426,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 398,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 346,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 281,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 435,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 439,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 440,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 444,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 448,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 438,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 434,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 457,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 461,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 462,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 463,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 464,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 465,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 460,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 456,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 251,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 234,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Svlr/SlMEdeu/xZZnR5gKrepPAg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFUztJQWMzRFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU1JLHdCQUFvRDtJQUN4RCxrQkFBa0I7SUFDbEJDLFFBQVE7SUFDUkMsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CQyxPQUFPO0lBQ1Asa0JBQWtCO0lBQ2xCQyxPQUFPO0lBQ1BDLE9BQU87QUFDVDtBQUlBLE1BQU1DLGNBQWM7QUFFcEIsMENBQTBDO0FBQzFDLEVBQUU7QUFDRixhQUFhO0FBQ2IsdURBQXVEO0FBQ3ZELG9EQUFvRDtBQUNwRCxNQUFNQyxrQkFLQTtJQUNKO1FBQ0VDLElBQUk7UUFDSkMsT0FBTztRQUNQQyxhQUNFO1FBQ0ZDLGFBQWE7WUFDWDtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1NBQ0Q7SUFDSDtJQUNBO1FBQ0VILElBQUk7UUFDSkMsT0FBTztRQUNQQyxhQUNFO1FBQ0ZDLGFBQWE7WUFDWDtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0NBQ0Q7QUFFYyxTQUFTQzs7SUFDdEIsTUFBTUMsZUFBZXJCLGdFQUFlQTtJQUNwQyxNQUFNc0IsU0FBU3JCLDBEQUFTQTtJQUN4QixNQUFNLENBQUNzQixPQUFPQyxTQUFTLEdBQUczQiwrQ0FBUUEsQ0FBUyxFQUFFO0lBQzdDLE1BQU0sQ0FBQzRCLFNBQVNDLFdBQVcsR0FBRzdCLCtDQUFRQSxDQUFDO0lBQ3ZDLE1BQU0sQ0FBQzhCLE9BQU9DLFNBQVMsR0FBRy9CLCtDQUFRQSxDQUFnQjtJQUNsRCxNQUFNLENBQUNnQyxPQUFPQyxTQUFTLEdBQUdqQywrQ0FBUUEsQ0FBYTtRQUM3QyxJQUFJLElBQTZCLEVBQUU7WUFDakMsTUFBTWtDLFNBQVNDLGFBQWFDLE9BQU8sQ0FBQ25CO1lBQ3BDLElBQUlpQixRQUFRO2dCQUNWLElBQUk7b0JBQ0YsT0FBT0csS0FBS0MsS0FBSyxDQUFDSjtnQkFDcEIsRUFBRSxVQUFNO29CQUNOLE9BQU8sQ0FBQztnQkFDVjtZQUNGO1FBQ0Y7UUFDQSxPQUFPLENBQUM7SUFDVjtJQUVBakMsZ0RBQVNBLENBQUM7UUFDUixNQUFNc0MsYUFBYSxJQUFJQztRQUV2QixlQUFlQztZQUNiLElBQUk7Z0JBQ0ZaLFdBQVc7Z0JBQ1hFLFNBQVM7Z0JBRVQsTUFBTVcsTUFBTSxNQUFNQyxNQUNoQixHQUFnQixPQUFibkMsY0FBYSw0Q0FDaEI7b0JBQUVvQyxRQUFRTCxXQUFXSyxNQUFNO2dCQUFDO2dCQUc5QixJQUFJLENBQUNGLElBQUlHLEVBQUUsRUFBRTtvQkFDWCxNQUFNLElBQUlDLE1BQU0sNEJBQXVDLE9BQVhKLElBQUlLLE1BQU0sRUFBQztnQkFDekQ7Z0JBRUEsTUFBTUMsT0FBbUMsTUFBTU4sSUFBSU8sSUFBSTtnQkFFdkQsTUFBTUMsYUFBcUJGLEtBQ3hCRyxHQUFHLENBQUMsQ0FBQ0M7b0JBQ0osTUFBTUMsYUFBYTFDLHFCQUFxQixDQUFDeUMsRUFBRUUsUUFBUSxDQUFDO29CQUNwRCxJQUFJLENBQUNELFlBQVk7d0JBQ2YsOENBQThDO3dCQUM5QyxPQUFPO29CQUNUO3dCQU9TRCxVQUNHQSxpQkFDTEE7b0JBUFAsT0FBTzt3QkFDTGpDLElBQUlvQyxPQUFPSCxFQUFFakMsRUFBRTt3QkFDZmtDO3dCQUNBRyxNQUFNSixFQUFFSSxJQUFJO3dCQUNaQyxPQUFPTCxFQUFFSyxLQUFLO3dCQUNkQyxPQUFPTixDQUFBQSxXQUFBQSxFQUFFTSxLQUFLLGNBQVBOLHNCQUFBQSxXQUFXO3dCQUNsQk8sVUFBVVAsQ0FBQUEsa0JBQUFBLEVBQUVRLFlBQVksY0FBZFIsNkJBQUFBLGtCQUFrQlM7d0JBQzVCQyxLQUFLVixDQUFBQSxZQUFBQSxFQUFFVyxNQUFNLGNBQVJYLHVCQUFBQSxZQUFZUzt3QkFDakJHLE9BQU9IO29CQUNUO2dCQUNGLEdBQ0NJLE1BQU0sQ0FBQyxDQUFDYixJQUFpQkEsTUFBTTtnQkFFbEN6QixTQUFTdUI7WUFDWCxFQUFFLE9BQU9nQixLQUFVO2dCQUNqQixJQUFJQSxJQUFJVixJQUFJLEtBQUssY0FBYztvQkFDdEJVO2dCQUFUbkMsU0FBU21DLENBQUFBLGVBQUFBLElBQUlDLE9BQU8sY0FBWEQsMEJBQUFBLGVBQWU7WUFDMUIsU0FBVTtnQkFDUnJDLFdBQVc7WUFDYjtRQUNGO1FBRUFZO1FBRUEsT0FBTyxJQUFNRixXQUFXNkIsS0FBSztJQUMvQixHQUFHLEVBQUU7SUFFTCxvRUFBb0U7SUFDcEVuRSxnREFBU0EsQ0FBQztRQUNSLE1BQU1vRSxjQUFjN0MsYUFBYThDLEdBQUcsQ0FBQztRQUNyQyxJQUFJRCxhQUFhO1lBQ2YsTUFBTSxDQUFDaEIsWUFBWWtCLE9BQU8sR0FBR0YsWUFBWUcsS0FBSyxDQUFDO1lBQy9DLElBQUluQixjQUFja0IsVUFBVWxFLDZEQUFVQSxDQUFDb0UsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUV2RCxFQUFFLEtBQUtrQyxhQUFhO2dCQUN2RXBCLFNBQVMsQ0FBQzBDO29CQUNSLE1BQU1DLFVBQVU7d0JBQ2QsR0FBR0QsSUFBSTt3QkFDUCxDQUFDdEIsV0FBeUIsRUFBRWtCO29CQUM5QjtvQkFDQSxJQUFJLElBQTZCLEVBQUU7d0JBQ2pDcEMsYUFBYTBDLE9BQU8sQ0FBQzVELGFBQWFvQixLQUFLeUMsU0FBUyxDQUFDRjtvQkFDbkQ7b0JBQ0EsT0FBT0E7Z0JBQ1Q7Z0JBRUFuRCxPQUFPc0QsT0FBTyxDQUFDLGVBQWU7b0JBQUVDLFFBQVE7Z0JBQU07WUFDaEQ7UUFDRjtJQUNGLEdBQUc7UUFBQ3hEO1FBQWNDO0tBQU87SUFFekIsMERBQTBEO0lBQzFEeEIsZ0RBQVNBLENBQUM7UUFDUixJQUFJLElBQTZCLEVBQUU7WUFDakNrQyxhQUFhMEMsT0FBTyxDQUFDNUQsYUFBYW9CLEtBQUt5QyxTQUFTLENBQUM5QztRQUNuRDtJQUNGLEdBQUc7UUFBQ0E7S0FBTTtJQUVWLE1BQU1pRCxrQkFBOENsRiw4Q0FBT0EsQ0FBQztRQUMxRCxNQUFNbUYsVUFBVSxDQUFDO1FBQ2pCLEtBQUssTUFBTUMsWUFBWTlFLDZEQUFVQSxDQUFFO1lBQ2pDNkUsT0FBTyxDQUFDQyxTQUFTaEUsRUFBRSxDQUFDLEdBQUdPLE1BQU11QyxNQUFNLENBQ2pDLENBQUNiLElBQU1BLEVBQUVDLFVBQVUsS0FBSzhCLFNBQVNoRSxFQUFFO1FBRXZDO1FBQ0EsT0FBTytEO0lBQ1QsR0FBRztRQUFDeEQ7S0FBTTtJQUVWLE1BQU0wRCxnQkFBd0JyRiw4Q0FBT0EsQ0FBQztRQUNwQyxPQUFPc0YsT0FBT0MsT0FBTyxDQUFDdEQsT0FDbkJtQixHQUFHLENBQUM7Z0JBQUMsQ0FBQ0UsWUFBWWtCLE9BQU87bUJBQ3hCN0MsTUFBTTZELElBQUksQ0FBQyxDQUFDbkMsSUFBTUEsRUFBRWpDLEVBQUUsS0FBS29ELFVBQVVuQixFQUFFQyxVQUFVLEtBQUtBO1dBRXZEWSxNQUFNLENBQUN1QjtJQUNaLEdBQUc7UUFBQ3hEO1FBQU9OO0tBQU07SUFFakIsTUFBTStELGFBQWExRiw4Q0FBT0EsQ0FDeEIsSUFBTXFGLGNBQWNNLE1BQU0sQ0FBQyxDQUFDQyxLQUFLdkMsSUFBTXVDLE1BQU12QyxFQUFFTSxLQUFLLEVBQUUsSUFDdEQ7UUFBQzBCO0tBQWM7SUFHakIsTUFBTVEsbUJBQW1CLENBQUN2QyxZQUF3QmtCO1FBQ2hEdEMsU0FBUyxDQUFDMEMsT0FBVTtnQkFDbEIsR0FBR0EsSUFBSTtnQkFDUCxDQUFDdEIsV0FBVyxFQUFFa0I7WUFDaEI7SUFDRjtJQUVBLDZDQUE2QztJQUM3QyxNQUFNc0IsdUJBQXFDOUYsOENBQU9BLENBQ2hELElBQ0VtQixnQkFBZ0I0RSxPQUFPLENBQUMsQ0FBQ0MsUUFBVUEsTUFBTXpFLFdBQVcsRUFBRTJDLE1BQU0sQ0FDMUQsQ0FBQzlDLEtBQU9kLDZEQUFVQSxDQUFDb0UsSUFBSSxDQUFDLENBQUNDLElBQU1BLEVBQUV2RCxFQUFFLEtBQUtBLE1BRTVDLEVBQUU7SUFHSixxQkFDRSw4REFBQzZFO1FBQUtDLFdBQVU7OzBCQUNkLDhEQUFDQztnQkFBSUQsV0FBVTswQkFDYiw0RUFBQ0M7b0JBQUlELFdBQVU7O3NDQUNiLDhEQUFDQzs0QkFBSUQsV0FBVTs7OENBQ2IsOERBQUNFO29DQUFLRixXQUFVOzhDQUFpSDs7Ozs7OzhDQUdqSSw4REFBQ0U7b0NBQUtGLFdBQVU7OENBQXFDOzs7Ozs7Ozs7Ozs7c0NBS3ZELDhEQUFDRTs0QkFBS0YsV0FBVTtzQ0FBOEI7Ozs7Ozs7Ozs7Ozs7Ozs7OzBCQUtsRCw4REFBQ0M7Z0JBQUlELFdBQVU7O2tDQUViLDhEQUFDRzt3QkFBT0gsV0FBVTs7MENBQ2hCLDhEQUFDQzs7a0RBQ0MsOERBQUM5Qzt3Q0FBRTZDLFdBQVU7a0RBQWlFOzs7Ozs7a0RBRzlFLDhEQUFDSTt3Q0FBR0osV0FBVTs7NENBQXlEOzBEQUN6RCw4REFBQ0U7Z0RBQUtGLFdBQVU7MERBQWlCOzs7Ozs7Ozs7Ozs7a0RBRS9DLDhEQUFDN0M7d0NBQUU2QyxXQUFVO2tEQUFzQzs7Ozs7Ozs7Ozs7OzBDQVFyRCw4REFBQ0M7Z0NBQUlELFdBQVU7O2tEQUNiLDhEQUFDQzt3Q0FBSUQsV0FBVTtrREFBd0I7Ozs7OztrREFDdkMsOERBQUNDO3dDQUFJRCxXQUFVOzs0Q0FBd0M7NENBQ25EUixXQUFXYSxPQUFPLENBQUM7Ozs7Ozs7a0RBRXZCLDhEQUFDSjt3Q0FBSUQsV0FBVTs7NENBQ1piLGNBQWNtQixNQUFNOzRDQUFDOzRDQUFJbEcsNkRBQVVBLENBQUNrRyxNQUFNOzRDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O2tDQU1sRCw4REFBQ0w7d0JBQUlELFdBQVU7OzBDQUViLDhEQUFDTztnQ0FBUVAsV0FBVTs7b0NBQ2hCckUseUJBQ0MsOERBQUN3Qjt3Q0FBRTZDLFdBQVU7a0RBQXdCOzs7Ozs7b0NBSXRDbkUsU0FBUyxDQUFDRix5QkFDVCw4REFBQ3dCO3dDQUFFNkMsV0FBVTs7NENBQ1ZuRTs0Q0FBTTs7Ozs7OztvQ0FJVixDQUFDRixXQUFXLENBQUNFLHVCQUNaLDhEQUFDb0U7d0NBQUlELFdBQVU7a0RBQ1ovRSxnQkFBZ0JpQyxHQUFHLENBQUMsQ0FBQzRDOzRDQUNwQixNQUFNVSxrQkFBa0JwRyw2REFBVUEsQ0FBQzRELE1BQU0sQ0FBQyxDQUFDUyxJQUN6Q3FCLE1BQU16RSxXQUFXLENBQUNvRixRQUFRLENBQUNoQyxFQUFFdkQsRUFBRTs0Q0FHakMsSUFBSXNGLGdCQUFnQkYsTUFBTSxLQUFLLEdBQUc7Z0RBQ2hDLE9BQU87NENBQ1Q7NENBRUEscUJBQ0UsOERBQUNMO2dEQUFtQkQsV0FBVTs7a0VBQzVCLDhEQUFDQzt3REFBSUQsV0FBVTtrRUFDYiw0RUFBQ0M7OzhFQUNDLDhEQUFDUztvRUFBR1YsV0FBVTs4RUFDWEYsTUFBTTNFLEtBQUs7Ozs7OztnRUFFYjJFLE1BQU0xRSxXQUFXLGtCQUNoQiw4REFBQytCO29FQUFFNkMsV0FBVTs4RUFDVkYsTUFBTTFFLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7O2tFQU0xQiw4REFBQzZFO3dEQUFJRCxXQUFVO2tFQUNaUSxnQkFBZ0J0RCxHQUFHLENBQUMsQ0FBQ2dDLHlCQUNwQiw4REFBQ2U7Z0VBRUNELFdBQVU7MEVBRVYsNEVBQUMzRixzRUFBY0E7b0VBQ2I2RSxVQUFVQTtvRUFDVnpELE9BQU91RCxlQUFlLENBQUNFLFNBQVNoRSxFQUFFLENBQUM7b0VBQ25DeUYsZ0JBQWdCNUUsS0FBSyxDQUFDbUQsU0FBU2hFLEVBQUUsQ0FBQztvRUFDbEMwRixjQUFjLENBQUN0QyxTQUNicUIsaUJBQWlCVCxTQUFTaEUsRUFBRSxFQUFFb0Q7Ozs7OzsrREFSN0JZLFNBQVNoRSxFQUFFOzs7Ozs7Ozs7OzsrQ0FqQmQ0RSxNQUFNNUUsRUFBRTs7Ozs7d0NBaUN0Qjs7Ozs7Ozs7Ozs7OzBDQU1OLDhEQUFDMkY7Z0NBQU1iLFdBQVU7O2tEQUNmLDhEQUFDVTt3Q0FBR1YsV0FBVTtrREFBdUU7Ozs7OztrREFJckYsOERBQUNDO3dDQUFJRCxXQUFVOzs0Q0FDWmIsY0FBY21CLE1BQU0sS0FBSyxtQkFDeEIsOERBQUNuRDtnREFBRTZDLFdBQVU7MERBQXdCOzs7Ozs7MERBS3ZDLDhEQUFDYztnREFBR2QsV0FBVTswREFDWEoscUJBQXFCMUMsR0FBRyxDQUFDLENBQUNFO29EQUN6QixNQUFNMkQsTUFBTTNHLDZEQUFVQSxDQUFDa0YsSUFBSSxDQUFDLENBQUNiLElBQU1BLEVBQUV2RCxFQUFFLEtBQUtrQztvREFDNUMsSUFBSSxDQUFDMkQsS0FBSyxPQUFPO29EQUVqQixNQUFNSixpQkFBaUI1RSxLQUFLLENBQUNnRixJQUFJN0YsRUFBRSxDQUFDO29EQUNwQyxNQUFNOEYsT0FBT3ZGLE1BQU02RCxJQUFJLENBQ3JCLENBQUNuQyxJQUNDQSxFQUFFakMsRUFBRSxLQUFLeUYsa0JBQWtCeEQsRUFBRUMsVUFBVSxLQUFLMkQsSUFBSTdGLEVBQUU7b0RBR3RELHFCQUNFLDhEQUFDK0Y7OzBFQUNDLDhEQUFDaEI7Z0VBQUlELFdBQVU7MEVBQ1plLElBQUl4RCxJQUFJOzs7Ozs7NERBRVZ5RCxxQkFDQyw4REFBQ2Y7Z0VBQUlELFdBQVU7O2tGQUNiLDhEQUFDQzt3RUFBSUQsV0FBVTs7MEZBQ2IsOERBQUNFO2dGQUFLRixXQUFVOztvRkFDYmdCLEtBQUt4RCxLQUFLO29GQUFFOzs7Ozs7OzRFQUVkd0QsS0FBS3pELElBQUk7Ozs7Ozs7a0ZBRVosOERBQUMwQzt3RUFBSUQsV0FBVTs7NEVBQXlEOzRFQUNwRWdCLEtBQUt2RCxLQUFLLENBQUM0QyxPQUFPLENBQUM7Ozs7Ozs7Ozs7OztxRkFJekIsOERBQUNKO2dFQUFJRCxXQUFVOzBFQUE2Qjs7Ozs7Ozt1REFqQnZDZSxJQUFJN0YsRUFBRTs7Ozs7Z0RBdUJuQjs7Ozs7Ozs7Ozs7O2tEQUtKLDhEQUFDK0U7d0NBQUlELFdBQVU7OzBEQUNiLDhEQUFDL0YsaURBQUlBO2dEQUNIaUgsTUFBSztnREFDTGxCLFdBQVcsdUtBSVYsT0FIQ2IsY0FBY21CLE1BQU0sS0FBSyxJQUNyQixzREFDQTswREFFUDs7Ozs7OzBEQUdELDhEQUFDYTtnREFDQ0MsTUFBSztnREFDTEMsU0FBUztvREFDUHJGLFNBQVMsQ0FBQztvREFDVixJQUFJLElBQTZCLEVBQUU7d0RBQ2pDRSxhQUFhb0YsVUFBVSxDQUFDdEc7b0RBQzFCO2dEQUNGO2dEQUNBdUcsVUFBVXBDLGNBQWNtQixNQUFNLEtBQUs7Z0RBQ25DTixXQUFXLGlLQUlWLE9BSENiLGNBQWNtQixNQUFNLEtBQUssSUFDckIsa0NBQ0E7MERBRVA7Ozs7OzswREFHRCw4REFBQ25EO2dEQUFFNkMsV0FBVTswREFBbUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FRdEQsOERBQUNPO3dCQUFRUCxXQUFVOzswQ0FDakIsOERBQUNVO2dDQUFHVixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ2M7Z0NBQUdkLFdBQVU7O2tEQUNaLDhEQUFDaUI7a0RBQUc7Ozs7OztrREFDSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFJSiw4REFBQ0E7a0RBQUc7Ozs7OztrREFJSiw4REFBQ0E7a0RBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FRUiw4REFBQ1Y7d0JBQVFQLFdBQVU7OzBDQUNqQiw4REFBQ1U7Z0NBQUdWLFdBQVU7MENBQW1FOzs7Ozs7MENBR2pGLDhEQUFDYztnQ0FBR2QsV0FBVTs7a0RBQ1osOERBQUNpQjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTWhCO0dBNVh3QjNGOztRQUNEcEIsNERBQWVBO1FBQ3JCQyxzREFBU0E7OztLQUZGbUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5Q29sdW1uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtblwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbi8vIE1hcCBiYWNrZW5kIHBhcnRSb2xlIHRvIHlvdXIgZXhpc3RpbmcgQ2F0ZWdvcnlJZCB2YWx1ZXMuXG5jb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0ge1xuICBcInVwcGVyLXJlY2VpdmVyXCI6IFwidXBwZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBiYXJyZWw6IFwiYmFycmVsXCIgYXMgQ2F0ZWdvcnlJZCxcbiAgaGFuZGd1YXJkOiBcImhhbmRndWFyZFwiIGFzIENhdGVnb3J5SWQsXG4gIFwiY2hhcmdpbmctaGFuZGxlXCI6IFwiY2hhcmdpbmdIYW5kbGVcIiBhcyBDYXRlZ29yeUlkLFxuICBcImJ1ZmZlci1raXRcIjogXCJidWZmZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBcImxvd2VyLXBhcnRzLWtpdFwiOiBcImxvd2VyUGFydHNcIiBhcyBDYXRlZ29yeUlkLFxuICBzaWdodDogXCJzaWdodHNcIiBhcyBDYXRlZ29yeUlkLFxuICBcImxvd2VyLXJlY2VpdmVyXCI6IFwibG93ZXJcIiBhcyBDYXRlZ29yeUlkLFxuICBvcHRpYzogXCJvcHRpY1wiIGFzIENhdGVnb3J5SWQsXG4gIHN0b2NrOiBcInN0b2NrXCIgYXMgQ2F0ZWdvcnlJZCxcbn07XG5cbnR5cGUgQnVpbGRTdGF0ZSA9IFBhcnRpYWw8UmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZz4+OyAvLyBjYXRlZ29yeUlkIC0+IHBhcnRJZFxuXG5jb25zdCBTVE9SQUdFX0tFWSA9IFwiZ3VuYnVpbGRlci1idWlsZC1zdGF0ZVwiO1xuXG4vLyBHcm91cCBjYXRlZ29yaWVzIGludG8gbG9naWNhbCBzZWN0aW9ucy5cbi8vXG4vLyBJTVBPUlRBTlQ6XG4vLyBUaGVzZSBJRHMgbXVzdCBtYXRjaCB0aGUgaWRzIHlvdSBoYXZlIGluIENBVEVHT1JJRVMuXG4vLyBBbnl0aGluZyB0aGF0IGRvZXNuJ3QgZXhpc3Qgd2lsbCBqdXN0IGJlIHNraXBwZWQuXG5jb25zdCBDQVRFR09SWV9HUk9VUFM6IHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGNhdGVnb3J5SWRzOiBDYXRlZ29yeUlkW107XG59W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIkxvd2VyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkV2ZXJ5dGhpbmcgZnJvbSB0aGUgc2VyaWFsaXplZCBsb3dlciB0byBzbWFsbCBwYXJ0cywgZmlyZSBjb250cm9sLCBhbmQgY29yZSBjb250cm9scy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJsb3dlclwiLFxuICAgICAgXCJjb21wbGV0ZUxvd2VyXCIsXG4gICAgICBcImxvd2VyUGFydHNcIixcbiAgICAgIFwidHJpZ2dlclwiLFxuICAgICAgXCJncmlwXCIsXG4gICAgICBcInNhZmV0eVwiLFxuICAgICAgXCJidWZmZXJcIixcbiAgICAgIFwic3RvY2tcIixcbiAgICBdLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJVcHBlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJCYXJyZWwsIHVwcGVyLCBnYXMgc3lzdGVtLCBhbmQgdGhlIHBhcnRzIHRoYXQga2VlcCB0aGUgcmlmbGUgY3ljbGluZy5cIixcbiAgICBjYXRlZ29yeUlkczogW1xuICAgICAgXCJ1cHBlclwiLFxuICAgICAgXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgICBcImJjZ1wiLFxuICAgICAgXCJiYXJyZWxcIixcbiAgICAgIFwiZ2FzQmxvY2tcIixcbiAgICAgIFwiZ2FzVHViZVwiLFxuICAgICAgXCJtdXp6bGVEZXZpY2VcIixcbiAgICAgIFwic3VwcHJlc3NvclwiLFxuICAgICAgXCJoYW5kZ3VhcmRcIixcbiAgICAgIFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgICAgIFwic2lnaHRzXCIsXG4gICAgICBcIm9wdGljXCIsXG4gICAgXSxcbiAgfSxcbl07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEd1bmJ1aWxkZXJQYWdlKCkge1xuICBjb25zdCBzZWFyY2hQYXJhbXMgPSB1c2VTZWFyY2hQYXJhbXMoKTtcbiAgY29uc3Qgcm91dGVyID0gdXNlUm91dGVyKCk7XG4gIGNvbnN0IFtwYXJ0cywgc2V0UGFydHNdID0gdXNlU3RhdGU8UGFydFtdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nLCBzZXRMb2FkaW5nXSA9IHVzZVN0YXRlKHRydWUpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbYnVpbGQsIHNldEJ1aWxkXSA9IHVzZVN0YXRlPEJ1aWxkU3RhdGU+KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgY29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oU1RPUkFHRV9LRVkpO1xuICAgICAgaWYgKHN0b3JlZCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHN0b3JlZCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge307XG4gIH0pO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJvZHVjdHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyP3BsYXRmb3JtPUFSLTE1YCxcbiAgICAgICAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YVxuICAgICAgICAgIC5tYXAoKHApOiBQYXJ0IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gUEFSVF9ST0xFX1RPX0NBVEVHT1JZW3AucGFydFJvbGVdO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYW55IHBhcnRzIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcCB5ZXRcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcocC5pZCksIC8vIEFMV0FZUyBzdHJpbmdcbiAgICAgICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydCA9PiBwICE9PSBudWxsKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUHJvZHVjdHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtdKTtcblxuICAvLyBIYW5kbGUgVVJMIHF1ZXJ5IHBhcmFtZXRlciBmb3IgcGFydCBzZWxlY3Rpb24gKD9zZWxlY3Q9dXBwZXI6MTY1KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChcInNlbGVjdFwiKTtcbiAgICBpZiAoc2VsZWN0UGFyYW0pIHtcbiAgICAgIGNvbnN0IFtjYXRlZ29yeUlkLCBwYXJ0SWRdID0gc2VsZWN0UGFyYW0uc3BsaXQoXCI6XCIpO1xuICAgICAgaWYgKGNhdGVnb3J5SWQgJiYgcGFydElkICYmIENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIFtjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJvdXRlci5yZXBsYWNlKFwiL2d1bmJ1aWxkZXJcIiwgeyBzY3JvbGw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlYXJjaFBhcmFtcywgcm91dGVyXSk7XG5cbiAgLy8gUGVyc2lzdCBidWlsZCBzdGF0ZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIGNvbnN0IHBhcnRzQnlDYXRlZ29yeTogUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cGVkID0ge30gYXMgUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT47XG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBDQVRFR09SSUVTKSB7XG4gICAgICBncm91cGVkW2NhdGVnb3J5LmlkXSA9IHBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnkuaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBlZDtcbiAgfSwgW3BhcnRzXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRQYXJ0czogUGFydFtdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkKVxuICAgICAgLm1hcCgoW2NhdGVnb3J5SWQsIHBhcnRJZF0pID0+XG4gICAgICAgIHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5SWQpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQYXJ0W107XG4gIH0sIFtidWlsZCwgcGFydHNdKTtcblxuICBjb25zdCB0b3RhbFByaWNlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzZWxlY3RlZFBhcnRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnByaWNlLCAwKSxcbiAgICBbc2VsZWN0ZWRQYXJ0c10sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBVc2UgZ3JvdXAgb3JkZXJpbmcgZm9yIHRoZSBzdW1tYXJ5IGFzIHdlbGxcbiAgY29uc3Qgc3VtbWFyeUNhdGVnb3J5T3JkZXI6IENhdGVnb3J5SWRbXSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIENBVEVHT1JZX0dST1VQUy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuY2F0ZWdvcnlJZHMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSxcbiAgICAgICksXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1hbWJlci01MDAvMjAgYmctYW1iZXItNTAwLzVcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIGZsZXggbWF4LXctNnhsIGZsZXgtY29sIGdhcC0xIHB4LTQgcHktMiB0ZXh0LVswLjc1cmVtXSB0ZXh0LWFtYmVyLTEwMCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicm91bmRlZC1zbSBiZy1hbWJlci01MDAvMjAgcHgtMiBweS0wLjUgdGV4dC1bMC42NXJlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMThlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgRWFybHkgQWNjZXNzIEJldGFcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LWFtYmVyLTEwMC85MCBtZDppbmxpbmVcIj5cbiAgICAgICAgICAgICAgWW91JmFwb3M7cmUgdXNpbmcgYW4gZWFybHktYWNjZXNzIHByb3RvdHlwZSBvZiBUaGUgQXJtb3J5LiBEYXRhLFxuICAgICAgICAgICAgICBwcmljaW5nLCBhbmQgYXZhaWxhYmxlIHBhcnRzIGFyZSBzdGlsbCBldm9sdmluZy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTEwMC85MCBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIEVhcmx5LWFjY2VzcyBwcm90b3R5cGUuIERhdGEgYW5kIHByaWNpbmcgbWF5IGNoYW5nZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTYgZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpmbGV4LXJvdyBtZDppdGVtcy1lbmQgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBUaGUgQXJtb3J5OiA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPkVhcmx5IEFjY2Vzczwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICBFeHBsb3JlIGNvbXBvbmVudHMgZnJvbSB0cnVzdGVkIGJyYW5kcywgY2hvb3NlIG9uZSBwYXJ0IHBlclxuICAgICAgICAgICAgICBjYXRlZ29yeSwgdHJhY2sgbGl2ZSBwcmljZXMsIGFuZCB3YXRjaCB5b3VyIHRvdGFsIGJ1aWxkIGNvc3RcbiAgICAgICAgICAgICAgdXBkYXRlIGFzIHlvdSBnby4gVGhpcyBlYXJseS1hY2Nlc3MgYnVpbGRlciBrZWVwcyB5b3VyIHNldHVwIHNhdmVkXG4gICAgICAgICAgICAgIGxvY2FsbHkgc28geW91IGNhbiBjb21lIGJhY2sgYW5kIHJlZmluZSBpdCBhbnl0aW1lLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0zIG1kOm10LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICR7dG90YWxQcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBsZzpncmlkLWNvbHMtWzNmciwxLjI1ZnJdXCI+XG4gICAgICAgICAgey8qIENhdGVnb3JpZXMvcGFydHMgKi99XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICAgIHtsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTG9hZGluZyBwYXJ0cyBmcm9tIGJhY2tlbmTigKZcbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHtlcnJvciAmJiAhbG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC1yZWQtNDAwXCI+XG4gICAgICAgICAgICAgICAge2Vycm9yfSDigJQgY2hlY2sgdGhhdCB0aGUgQmFsbGlzdGljIEFQSSBpcyBydW5uaW5nIGFuZCBDT1JTIGlzXG4gICAgICAgICAgICAgICAgY29uZmlndXJlZC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIHshbG9hZGluZyAmJiAhZXJyb3IgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktNlwiPlxuICAgICAgICAgICAgICAgIHtDQVRFR09SWV9HUk9VUFMubWFwKChncm91cCkgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBDYXRlZ29yaWVzID0gQ0FURUdPUklFUy5maWx0ZXIoKGMpID0+XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLmNhdGVnb3J5SWRzLmluY2x1ZGVzKGMuaWQgYXMgQ2F0ZWdvcnlJZCksXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBDYXRlZ29yaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBrZXk9e2dyb3VwLmlkfSBjbGFzc05hbWU9XCJzcGFjZS15LTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtYmFzZWxpbmUganVzdGlmeS1iZXR3ZWVuIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC1zbSBmb250LXNlbWlib2xkIHRleHQtemluYy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAubGFiZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbiAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwIG10LTEgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlciBib3JkZXItemluYy04MDAgcm91bmRlZC1tZCBwLTIgbWQ6cC0zIGJnLXppbmMtOTUwLzYwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk9e2NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHM9e3BhcnRzQnlDYXRlZ29yeVtjYXRlZ29yeS5pZF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3RQYXJ0PXsocGFydElkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVTZWxlY3RQYXJ0KGNhdGVnb3J5LmlkLCBwYXJ0SWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgICAgey8qIEJ1aWxkIFN1bW1hcnkgKi99XG4gICAgICAgICAgPGFzaWRlIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00IGZsZXggZmxleC1jb2xcIj5cbiAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMTZlbV0gdXBwZXJjYXNlIHRleHQtemluYy00MDAgbWItM1wiPlxuICAgICAgICAgICAgICBDdXJyZW50IEJ1aWxkXG4gICAgICAgICAgICA8L2gyPlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMSBvdmVyZmxvdy15LWF1dG8gcHItMVwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDAgJiYgKFxuICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgU2VsZWN0IGEgcGFydCBmcm9tIGVhY2ggY2F0ZWdvcnkgdG8gc3RhcnQgeW91ciBidWlsZC5cbiAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgPHVsIGNsYXNzTmFtZT1cInNwYWNlLXktMlwiPlxuICAgICAgICAgICAgICAgIHtzdW1tYXJ5Q2F0ZWdvcnlPcmRlci5tYXAoKGNhdGVnb3J5SWQpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGNhdCA9IENBVEVHT1JJRVMuZmluZCgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCk7XG4gICAgICAgICAgICAgICAgICBpZiAoIWNhdCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkUGFydElkID0gYnVpbGRbY2F0LmlkXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0cy5maW5kKFxuICAgICAgICAgICAgICAgICAgICAocCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICBwLmlkID09PSBzZWxlY3RlZFBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdC5pZCxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxsaSBrZXk9e2NhdC5pZH0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LVswLjdyZW1dIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2F0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAge3BhcnQgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgZmxleCBqdXN0aWZ5LWJldHdlZW4gaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5icmFuZH17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0Lm5hbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMCB3aGl0ZXNwYWNlLW5vd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFydC5wcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTEgdGV4dC14cyB0ZXh0LXppbmMtNjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIE5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgey8qIENUQSAqL31cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBib3JkZXItdCBib3JkZXItemluYy04MDAgcHQtMyBzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgPExpbmtcbiAgICAgICAgICAgICAgICBocmVmPVwiL2d1bmJ1aWxkZXIvYnVpbGRcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YGJsb2NrIHctZnVsbCByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItYW1iZXItNDAwLzYwIGJnLWFtYmVyLTQwMC8xMCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWFtYmVyLTIwMCBob3ZlcjpiZy1hbWJlci00MDAvMTUgdGV4dC1jZW50ZXIgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gXCJvcGFjaXR5LTQwIGN1cnNvci1ub3QtYWxsb3dlZCBwb2ludGVyLWV2ZW50cy1ub25lXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBCdWlsZCBTdW1tYXJ5XG4gICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNldEJ1aWxkKHt9KTtcbiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMH1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2B3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzUwIHB4LTMgcHktMiB0ZXh0LXNtIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDAgaG92ZXI6YmctemluYy04MDAgaG92ZXI6Ym9yZGVyLXppbmMtNjAwIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWRcIlxuICAgICAgICAgICAgICAgICAgICA6IFwiXCJcbiAgICAgICAgICAgICAgICB9YH1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENsZWFyIEJ1aWxkXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtWzAuN3JlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIFZpZXcgeW91ciBidWlsZCBicmVha2Rvd24gYW5kIHNoYXJlIGl0IHdpdGggb3RoZXJzLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2FzaWRlPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogV2hhdCdzIE5ldyAqL31cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwibXQtOCByb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNFwiPlxuICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICBXaGF0JmFwb3M7cyBOZXcgaW4gRWFybHkgQWNjZXNzXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIExpdmUgcGFydHMgYW5kIHByaWNpbmcgcHVsbGVkIGZyb20gbXVsdGlwbGUgbWVyY2hhbnRzLjwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBHcm91cGVkIGxheW91dCBmb3IgbG93ZXIgYW5kIHVwcGVyIHJlY2VpdmVyIHBhcnRzIHNvIHlvdSBjYW4gc2VlXG4gICAgICAgICAgICAgIGF0IGEgZ2xhbmNlIHdoaWNoIHNlY3Rpb25zIG9mIHlvdXIgYnVpbGQgYXJlIHN0aWxsIG1pc3NpbmcuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgUnVubmluZyBidWlsZCB0b3RhbCB0aGF0IHVwZGF0ZXMgYXV0b21hdGljYWxseSBhcyB5b3UgYWRkIG9yXG4gICAgICAgICAgICAgIHN3YXAgY29tcG9uZW50cy5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8bGk+XG4gICAgICAgICAgICAgIOKAoiBMb2NhbCBidWlsZCBwZXJzaXN0ZW5jZSBzbyB5b3VyIHNlbGVjdGlvbnMgc3RpY2sgYXJvdW5kIGJldHdlZW5cbiAgICAgICAgICAgICAgdmlzaXRzIG9uIHRoaXMgZGV2aWNlLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG5cbiAgICAgICAgey8qIFJvYWRtYXAgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3Mgb24gb3VyIHJvYWRtYXBcbiAgICAgICAgICA8L2gyPlxuICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJtdC0yIHNwYWNlLXktMSB0ZXh0LXNtIHRleHQtemluYy00MDBcIj5cbiAgICAgICAgICAgIDxsaT7igKIgUGxhdGZvcm0gZmlsdGVycyAoQVItMTUsIEFSLTksIEFSLTEwKTwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIE1vcmUgcGFydCBjYXRlZ29yaWVzIGFuZCBmdXJuaXR1cmU8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBSaWNoZXIgcHJpY2luZy9zdG9jayBzeW5jPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgU21hcnRlciBjb21wYXRpYmlsaXR5IGNoZWNrcyBiZXR3ZWVuIGNvbXBvbmVudHM8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBBUjkvQVIxMCBzdXBwb3J0IGFuZCBtb3JlPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZU1lbW8iLCJ1c2VTdGF0ZSIsInVzZUVmZmVjdCIsIkxpbmsiLCJ1c2VTZWFyY2hQYXJhbXMiLCJ1c2VSb3V0ZXIiLCJDQVRFR09SSUVTIiwiQ2F0ZWdvcnlDb2x1bW4iLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwic2lnaHQiLCJvcHRpYyIsInN0b2NrIiwiU1RPUkFHRV9LRVkiLCJDQVRFR09SWV9HUk9VUFMiLCJpZCIsImxhYmVsIiwiZGVzY3JpcHRpb24iLCJjYXRlZ29yeUlkcyIsIkd1bmJ1aWxkZXJQYWdlIiwic2VhcmNoUGFyYW1zIiwicm91dGVyIiwicGFydHMiLCJzZXRQYXJ0cyIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsImJ1aWxkIiwic2V0QnVpbGQiLCJzdG9yZWQiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwiSlNPTiIsInBhcnNlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsInNwYW4iLCJoZWFkZXIiLCJoMSIsInRvRml4ZWQiLCJsZW5ndGgiLCJzZWN0aW9uIiwiZ3JvdXBDYXRlZ29yaWVzIiwiaW5jbHVkZXMiLCJoMiIsInNlbGVjdGVkUGFydElkIiwib25TZWxlY3RQYXJ0IiwiYXNpZGUiLCJ1bCIsImNhdCIsInBhcnQiLCJsaSIsImhyZWYiLCJidXR0b24iLCJ0eXBlIiwib25DbGljayIsInJlbW92ZUl0ZW0iLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.c4eb215fcf760026.hot-update.js b/.next/static/webpack/app/gunbuilder/page.c4eb215fcf760026.hot-update.js new file mode 100644 index 0000000..00d0ebe --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.c4eb215fcf760026.hot-update.js @@ -0,0 +1,32 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx": +/*!*********************************!*\ + !*** ./app/gunbuilder/page.tsx ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* harmony import */ var _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! @/data/partRoleMappings */ \"(app-pages-browser)/./data/partRoleMappings.ts\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n const [layoutMode, setLayoutMode] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(\"cards\");\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = _data_partRoleMappings__WEBPACK_IMPORTED_MODULE_6__.PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 227,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 230,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 226,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 235,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 225,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 224,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 244,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 248,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 247,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 250,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 243,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 260,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 263,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 242,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mb-4 flex flex-col gap-2 sm:flex-row sm:items-center sm:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500\",\n children: \"Choose one part per category. Switch layouts to browse by cards or a tighter list view.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"inline-flex items-center rounded-md border border-zinc-700 bg-zinc-900/70 text-[0.7rem]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"cards\"),\n className: \"px-2.5 py-1 rounded-l-md border-r border-zinc-700 transition-colors \".concat(layoutMode === \"cards\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"Card view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 278,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>setLayoutMode(\"list\"),\n className: \"px-2.5 py-1 rounded-r-md transition-colors \".concat(layoutMode === \"list\" ? \"bg-amber-500/20 text-amber-200\" : \"text-zinc-400 hover:bg-zinc-800\"),\n children: \"List view\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 289,\n columnNumber: 17\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 277,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 273,\n columnNumber: 13\n }, this),\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 303,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 308,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 328,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 332,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 327,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 326,\n columnNumber: 23\n }, this),\n layoutMode === \"cards\" ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 346,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 342,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 340,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60 flex flex-col md:flex-row md:items-start md:justify-between gap-3\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 364,\n columnNumber: 31\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 360,\n columnNumber: 29\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 358,\n columnNumber: 25\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 325,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 314,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 385,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 409,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 415,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 414,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 413,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 425,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 396,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 389,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 437,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 464,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 436,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 384,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 270,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 473,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 478,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 482,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 486,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 476,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 472,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 495,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 499,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 500,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 501,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 502,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 503,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 498,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 494,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 240,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 223,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Gf0ADXJJ40AD6WNDCWO2nEU+pms=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUVxRDtBQUN4QjtBQUNnQztBQUNUO0FBRVM7QUFDRztJQWM5RFM7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFLMUMsTUFBTUksY0FBYztBQUVwQiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGFBQWE7QUFDYix1REFBdUQ7QUFDdkQsb0RBQW9EO0FBQ3BELE1BQU1DLGtCQUtBO0lBQ0o7UUFDRUMsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtBQUVjLFNBQVNDOztJQUN0QixNQUFNQyxlQUFlaEIsZ0VBQWVBO0lBQ3BDLE1BQU1pQixTQUFTaEIsMERBQVNBO0lBQ3hCLE1BQU0sQ0FBQ2lCLE9BQU9DLFNBQVMsR0FBR3RCLCtDQUFRQSxDQUFTLEVBQUU7SUFDN0MsTUFBTSxDQUFDdUIsU0FBU0MsV0FBVyxHQUFHeEIsK0NBQVFBLENBQUM7SUFDdkMsTUFBTSxDQUFDeUIsT0FBT0MsU0FBUyxHQUFHMUIsK0NBQVFBLENBQWdCO0lBQ2xELE1BQU0sQ0FBQzJCLE9BQU9DLFNBQVMsR0FBRzVCLCtDQUFRQSxDQUFhO1FBQzdDLElBQUksSUFBNkIsRUFBRTtZQUNqQyxNQUFNNkIsU0FBU0MsYUFBYUMsT0FBTyxDQUFDbkI7WUFDcEMsSUFBSWlCLFFBQVE7Z0JBQ1YsSUFBSTtvQkFDRixPQUFPRyxLQUFL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QixXQUFVOztrREFDWiw4REFBQ29CO2tEQUFHOzs7Ozs7a0RBQ0osOERBQUNBO2tEQUFHOzs7Ozs7a0RBSUosOERBQUNBO2tEQUFHOzs7Ozs7a0RBSUosOERBQUNBO2tEQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBUVIsOERBQUNiO3dCQUFRUCxXQUFVOzswQ0FDakIsOERBQUNhO2dDQUFHYixXQUFVOzBDQUFtRTs7Ozs7OzBDQUdqRiw4REFBQ2lCO2dDQUFHakIsV0FBVTs7a0RBQ1osOERBQUNvQjtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7O2tEQUNKLDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTWhCO0dBOWF3QmhHOztRQUNEZiw0REFBZUE7UUFDckJDLHNEQUFTQTs7O0tBRkZjIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4PzA1NDAiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZU1lbW8sIHVzZVN0YXRlLCB1c2VFZmZlY3QgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBMaW5rIGZyb20gXCJuZXh0L2xpbmtcIjtcbmltcG9ydCB7IHVzZVNlYXJjaFBhcmFtcywgdXNlUm91dGVyIH0gZnJvbSBcIm5leHQvbmF2aWdhdGlvblwiO1xuaW1wb3J0IHsgQ0FURUdPUklFUyB9IGZyb20gXCJAL2RhdGEvZ3VuYnVpbGRlclBhcnRzXCI7XG5pbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQsIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5pbXBvcnQgeyBDYXRlZ29yeUNvbHVtbiB9IGZyb20gXCJAL2NvbXBvbmVudHMvQ2F0ZWdvcnlDb2x1bW5cIjtcbmltcG9ydCB7IFBBUlRfUk9MRV9UT19DQVRFR09SWSB9IGZyb20gXCJAL2RhdGEvcGFydFJvbGVNYXBwaW5nc1wiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cblxudHlwZSBCdWlsZFN0YXRlID0gUGFydGlhbDxSZWNvcmQ8Q2F0ZWdvcnlJZCwgc3RyaW5nPj47IC8vIGNhdGVnb3J5SWQgLT4gcGFydElkXG5cbmNvbnN0IFNUT1JBR0VfS0VZID0gXCJndW5idWlsZGVyLWJ1aWxkLXN0YXRlXCI7XG5cbi8vIEdyb3VwIGNhdGVnb3JpZXMgaW50byBsb2dpY2FsIHNlY3Rpb25zLlxuLy9cbi8vIElNUE9SVEFOVDpcbi8vIFRoZXNlIElEcyBtdXN0IG1hdGNoIHRoZSBpZHMgeW91IGhhdmUgaW4gQ0FURUdPUklFUy5cbi8vIEFueXRoaW5nIHRoYXQgZG9lc24ndCBleGlzdCB3aWxsIGp1c3QgYmUgc2tpcHBlZC5cbmNvbnN0IENBVEVHT1JZX0dST1VQUzoge1xuICBpZDogc3RyaW5nO1xuICBsYWJlbDogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgY2F0ZWdvcnlJZHM6IENhdGVnb3J5SWRbXTtcbn1bXSA9IFtcbiAge1xuICAgIGlkOiBcImxvd2VyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiRXZlcnl0aGluZyBmcm9tIHRoZSBzZXJpYWxpemVkIGxvd2VyIHRvIHNtYWxsIHBhcnRzLCBmaXJlIGNvbnRyb2wsIGFuZCBjb3JlIGNvbnRyb2xzLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcImxvd2VyXCIsXG4gICAgICBcImNvbXBsZXRlTG93ZXJcIixcbiAgICAgIFwibG93ZXJQYXJ0c1wiLFxuICAgICAgXCJ0cmlnZ2VyXCIsXG4gICAgICBcImdyaXBcIixcbiAgICAgIFwic2FmZXR5XCIsXG4gICAgICBcImJ1ZmZlclwiLFxuICAgICAgXCJzdG9ja1wiLFxuICAgIF0sXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1ncm91cFwiLFxuICAgIGxhYmVsOiBcIlVwcGVyIFJlY2VpdmVyIFBhcnRzXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIkJhcnJlbCwgdXBwZXIsIGdhcyBzeXN0ZW0sIGFuZCB0aGUgcGFydHMgdGhhdCBrZWVwIHRoZSByaWZsZSBjeWNsaW5nLlwiLFxuICAgIGNhdGVnb3J5SWRzOiBbXG4gICAgICBcInVwcGVyXCIsXG4gICAgICBcImNvbXBsZXRlVXBwZXJcIixcbiAgICAgIFwiYmNnXCIsXG4gICAgICBcImJhcnJlbFwiLFxuICAgICAgXCJnYXNCbG9ja1wiLFxuICAgICAgXCJnYXNUdWJlXCIsXG4gICAgICBcIm11enpsZURldmljZVwiLFxuICAgICAgXCJzdXBwcmVzc29yXCIsXG4gICAgICBcImhhbmRndWFyZFwiLFxuICAgICAgXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgICAgXCJzaWdodHNcIixcbiAgICAgIFwib3B0aWNcIixcbiAgICBdLFxuICB9LFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gR3VuYnVpbGRlclBhZ2UoKSB7XG4gIGNvbnN0IHNlYXJjaFBhcmFtcyA9IHVzZVNlYXJjaFBhcmFtcygpO1xuICBjb25zdCByb3V0ZXIgPSB1c2VSb3V0ZXIoKTtcbiAgY29uc3QgW3BhcnRzLCBzZXRQYXJ0c10gPSB1c2VTdGF0ZTxQYXJ0W10+KFtdKTtcbiAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUodHJ1ZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtidWlsZCwgc2V0QnVpbGRdID0gdXNlU3RhdGU8QnVpbGRTdGF0ZT4oKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zdCBzdG9yZWQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04ucGFyc2Uoc3RvcmVkKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfSk7XG4gIGNvbnN0IFtsYXlvdXRNb2RlLCBzZXRMYXlvdXRNb2RlXSA9IHVzZVN0YXRlPFwiY2FyZHNcIiB8IFwibGlzdFwiPihcImNhcmRzXCIpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGZldGNoUHJvZHVjdHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICBzZXRFcnJvcihudWxsKTtcblxuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChcbiAgICAgICAgICBgJHtBUElfQkFTRV9VUkx9L2FwaS9wcm9kdWN0cy9ndW5idWlsZGVyP3BsYXRmb3JtPUFSLTE1YCxcbiAgICAgICAgICB7IHNpZ25hbDogY29udHJvbGxlci5zaWduYWwgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhOiBHdW5idWlsZGVyUHJvZHVjdEZyb21BcGlbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZDogUGFydFtdID0gZGF0YVxuICAgICAgICAgIC5tYXAoKHApOiBQYXJ0IHwgbnVsbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXRlZ29yeUlkID0gUEFSVF9ST0xFX1RPX0NBVEVHT1JZW3AucGFydFJvbGVdO1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgIC8vIFNraXAgYW55IHBhcnRzIHdlIGRvbid0IGtub3cgaG93IHRvIG1hcCB5ZXRcbiAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGlkOiBTdHJpbmcocC5pZCksIC8vIEFMV0FZUyBzdHJpbmdcbiAgICAgICAgICAgICAgY2F0ZWdvcnlJZCxcbiAgICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgICBicmFuZDogcC5icmFuZCxcbiAgICAgICAgICAgICAgcHJpY2U6IHAucHJpY2UgPz8gMCxcbiAgICAgICAgICAgICAgaW1hZ2VVcmw6IHAubWFpbkltYWdlVXJsID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdXJsOiBwLmJ1eVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIG5vdGVzOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydCA9PiBwICE9PSBudWxsKTtcblxuICAgICAgICBzZXRQYXJ0cyhub3JtYWxpemVkKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gXCJBYm9ydEVycm9yXCIpIHJldHVybjtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBwcm9kdWN0c1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZldGNoUHJvZHVjdHMoKTtcblxuICAgIHJldHVybiAoKSA9PiBjb250cm9sbGVyLmFib3J0KCk7XG4gIH0sIFtdKTtcblxuICAvLyBIYW5kbGUgVVJMIHF1ZXJ5IHBhcmFtZXRlciBmb3IgcGFydCBzZWxlY3Rpb24gKD9zZWxlY3Q9dXBwZXI6MTY1KVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdFBhcmFtID0gc2VhcmNoUGFyYW1zLmdldChcInNlbGVjdFwiKTtcbiAgICBpZiAoc2VsZWN0UGFyYW0pIHtcbiAgICAgIGNvbnN0IFtjYXRlZ29yeUlkLCBwYXJ0SWRdID0gc2VsZWN0UGFyYW0uc3BsaXQoXCI6XCIpO1xuICAgICAgaWYgKGNhdGVnb3J5SWQgJiYgcGFydElkICYmIENBVEVHT1JJRVMuc29tZSgoYykgPT4gYy5pZCA9PT0gY2F0ZWdvcnlJZCkpIHtcbiAgICAgICAgc2V0QnVpbGQoKHByZXYpID0+IHtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkID0ge1xuICAgICAgICAgICAgLi4ucHJldixcbiAgICAgICAgICAgIFtjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWRdOiBwYXJ0SWQsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KHVwZGF0ZWQpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJvdXRlci5yZXBsYWNlKFwiL2d1bmJ1aWxkZXJcIiwgeyBzY3JvbGw6IGZhbHNlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlYXJjaFBhcmFtcywgcm91dGVyXSk7XG5cbiAgLy8gUGVyc2lzdCBidWlsZCBzdGF0ZSB0byBsb2NhbFN0b3JhZ2Ugd2hlbmV2ZXIgaXQgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShTVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoYnVpbGQpKTtcbiAgICB9XG4gIH0sIFtidWlsZF0pO1xuXG4gIGNvbnN0IHBhcnRzQnlDYXRlZ29yeTogUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT4gPSB1c2VNZW1vKCgpID0+IHtcbiAgICBjb25zdCBncm91cGVkID0ge30gYXMgUmVjb3JkPENhdGVnb3J5SWQsIFBhcnRbXT47XG4gICAgZm9yIChjb25zdCBjYXRlZ29yeSBvZiBDQVRFR09SSUVTKSB7XG4gICAgICBncm91cGVkW2NhdGVnb3J5LmlkXSA9IHBhcnRzLmZpbHRlcihcbiAgICAgICAgKHApID0+IHAuY2F0ZWdvcnlJZCA9PT0gY2F0ZWdvcnkuaWQsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gZ3JvdXBlZDtcbiAgfSwgW3BhcnRzXSk7XG5cbiAgY29uc3Qgc2VsZWN0ZWRQYXJ0czogUGFydFtdID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGJ1aWxkKVxuICAgICAgLm1hcCgoW2NhdGVnb3J5SWQsIHBhcnRJZF0pID0+XG4gICAgICAgIHBhcnRzLmZpbmQoKHApID0+IHAuaWQgPT09IHBhcnRJZCAmJiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5SWQpLFxuICAgICAgKVxuICAgICAgLmZpbHRlcihCb29sZWFuKSBhcyBQYXJ0W107XG4gIH0sIFtidWlsZCwgcGFydHNdKTtcblxuICBjb25zdCB0b3RhbFByaWNlID0gdXNlTWVtbyhcbiAgICAoKSA9PiBzZWxlY3RlZFBhcnRzLnJlZHVjZSgoc3VtLCBwKSA9PiBzdW0gKyBwLnByaWNlLCAwKSxcbiAgICBbc2VsZWN0ZWRQYXJ0c10sXG4gICk7XG5cbiAgY29uc3QgaGFuZGxlU2VsZWN0UGFydCA9IChjYXRlZ29yeUlkOiBDYXRlZ29yeUlkLCBwYXJ0SWQ6IHN0cmluZykgPT4ge1xuICAgIHNldEJ1aWxkKChwcmV2KSA9PiAoe1xuICAgICAgLi4ucHJldixcbiAgICAgIFtjYXRlZ29yeUlkXTogcGFydElkLFxuICAgIH0pKTtcbiAgfTtcblxuICAvLyBVc2UgZ3JvdXAgb3JkZXJpbmcgZm9yIHRoZSBzdW1tYXJ5IGFzIHdlbGxcbiAgY29uc3Qgc3VtbWFyeUNhdGVnb3J5T3JkZXI6IENhdGVnb3J5SWRbXSA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIENBVEVHT1JZX0dST1VQUy5mbGF0TWFwKChncm91cCkgPT4gZ3JvdXAuY2F0ZWdvcnlJZHMpLmZpbHRlcihcbiAgICAgICAgKGlkKSA9PiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGlkKSxcbiAgICAgICksXG4gICAgW10sXG4gICk7XG5cbiAgcmV0dXJuIChcbiAgICA8bWFpbiBjbGFzc05hbWU9XCJtaW4taC1zY3JlZW4gYmctYmxhY2sgdGV4dC16aW5jLTUwXCI+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci1hbWJlci01MDAvMjAgYmctYW1iZXItNTAwLzVcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIGZsZXggbWF4LXctNnhsIGZsZXgtY29sIGdhcC0xIHB4LTQgcHktMiB0ZXh0LVswLjc1cmVtXSB0ZXh0LWFtYmVyLTEwMCBtZDpmbGV4LXJvdyBtZDppdGVtcy1jZW50ZXIgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicm91bmRlZC1zbSBiZy1hbWJlci01MDAvMjAgcHgtMiBweS0wLjUgdGV4dC1bMC42NXJlbV0gZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMThlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgICAgRWFybHkgQWNjZXNzIEJldGFcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LWFtYmVyLTEwMC85MCBtZDppbmxpbmVcIj5cbiAgICAgICAgICAgICAgWW91JmFwb3M7cmUgdXNpbmcgYW4gZWFybHktYWNjZXNzIHByb3RvdHlwZSBvZiBUaGUgQXJtb3J5LiBEYXRhLFxuICAgICAgICAgICAgICBwcmljaW5nLCBhbmQgYXZhaWxhYmxlIHBhcnRzIGFyZSBzdGlsbCBldm9sdmluZy5cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTEwMC85MCBtZDpoaWRkZW5cIj5cbiAgICAgICAgICAgIEVhcmx5LWFjY2VzcyBwcm90b3R5cGUuIERhdGEgYW5kIHByaWNpbmcgbWF5IGNoYW5nZS5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14LWF1dG8gbWF4LXctNnhsIHB4LTQgcHktNiBsZzpweS0xMFwiPlxuICAgICAgICB7LyogSGVhZGVyICovfVxuICAgICAgICA8aGVhZGVyIGNsYXNzTmFtZT1cIm1iLTYgZmxleCBmbGV4LWNvbCBnYXAtMiBtZDpmbGV4LXJvdyBtZDppdGVtcy1lbmQgbWQ6anVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB0cmFja2luZy1bMC4yZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIFNoYWRvdyBTdGFuZGFyZFxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBUaGUgQXJtb3J5OiA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LWFtYmVyLTMwMFwiPkVhcmx5IEFjY2Vzczwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJtdC0yIHRleHQtc20gdGV4dC16aW5jLTQwMCBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICBFeHBsb3JlIGNvbXBvbmVudHMgZnJvbSB0cnVzdGVkIGJyYW5kcywgY2hvb3NlIG9uZSBwYXJ0IHBlclxuICAgICAgICAgICAgICBjYXRlZ29yeSwgdHJhY2sgbGl2ZSBwcmljZXMsIGFuZCB3YXRjaCB5b3VyIHRvdGFsIGJ1aWxkIGNvc3RcbiAgICAgICAgICAgICAgdXBkYXRlIGFzIHlvdSBnby4gVGhpcyBlYXJseS1hY2Nlc3MgYnVpbGRlciBrZWVwcyB5b3VyIHNldHVwIHNhdmVkXG4gICAgICAgICAgICAgIGxvY2FsbHkgc28geW91IGNhbiBjb21lIGJhY2sgYW5kIHJlZmluZSBpdCBhbnl0aW1lLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0zIG1kOm10LTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNDAwXCI+Q3VycmVudCBidWlsZCB0b3RhbDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LTJ4bCBmb250LXNlbWlib2xkIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgICR7dG90YWxQcmljZS50b0ZpeGVkKDIpfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRQYXJ0cy5sZW5ndGh9IC8ge0NBVEVHT1JJRVMubGVuZ3RofSBjYXRlZ29yaWVzIGZpbGxlZFxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaGVhZGVyPlxuXG4gICAgICAgIHsvKiBMYXlvdXQgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBsZzpncmlkLWNvbHMtWzNmciwxLjI1ZnJdXCI+XG4gICAgICAgICAgey8qIENhdGVnb3JpZXMvcGFydHMgKi99XG4gICAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItNCBmbGV4IGZsZXgtY29sIGdhcC0yIHNtOmZsZXgtcm93IHNtOml0ZW1zLWNlbnRlciBzbTpqdXN0aWZ5LWJldHdlZW5cIj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgQ2hvb3NlIG9uZSBwYXJ0IHBlciBjYXRlZ29yeS4gU3dpdGNoIGxheW91dHMgdG8gYnJvd3NlIGJ5IGNhcmRzIG9yIGEgdGlnaHRlciBsaXN0IHZpZXcuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwLzcwIHRleHQtWzAuN3JlbV1cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldExheW91dE1vZGUoXCJjYXJkc1wiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTIuNSBweS0xIHJvdW5kZWQtbC1tZCBib3JkZXItciBib3JkZXItemluYy03MDAgdHJhbnNpdGlvbi1jb2xvcnMgJHtcbiAgICAgICAgICAgICAgICAgICAgbGF5b3V0TW9kZSA9PT0gXCJjYXJkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgPyBcImJnLWFtYmVyLTUwMC8yMCB0ZXh0LWFtYmVyLTIwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgOiBcInRleHQtemluYy00MDAgaG92ZXI6YmctemluYy04MDBcIlxuICAgICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQ2FyZCB2aWV3XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBzZXRMYXlvdXRNb2RlKFwibGlzdFwiKX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17YHB4LTIuNSBweS0xIHJvdW5kZWQtci1tZCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgICBsYXlvdXRNb2RlID09PSBcImxpc3RcIlxuICAgICAgICAgICAgICAgICAgICAgID8gXCJiZy1hbWJlci01MDAvMjAgdGV4dC1hbWJlci0yMDBcIlxuICAgICAgICAgICAgICAgICAgICAgIDogXCJ0ZXh0LXppbmMtNDAwIGhvdmVyOmJnLXppbmMtODAwXCJcbiAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIExpc3Qgdmlld1xuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAge2xvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBMb2FkaW5nIHBhcnRzIGZyb20gYmFja2VuZOKAplxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAge2Vycm9yICYmICFsb2FkaW5nICYmIChcbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXJlZC00MDBcIj5cbiAgICAgICAgICAgICAgICB7ZXJyb3J9IOKAlCBjaGVjayB0aGF0IHRoZSBCYWxsaXN0aWMgQVBJIGlzIHJ1bm5pbmcgYW5kIENPUlMgaXNcbiAgICAgICAgICAgICAgICBjb25maWd1cmVkLlxuICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgeyFsb2FkaW5nICYmICFlcnJvciAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS02XCI+XG4gICAgICAgICAgICAgICAge0NBVEVHT1JZX0dST1VQUy5tYXAoKGdyb3VwKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBncm91cENhdGVnb3JpZXMgPSBDQVRFR09SSUVTLmZpbHRlcigoYykgPT5cbiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY2F0ZWdvcnlJZHMuaW5jbHVkZXMoYy5pZCBhcyBDYXRlZ29yeUlkKSxcbiAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgIGlmIChncm91cENhdGVnb3JpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGtleT17Z3JvdXAuaWR9IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1iYXNlbGluZSBqdXN0aWZ5LWJldHdlZW4gZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzc05hbWU9XCJ0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9uICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDAgbXQtMSBtYXgtdy14bFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmRlc2NyaXB0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAge2xheW91dE1vZGUgPT09IFwiY2FyZHNcIiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtNCBtZDpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXBDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMiBtZDpwLTMgYmctemluYy05NTAvNjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT17Y2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdFBhcnQ9eyhwYXJ0SWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInNwYWNlLXktM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXBDYXRlZ29yaWVzLm1hcCgoY2F0ZWdvcnkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NhdGVnb3J5LmlkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyIGJvcmRlci16aW5jLTgwMCByb3VuZGVkLW1kIHAtMiBtZDpwLTMgYmctemluYy05NTAvNjAgZmxleCBmbGV4LWNvbCBtZDpmbGV4LXJvdyBtZDppdGVtcy1zdGFydCBtZDpqdXN0aWZ5LWJldHdlZW4gZ2FwLTNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYXRlZ29yeUNvbHVtblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeT17Y2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRJZD17YnVpbGRbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdFBhcnQ9eyhwYXJ0SWQpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIHsvKiBCdWlsZCBTdW1tYXJ5ICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBWaWV3IHlvdXIgYnVpbGQgYnJlYWtkb3duIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkNhdGVnb3J5Q29sdW1uIiwiUEFSVF9ST0xFX1RPX0NBVEVHT1JZIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlNUT1JBR0VfS0VZIiwiQ0FURUdPUllfR1JPVVBTIiwiaWQiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwiY2F0ZWdvcnlJZHMiLCJHdW5idWlsZGVyUGFnZSIsInNlYXJjaFBhcmFtcyIsInJvdXRlciIsInBhcnRzIiwic2V0UGFydHMiLCJsb2FkaW5nIiwic2V0TG9hZGluZyIsImVycm9yIiwic2V0RXJyb3IiLCJidWlsZCIsInNldEJ1aWxkIiwic3RvcmVkIiwibG9jYWxTdG9yYWdlIiwiZ2V0SXRlbSIsIkpTT04iLCJwYXJzZSIsImxheW91dE1vZGUiLCJzZXRMYXlvdXRNb2RlIiwiY29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsImZldGNoUHJvZHVjdHMiLCJyZXMiLCJmZXRjaCIsInNpZ25hbCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsIm5vcm1hbGl6ZWQiLCJtYXAiLCJwIiwiY2F0ZWdvcnlJZCIsInBhcnRSb2xlIiwiU3RyaW5nIiwibmFtZSIsImJyYW5kIiwicHJpY2UiLCJpbWFnZVVybCIsIm1haW5JbWFnZVVybCIsInVuZGVmaW5lZCIsInVybCIsImJ1eVVybCIsIm5vdGVzIiwiZmlsdGVyIiwiZXJyIiwibWVzc2FnZSIsImFib3J0Iiwic2VsZWN0UGFyYW0iLCJnZXQiLCJwYXJ0SWQiLCJzcGxpdCIsInNvbWUiLCJjIiwicHJldiIsInVwZGF0ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwicmVwbGFjZSIsInNjcm9sbCIsInBhcnRzQnlDYXRlZ29yeSIsImdyb3VwZWQiLCJjYXRlZ29yeSIsInNlbGVjdGVkUGFydHMiLCJPYmplY3QiLCJlbnRyaWVzIiwiZmluZCIsIkJvb2xlYW4iLCJ0b3RhbFByaWNlIiwicmVkdWNlIiwic3VtIiwiaGFuZGxlU2VsZWN0UGFydCIsInN1bW1hcnlDYXRlZ29yeU9yZGVyIiwiZmxhdE1hcCIsImdyb3VwIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsInNwYW4iLCJoZWFkZXIiLCJoMSIsInRvRml4ZWQiLCJsZW5ndGgiLCJzZWN0aW9uIiwiYnV0dG9uIiwidHlwZSIsIm9uQ2xpY2siLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsImgyIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJhc2lkZSIsInVsIiwiY2F0IiwicGFydCIsImxpIiwiaHJlZiIsInJlbW92ZUl0ZW0iLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); + +/***/ }), + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\nconst CATEGORY_TO_PART_ROLES = {\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert the map to get partRole → categoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVPLE1BQU1BLHlCQUF1RDtJQUNsRUMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxRQUFRO1FBQUM7S0FBUztJQUNsQkMsV0FBVztRQUFDO0tBQVk7SUFDeEJDLGdCQUFnQjtRQUFDO0tBQWtCO0lBQ25DQyxRQUFRO1FBQUM7S0FBYTtJQUN0QkMsWUFBWTtRQUFDO0tBQWtCO0lBQy9CQyxRQUFRO1FBQUM7S0FBUTtJQUNqQkMsT0FBTztRQUFDO0tBQWlCO0lBQ3pCQyxPQUFPO1FBQUM7S0FBUTtJQUNoQkMsT0FBTztRQUFDO0tBQVE7SUFDaEJDLFlBQVk7UUFBQztLQUFhO0FBRTVCLEVBQVc7QUFFWCw4Q0FBOEM7QUFDdkMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDZCx3QkFDUmUsTUFBTSxDQUFDLENBQUNDO1FBQUssQ0FBQ0MsWUFBWUMsTUFBTTtJQUMvQixLQUFLLE1BQU1DLFFBQVFELE1BQU87UUFDeEJGLEdBQUcsQ0FBQ0csS0FBSyxHQUFHRjtJQUNkO0lBQ0EsT0FBT0Q7QUFDVCxHQUFHLENBQUMsR0FBaUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9wYXJ0Um9sZU1hcHBpbmdzLnRzP2M2MjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDYXRlZ29yeUlkIH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgdXBwZXI6IFtcInVwcGVyLXJlY2VpdmVyXCJdLFxuICBiYXJyZWw6IFtcImJhcnJlbFwiXSxcbiAgaGFuZGd1YXJkOiBbXCJoYW5kZ3VhcmRcIl0sXG4gIGNoYXJnaW5nSGFuZGxlOiBbXCJjaGFyZ2luZy1oYW5kbGVcIl0sXG4gIGJ1ZmZlcjogW1wiYnVmZmVyLWtpdFwiXSxcbiAgbG93ZXJQYXJ0czogW1wibG93ZXItcGFydHMta2l0XCJdLFxuICBzaWdodHM6IFtcInNpZ2h0XCJdLFxuICBsb3dlcjogW1wibG93ZXItcmVjZWl2ZXJcIl0sXG4gIG9wdGljOiBbXCJvcHRpY1wiXSxcbiAgc3RvY2s6IFtcInN0b2NrXCJdLFxuICBzdXBwcmVzc29yOiBbXCJzdXBwcmVzc29yXCJdLFxuICAvLyBhZGQgbmV3IGNhdGVnb3JpZXMgaGVyZSBpbiBvbmUgcGxhY2Vcbn0gYXMgY29uc3Q7XG5cbi8vIEludmVydCB0aGUgbWFwIHRvIGdldCBwYXJ0Um9sZSDihpIgY2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwic3VwcHJlc3NvciIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsIk9iamVjdCIsImVudHJpZXMiLCJyZWR1Y2UiLCJhY2MiLCJjYXRlZ29yeUlkIiwicm9sZXMiLCJyb2xlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.c7be720f450ad784.hot-update.js b/.next/static/webpack/app/gunbuilder/page.c7be720f450ad784.hot-update.js new file mode 100644 index 0000000..ffd2d5e --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.c7be720f450ad784.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7QUFFTyxNQUFNQSxhQUF5QjtJQUNwQyxRQUFRO0lBQ1I7UUFDRUMsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFFQSxRQUFRO0lBQ1I7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0NBQ0QsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL2d1bmJ1aWxkZXJQYXJ0cy50cz83M2FlIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2F0ZWdvcnksIFBhcnQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SSUVTOiBDYXRlZ29yeVtdID0gW1xuICAvLyBMT1dFUlxuICB7XG4gICAgaWQ6IFwibG93ZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIExvd2VyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU2VyaWFsaXplZCBsb3dlciDigJMgdGhlIGZvdW5kYXRpb24gb2YgdGhlIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVMb3dlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgTG93ZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJGYWN0b3J5LWJ1aWx0IGxvd2VyIHdpdGggc3RvY2ssIGJ1ZmZlciBzeXN0ZW0sIGFuZCBjb250cm9scy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImxvd2VyUGFydHNcIixcbiAgICBuYW1lOiBcIkxvd2VyIFBhcnRzIEtpdFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlBpbnMsIHNwcmluZ3MsIGFuZCBjb250cm9scyBmb3IgdGhlIGxvd2VyLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidHJpZ2dlclwiLFxuICAgIG5hbWU6IFwiVHJpZ2dlciAvIEZpcmUgQ29udHJvbFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNpbmdsZS1zdGFnZSwgdHdvLXN0YWdlLCBhbmQgbWF0Y2ggdHJpZ2dlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJncmlwXCIsXG4gICAgbmFtZTogXCJQaXN0b2wgR3JpcFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkdyaXBzIHRoYXQgc2hhcGUgaG93IHRoZSByaWZsZSBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2FmZXR5XCIsXG4gICAgbmFtZTogXCJTYWZldHkgLyBTZWxlY3RvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFtYmkgc2VsZWN0b3JzIGFuZCBjb250cm9sIHVwZ3JhZGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYnVmZmVyXCIsXG4gICAgbmFtZTogXCJCdWZmZXIgU3lzdGVtXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQnVmZmVyIHR1YmUsIGJ1ZmZlciwgc3ByaW5nLCBhbmQgcmVsYXRlZCBwYXJ0cy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInN0b2NrXCIsXG4gICAgbmFtZTogXCJTdG9jayAvIEJyYWNlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQWRqdXN0YWJsZSwgZml4ZWQsIGFuZCBtaW5pbWFsaXN0IHN0b2Nrcy5cIixcbiAgfSxcblxuICAvLyBVUFBFUlxuICB7XG4gICAgaWQ6IFwidXBwZXJcIixcbiAgICBuYW1lOiBcIlN0cmlwcGVkIFVwcGVyIFJlY2VpdmVyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiVGhlIGNvcmUgb2YgdGhlIHRvcCBoYWxmIG9mIHlvdXIgYnVpbGQuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjb21wbGV0ZVVwcGVyXCIsXG4gICAgbmFtZTogXCJDb21wbGV0ZSBVcHBlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlByZS1hc3NlbWJsZWQgdXBwZXJzIHJlYWR5IHRvIHBpbiBhbmQgc2hvb3QuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJiY2dcIixcbiAgICBuYW1lOiBcIkJvbHQgQ2FycmllciBHcm91cFwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBoZWFydGJlYXQgb2YgdGhlIHJpZmxl4oCZcyBjeWNsaW5nLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsXCIsXG4gICAgbmFtZTogXCJCYXJyZWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJEaWZmZXJlbnQgbGVuZ3RocywgcHJvZmlsZXMsIGFuZCBjYWxpYmVycy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc0Jsb2NrXCIsXG4gICAgbmFtZTogXCJHYXMgQmxvY2tcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYWRqdXN0YWJsZSBnYXMgYmxvY2tzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ2FzVHViZVwiLFxuICAgIG5hbWU6IFwiR2FzIFR1YmVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJDYXJiaW5lLCBtaWQsIHJpZmxlLCBhbmQgbW9yZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm11enpsZURldmljZVwiLFxuICAgIG5hbWU6IFwiTXV6emxlIERldmljZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJyYWtlcywgY29tcHMsIGFuZCBmbGFzaCBoaWRlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdXBwcmVzc29yXCIsXG4gICAgbmFtZTogXCJTdXBwcmVzc29yXCIsXG4gICAgZGVzY3JpcHRpb246IFwiSGVhcmluZy1zYWZlIHNldHVwcyBhbmQgaG9zdHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJoYW5kZ3VhcmRcIixcbiAgICBuYW1lOiBcIkhhbmRndWFyZCAvIFJhaWxcIixcbiAgICBkZXNjcmlwdGlvbjogXCJNLUxPSyByYWlscyBhbmQgZnJvbnQtZW5kIGZ1cm5pdHVyZS5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgbmFtZTogXCJDaGFyZ2luZyBIYW5kbGVcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTdGFuZGFyZCBhbmQgYW1iaSBjaGFyZ2luZyBoYW5kbGVzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic2lnaHRzXCIsXG4gICAgbmFtZTogXCJJcm9uIFNpZ2h0c1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJhY2t1cCBhbmQgcHJpbWFyeSBpcm9ucy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljXCIsXG4gICAgbmFtZTogXCJPcHRpY1wiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkxQVk9zLCByZWQgZG90cywgYW5kIG1hZ25pZmllcnMuXCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.cda5e07aba3a17f4.hot-update.js b/.next/static/webpack/app/gunbuilder/page.cda5e07aba3a17f4.hot-update.js new file mode 100644 index 0000000..069b755 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.cda5e07aba3a17f4.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx": +/*!*********************************!*\ + !*** ./app/gunbuilder/page.tsx ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n // EXISTING\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\",\n // NEW LOWER PARTS\n trigger: \"trigger\",\n \"trigger-kit\": \"trigger\",\n \"pistol-grip\": \"grip\",\n grip: \"grip\",\n safety: \"safety\",\n \"safety-selector\": \"safety\",\n \"complete-lower\": \"completeLower\",\n // NEW UPPER PARTS\n \"complete-upper\": \"completeUpper\",\n bcg: \"bcg\",\n \"bolt-carrier-group\": \"bcg\",\n \"gas-block\": \"gasBlock\",\n \"gas-tube\": \"gasTube\",\n \"muzzle-device\": \"muzzleDevice\",\n compensator: \"muzzleDevice\",\n brake: \"muzzleDevice\",\n suppressor: \"suppressor\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 262,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 267,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 257,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 256,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 276,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 280,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 279,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 282,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 290,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 306,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 311,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 335,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 330,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 329,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 348,\n columnNumber: 29\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 344,\n columnNumber: 27\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 342,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 328,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 317,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 304,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 368,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 374,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 392,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 398,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 397,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 403,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 396,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 379,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 372,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 430,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 419,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 367,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 302,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 456,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 460,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 461,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 465,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 469,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 459,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 455,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 478,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 482,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 483,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 484,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 485,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 486,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 481,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 255,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Svlr/SlMEdeu/xZZnR5gKrepPAg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFUztJQWMzRFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU1JLHdCQUFvRDtJQUN4RCxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCQyxRQUFRO0lBQ1JDLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQkMsT0FBTztJQUNQLGtCQUFrQjtJQUNsQkMsT0FBTztJQUNQQyxPQUFPO0lBRVAsa0JBQWtCO0lBQ2xCQyxTQUFTO0lBQ1QsZUFBZTtJQUNmLGVBQWU7SUFDZkMsTUFBTTtJQUNOQyxRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUVsQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCQyxLQUFLO0lBQ0wsc0JBQXNCO0lBQ3RCLGFBQWE7SUFDYixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCQyxhQUFhO0lBQ2JDLE9BQU87SUFDUEMsWUFBWTtBQUNkO0FBSUEsTUFBTUMsY0FBYztBQUVwQiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGFBQWE7QUFDYix1REFBdUQ7QUFDdkQsb0RBQW9EO0FBQ3BELE1BQU1DLGtCQUtBO0lBQ0o7UUFDRUMsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtB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LDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTWhCO0dBNVh3QjNGOztRQUNEM0IsNERBQWVBO1FBQ3JCQyxzREFBU0E7OztLQUZGMEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5Q29sdW1uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtblwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbi8vIE1hcCBiYWNrZW5kIHBhcnRSb2xlIHRvIHlvdXIgZXhpc3RpbmcgQ2F0ZWdvcnlJZCB2YWx1ZXMuXG5jb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0ge1xuICAvLyBFWElTVElOR1xuICBcInVwcGVyLXJlY2VpdmVyXCI6IFwidXBwZXJcIixcbiAgYmFycmVsOiBcImJhcnJlbFwiLFxuICBoYW5kZ3VhcmQ6IFwiaGFuZGd1YXJkXCIsXG4gIFwiY2hhcmdpbmctaGFuZGxlXCI6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgXCJidWZmZXIta2l0XCI6IFwiYnVmZmVyXCIsXG4gIFwibG93ZXItcGFydHMta2l0XCI6IFwibG93ZXJQYXJ0c1wiLFxuICBzaWdodDogXCJzaWdodHNcIixcbiAgXCJsb3dlci1yZWNlaXZlclwiOiBcImxvd2VyXCIsXG4gIG9wdGljOiBcIm9wdGljXCIsXG4gIHN0b2NrOiBcInN0b2NrXCIsXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFwidHJpZ2dlclwiLFxuICBcInRyaWdnZXIta2l0XCI6IFwidHJpZ2dlclwiLFxuICBcInBpc3RvbC1ncmlwXCI6IFwiZ3JpcFwiLFxuICBncmlwOiBcImdyaXBcIixcbiAgc2FmZXR5OiBcInNhZmV0eVwiLFxuICBcInNhZmV0eS1zZWxlY3RvclwiOiBcInNhZmV0eVwiLFxuICBcImNvbXBsZXRlLWxvd2VyXCI6IFwiY29tcGxldGVMb3dlclwiLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBcImNvbXBsZXRlLXVwcGVyXCI6IFwiY29tcGxldGVVcHBlclwiLFxuICBiY2c6IFwiYmNnXCIsXG4gIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCI6IFwiYmNnXCIsXG4gIFwiZ2FzLWJsb2NrXCI6IFwiZ2FzQmxvY2tcIixcbiAgXCJnYXMtdHViZVwiOiBcImdhc1R1YmVcIixcbiAgXCJtdXp6bGUtZGV2aWNlXCI6IFwibXV6emxlRGV2aWNlXCIsXG4gIGNvbXBlbnNhdG9yOiBcIm11enpsZURldmljZVwiLFxuICBicmFrZTogXCJtdXp6bGVEZXZpY2VcIixcbiAgc3VwcHJlc3NvcjogXCJzdXBwcmVzc29yXCIsXG59O1xuXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjsgLy8gY2F0ZWdvcnlJZCAtPiBwYXJ0SWRcblxuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuLy8gR3JvdXAgY2F0ZWdvcmllcyBpbnRvIGxvZ2ljYWwgc2VjdGlvbnMuXG4vL1xuLy8gSU1QT1JUQU5UOlxuLy8gVGhlc2UgSURzIG11c3QgbWF0Y2ggdGhlIGlkcyB5b3UgaGF2ZSBpbiBDQVRFR09SSUVTLlxuLy8gQW55dGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IHdpbGwganVzdCBiZSBza2lwcGVkLlxuY29uc3QgQ0FURUdPUllfR1JPVVBTOiB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjYXRlZ29yeUlkczogQ2F0ZWdvcnlJZFtdO1xufVtdID0gW1xuICB7XG4gICAgaWQ6IFwibG93ZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJMb3dlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFdmVyeXRoaW5nIGZyb20gdGhlIHNlcmlhbGl6ZWQgbG93ZXIgdG8gc21hbGwgcGFydHMsIGZpcmUgY29udHJvbCwgYW5kIGNvcmUgY29udHJvbHMuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwibG93ZXJcIixcbiAgICAgIFwiY29tcGxldGVMb3dlclwiLFxuICAgICAgXCJsb3dlclBhcnRzXCIsXG4gICAgICBcInRyaWdnZXJcIixcbiAgICAgIFwiZ3JpcFwiLFxuICAgICAgXCJzYWZldHlcIixcbiAgICAgIFwiYnVmZmVyXCIsXG4gICAgICBcInN0b2NrXCIsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQmFycmVsLCB1cHBlciwgZ2FzIHN5c3RlbSwgYW5kIHRoZSBwYXJ0cyB0aGF0IGtlZXAgdGhlIHJpZmxlIGN5Y2xpbmcuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwidXBwZXJcIixcbiAgICAgIFwiY29tcGxldGVVcHBlclwiLFxuICAgICAgXCJiY2dcIixcbiAgICAgIFwiYmFycmVsXCIsXG4gICAgICBcImdhc0Jsb2NrXCIsXG4gICAgICBcImdhc1R1YmVcIixcbiAgICAgIFwibXV6emxlRGV2aWNlXCIsXG4gICAgICBcInN1cHByZXNzb3JcIixcbiAgICAgIFwiaGFuZGd1YXJkXCIsXG4gICAgICBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgICBcInNpZ2h0c1wiLFxuICAgICAgXCJvcHRpY1wiLFxuICAgIF0sXG4gIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHdW5idWlsZGVyUGFnZSgpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXNlU2VhcmNoUGFyYW1zKCk7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaFByb2R1Y3RzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlcj9wbGF0Zm9ybT1BUi0xNWAsXG4gICAgICAgICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGFcbiAgICAgICAgICAubWFwKChwKTogUGFydCB8IG51bGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZCA9IFBBUlRfUk9MRV9UT19DQVRFR09SWVtwLnBhcnRSb2xlXTtcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAvLyBTa2lwIGFueSBwYXJ0cyB3ZSBkb24ndCBrbm93IGhvdyB0byBtYXAgeWV0XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpZDogU3RyaW5nKHAuaWQpLCAvLyBBTFdBWVMgc3RyaW5nXG4gICAgICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIFBhcnQgPT4gcCAhPT0gbnVsbCk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaFByb2R1Y3RzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSGFuZGxlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgZm9yIHBhcnQgc2VsZWN0aW9uICg/c2VsZWN0PXVwcGVyOjE2NSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RQYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJzZWxlY3RcIik7XG4gICAgaWYgKHNlbGVjdFBhcmFtKSB7XG4gICAgICBjb25zdCBbY2F0ZWdvcnlJZCwgcGFydElkXSA9IHNlbGVjdFBhcmFtLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjYXRlZ29yeUlkICYmIHBhcnRJZCAmJiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpKSB7XG4gICAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBbY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZXIucmVwbGFjZShcIi9ndW5idWlsZGVyXCIsIHsgc2Nyb2xsOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzZWFyY2hQYXJhbXMsIHJvdXRlcl0pO1xuXG4gIC8vIFBlcnNpc3QgYnVpbGQgc3RhdGUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICBjb25zdCBwYXJ0c0J5Q2F0ZWdvcnk6IFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBlZCA9IHt9IGFzIFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+O1xuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgQ0FURUdPUklFUykge1xuICAgICAgZ3JvdXBlZFtjYXRlZ29yeS5pZF0gPSBwYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwKSA9PiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5LmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwZWQ7XG4gIH0sIFtwYXJ0c10pO1xuXG4gIGNvbnN0IHNlbGVjdGVkUGFydHM6IFBhcnRbXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZClcbiAgICAgIC5tYXAoKFtjYXRlZ29yeUlkLCBwYXJ0SWRdKSA9PlxuICAgICAgICBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBwYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeUlkKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgUGFydFtdO1xuICB9LCBbYnVpbGQsIHBhcnRzXSk7XG5cbiAgY29uc3QgdG90YWxQcmljZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gc2VsZWN0ZWRQYXJ0cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5wcmljZSwgMCksXG4gICAgW3NlbGVjdGVkUGFydHNdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gVXNlIGdyb3VwIG9yZGVyaW5nIGZvciB0aGUgc3VtbWFyeSBhcyB3ZWxsXG4gIGNvbnN0IHN1bW1hcnlDYXRlZ29yeU9yZGVyOiBDYXRlZ29yeUlkW10gPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBDQVRFR09SWV9HUk9VUFMuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLmNhdGVnb3J5SWRzKS5maWx0ZXIoXG4gICAgICAgIChpZCkgPT4gQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBpZCksXG4gICAgICApLFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYW1iZXItNTAwLzIwIGJnLWFtYmVyLTUwMC81XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBmbGV4IG1heC13LTZ4bCBmbGV4LWNvbCBnYXAtMSBweC00IHB5LTIgdGV4dC1bMC43NXJlbV0gdGV4dC1hbWJlci0xMDAgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJvdW5kZWQtc20gYmctYW1iZXItNTAwLzIwIHB4LTIgcHktMC41IHRleHQtWzAuNjVyZW1dIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE4ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIEVhcmx5IEFjY2VzcyBCZXRhXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gdGV4dC1hbWJlci0xMDAvOTAgbWQ6aW5saW5lXCI+XG4gICAgICAgICAgICAgIFlvdSZhcG9zO3JlIHVzaW5nIGFuIGVhcmx5LWFjY2VzcyBwcm90b3R5cGUgb2YgVGhlIEFybW9yeS4gRGF0YSxcbiAgICAgICAgICAgICAgcHJpY2luZywgYW5kIGF2YWlsYWJsZSBwYXJ0cyBhcmUgc3RpbGwgZXZvbHZpbmcuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0xMDAvOTAgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICBFYXJseS1hY2Nlc3MgcHJvdG90eXBlLiBEYXRhIGFuZCBwcmljaW5nIG1heSBjaGFuZ2UuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgVGhlIEFybW9yeTogPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5FYXJseSBBY2Nlc3M8L3NwYW4+XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgRXhwbG9yZSBjb21wb25lbnRzIGZyb20gdHJ1c3RlZCBicmFuZHMsIGNob29zZSBvbmUgcGFydCBwZXJcbiAgICAgICAgICAgICAgY2F0ZWdvcnksIHRyYWNrIGxpdmUgcHJpY2VzLCBhbmQgd2F0Y2ggeW91ciB0b3RhbCBidWlsZCBjb3N0XG4gICAgICAgICAgICAgIHVwZGF0ZSBhcyB5b3UgZ28uIFRoaXMgZWFybHktYWNjZXNzIGJ1aWxkZXIga2VlcHMgeW91ciBzZXR1cCBzYXZlZFxuICAgICAgICAgICAgICBsb2NhbGx5IHNvIHlvdSBjYW4gY29tZSBiYWNrIGFuZCByZWZpbmUgaXQgYW55dGltZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMyBtZDptdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMFwiPkN1cnJlbnQgYnVpbGQgdG90YWw8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICAke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RofSAvIHtDQVRFR09SSUVTLmxlbmd0aH0gY2F0ZWdvcmllcyBmaWxsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogTGF5b3V0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbGc6Z3JpZC1jb2xzLVszZnIsMS4yNWZyXVwiPlxuICAgICAgICAgIHsvKiBDYXRlZ29yaWVzL3BhcnRzICovfVxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgICB7bG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIExvYWRpbmcgcGFydHMgZnJvbSBiYWNrZW5k4oCmXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7ZXJyb3IgJiYgIWxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMFwiPlxuICAgICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZyBhbmQgQ09SUyBpc1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAgICB7Q0FURUdPUllfR1JPVVBTLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2F0ZWdvcmllcyA9IENBVEVHT1JJRVMuZmlsdGVyKChjKSA9PlxuICAgICAgICAgICAgICAgICAgICBncm91cC5jYXRlZ29yeUlkcy5pbmNsdWRlcyhjLmlkIGFzIENhdGVnb3J5SWQpLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtncm91cC5pZH0gY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGp1c3RpZnktYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMCBtdC0xIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0yIG1kOnAtMyBiZy16aW5jLTk1MC82MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXtjYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0SWQ9e2J1aWxkW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0UGFydD17KHBhcnRJZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIHsvKiBCdWlsZCBTdW1tYXJ5ICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBWaWV3IHlvdXIgYnVpbGQgYnJlYWtkb3duIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkNhdGVnb3J5Q29sdW1uIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsImJhcnJlbCIsImhhbmRndWFyZCIsInNpZ2h0Iiwib3B0aWMiLCJzdG9jayIsInRyaWdnZXIiLCJncmlwIiwic2FmZXR5IiwiYmNnIiwiY29tcGVuc2F0b3IiLCJicmFrZSIsInN1cHByZXNzb3IiLCJTVE9SQUdFX0tFWSIsIkNBVEVHT1JZX0dST1VQUyIsImlkIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImNhdGVnb3J5SWRzIiwiR3VuYnVpbGRlclBhZ2UiLCJzZWFyY2hQYXJhbXMiLCJyb3V0ZXIiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hQcm9kdWN0cyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJjYXRlZ29yeUlkIiwicGFydFJvbGUiLCJTdHJpbmciLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwidXJsIiwiYnV5VXJsIiwibm90ZXMiLCJmaWx0ZXIiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZWxlY3RQYXJhbSIsImdldCIsInBhcnRJZCIsInNwbGl0Iiwic29tZSIsImMiLCJwcmV2IiwidXBkYXRlZCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJyZXBsYWNlIiwic2Nyb2xsIiwicGFydHNCeUNhdGVnb3J5IiwiZ3JvdXBlZCIsImNhdGVnb3J5Iiwic2VsZWN0ZWRQYXJ0cyIsIk9iamVjdCIsImVudHJpZXMiLCJmaW5kIiwiQm9vbGVhbiIsInRvdGFsUHJpY2UiLCJyZWR1Y2UiLCJzdW0iLCJoYW5kbGVTZWxlY3RQYXJ0Iiwic3VtbWFyeUNhdGVnb3J5T3JkZXIiLCJmbGF0TWFwIiwiZ3JvdXAiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2Iiwic3BhbiIsImhlYWRlciIsImgxIiwidG9GaXhlZCIsImxlbmd0aCIsInNlY3Rpb24iLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsImgyIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJhc2lkZSIsInVsIiwiY2F0IiwicGFydCIsImxpIiwiaHJlZiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwicmVtb3ZlSXRlbSIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.e6ab26d29cc9c4c8.hot-update.js b/.next/static/webpack/app/gunbuilder/page.e6ab26d29cc9c4c8.hot-update.js new file mode 100644 index 0000000..950289d --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.e6ab26d29cc9c4c8.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/partRoleMappings.ts": +/*!**********************************!*\ + !*** ./data/partRoleMappings.ts ***! + \**********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORY_TO_PART_ROLES: function() { return /* binding */ CATEGORY_TO_PART_ROLES; },\n/* harmony export */ PART_ROLE_TO_CATEGORY: function() { return /* binding */ PART_ROLE_TO_CATEGORY; }\n/* harmony export */ });\n// CategoryId -> partRoles\nconst CATEGORY_TO_PART_ROLES = {\n // CORE / EXISTING\n upper: [\n \"upper-receiver\"\n ],\n barrel: [\n \"barrel\"\n ],\n handguard: [\n \"handguard\"\n ],\n chargingHandle: [\n \"charging-handle\"\n ],\n buffer: [\n \"buffer-kit\"\n ],\n lowerParts: [\n \"lower-parts-kit\"\n ],\n sights: [\n \"sight\"\n ],\n lower: [\n \"lower-receiver\"\n ],\n optic: [\n \"optic\"\n ],\n stock: [\n \"stock\"\n ],\n // NEW LOWER PARTS\n trigger: [\n \"trigger\",\n \"trigger-kit\"\n ],\n grip: [\n \"pistol-grip\",\n \"grip\"\n ],\n safety: [\n \"safety\",\n \"safety-selector\"\n ],\n completeLower: [\n \"complete-lower\"\n ],\n // NEW UPPER PARTS\n completeUpper: [\n \"complete-upper\"\n ],\n bcg: [\n \"bcg\",\n \"bolt-carrier-group\"\n ],\n gasBlock: [\n \"gas-block\"\n ],\n gasTube: [\n \"gas-tube\"\n ],\n muzzleDevice: [\n \"muzzle-device\",\n \"compensator\",\n \"brake\"\n ],\n suppressor: [\n \"suppressor\"\n ]\n};\n// Invert to get partRole -> CategoryId\nconst PART_ROLE_TO_CATEGORY = Object.entries(CATEGORY_TO_PART_ROLES).reduce((acc, param)=>{\n let [categoryId, roles] = param;\n for (const role of roles){\n acc[role] = categoryId;\n }\n return acc;\n}, {});\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvcGFydFJvbGVNYXBwaW5ncy50cyIsIm1hcHBpbmdzIjoiOzs7OztBQUVBLDBCQUEwQjtBQUNuQixNQUFNQSx5QkFBdUQ7SUFDbEUsa0JBQWtCO0lBQ2xCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLFFBQVE7UUFBQztLQUFTO0lBQ2xCQyxXQUFXO1FBQUM7S0FBWTtJQUN4QkMsZ0JBQWdCO1FBQUM7S0FBa0I7SUFDbkNDLFFBQVE7UUFBQztLQUFhO0lBQ3RCQyxZQUFZO1FBQUM7S0FBa0I7SUFDL0JDLFFBQVE7UUFBQztLQUFRO0lBQ2pCQyxPQUFPO1FBQUM7S0FBaUI7SUFDekJDLE9BQU87UUFBQztLQUFRO0lBQ2hCQyxPQUFPO1FBQUM7S0FBUTtJQUVoQixrQkFBa0I7SUFDbEJDLFNBQVM7UUFBQztRQUFXO0tBQWM7SUFDbkNDLE1BQU07UUFBQztRQUFlO0tBQU87SUFDN0JDLFFBQVE7UUFBQztRQUFVO0tBQWtCO0lBQ3JDQyxlQUFlO1FBQUM7S0FBaUI7SUFFakMsa0JBQWtCO0lBQ2xCQyxlQUFlO1FBQUM7S0FBaUI7SUFDakNDLEtBQUs7UUFBQztRQUFPO0tBQXFCO0lBQ2xDQyxVQUFVO1FBQUM7S0FBWTtJQUN2QkMsU0FBUztRQUFDO0tBQVc7SUFDckJDLGNBQWM7UUFBQztRQUFpQjtRQUFlO0tBQVE7SUFDdkRDLFlBQVk7UUFBQztLQUFhO0FBQzVCLEVBQUU7QUFFRix1Q0FBdUM7QUFDaEMsTUFBTUMsd0JBQW9EQyxPQUM5REMsT0FBTyxDQUFDdkIsd0JBQ1J3QixNQUFNLENBQUMsQ0FBQ0M7UUFBSyxDQUFDQyxZQUFZQyxNQUFNO0lBQy9CLEtBQUssTUFBTUMsUUFBUUQsTUFBTztRQUN4QkYsR0FBRyxDQUFDRyxLQUFLLEdBQUdGO0lBQ2Q7SUFDQSxPQUFPRDtBQUNULEdBQUcsQ0FBQyxHQUFpQyIsInNvdXJjZXMiOlsid2VicGFjazovL19OX0UvLi9kYXRhL3BhcnRSb2xlTWFwcGluZ3MudHM/YzYyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5SWQgfSBmcm9tIFwiQC90eXBlcy9ndW5idWlsZGVyXCI7XG5cbi8vIENhdGVnb3J5SWQgLT4gcGFydFJvbGVzXG5leHBvcnQgY29uc3QgQ0FURUdPUllfVE9fUEFSVF9ST0xFUzogUmVjb3JkPENhdGVnb3J5SWQsIHN0cmluZ1tdPiA9IHtcbiAgLy8gQ09SRSAvIEVYSVNUSU5HXG4gIHVwcGVyOiBbXCJ1cHBlci1yZWNlaXZlclwiXSxcbiAgYmFycmVsOiBbXCJiYXJyZWxcIl0sXG4gIGhhbmRndWFyZDogW1wiaGFuZGd1YXJkXCJdLFxuICBjaGFyZ2luZ0hhbmRsZTogW1wiY2hhcmdpbmctaGFuZGxlXCJdLFxuICBidWZmZXI6IFtcImJ1ZmZlci1raXRcIl0sXG4gIGxvd2VyUGFydHM6IFtcImxvd2VyLXBhcnRzLWtpdFwiXSxcbiAgc2lnaHRzOiBbXCJzaWdodFwiXSxcbiAgbG93ZXI6IFtcImxvd2VyLXJlY2VpdmVyXCJdLFxuICBvcHRpYzogW1wib3B0aWNcIl0sXG4gIHN0b2NrOiBbXCJzdG9ja1wiXSxcblxuICAvLyBORVcgTE9XRVIgUEFSVFNcbiAgdHJpZ2dlcjogW1widHJpZ2dlclwiLCBcInRyaWdnZXIta2l0XCJdLFxuICBncmlwOiBbXCJwaXN0b2wtZ3JpcFwiLCBcImdyaXBcIl0sXG4gIHNhZmV0eTogW1wic2FmZXR5XCIsIFwic2FmZXR5LXNlbGVjdG9yXCJdLFxuICBjb21wbGV0ZUxvd2VyOiBbXCJjb21wbGV0ZS1sb3dlclwiXSxcblxuICAvLyBORVcgVVBQRVIgUEFSVFNcbiAgY29tcGxldGVVcHBlcjogW1wiY29tcGxldGUtdXBwZXJcIl0sXG4gIGJjZzogW1wiYmNnXCIsIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCJdLFxuICBnYXNCbG9jazogW1wiZ2FzLWJsb2NrXCJdLFxuICBnYXNUdWJlOiBbXCJnYXMtdHViZVwiXSxcbiAgbXV6emxlRGV2aWNlOiBbXCJtdXp6bGUtZGV2aWNlXCIsIFwiY29tcGVuc2F0b3JcIiwgXCJicmFrZVwiXSxcbiAgc3VwcHJlc3NvcjogW1wic3VwcHJlc3NvclwiXSxcbn07XG5cbi8vIEludmVydCB0byBnZXQgcGFydFJvbGUgLT4gQ2F0ZWdvcnlJZFxuZXhwb3J0IGNvbnN0IFBBUlRfUk9MRV9UT19DQVRFR09SWTogUmVjb3JkPHN0cmluZywgQ2F0ZWdvcnlJZD4gPSBPYmplY3RcbiAgLmVudHJpZXMoQ0FURUdPUllfVE9fUEFSVF9ST0xFUylcbiAgLnJlZHVjZSgoYWNjLCBbY2F0ZWdvcnlJZCwgcm9sZXNdKSA9PiB7XG4gICAgZm9yIChjb25zdCByb2xlIG9mIHJvbGVzKSB7XG4gICAgICBhY2Nbcm9sZV0gPSBjYXRlZ29yeUlkIGFzIENhdGVnb3J5SWQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+KTsiXSwibmFtZXMiOlsiQ0FURUdPUllfVE9fUEFSVF9ST0xFUyIsInVwcGVyIiwiYmFycmVsIiwiaGFuZGd1YXJkIiwiY2hhcmdpbmdIYW5kbGUiLCJidWZmZXIiLCJsb3dlclBhcnRzIiwic2lnaHRzIiwibG93ZXIiLCJvcHRpYyIsInN0b2NrIiwidHJpZ2dlciIsImdyaXAiLCJzYWZldHkiLCJjb21wbGV0ZUxvd2VyIiwiY29tcGxldGVVcHBlciIsImJjZyIsImdhc0Jsb2NrIiwiZ2FzVHViZSIsIm11enpsZURldmljZSIsInN1cHByZXNzb3IiLCJQQVJUX1JPTEVfVE9fQ0FURUdPUlkiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjIiwiY2F0ZWdvcnlJZCIsInJvbGVzIiwicm9sZSJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/partRoleMappings.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/page.f984af7569671cf9.hot-update.js b/.next/static/webpack/app/gunbuilder/page.f984af7569671cf9.hot-update.js new file mode 100644 index 0000000..7756294 --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/page.f984af7569671cf9.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{ + +/***/ "(app-pages-browser)/./data/gunbuilderParts.ts": +/*!*********************************!*\ + !*** ./data/gunbuilderParts.ts ***! + \*********************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ CATEGORIES: function() { return /* binding */ CATEGORIES; },\n/* harmony export */ PARTS: function() { return /* binding */ PARTS; }\n/* harmony export */ });\nconst CATEGORIES = [\n // LOWER\n {\n id: \"lower\",\n name: \"Stripped Lower Receiver\",\n description: \"Serialized lower – the foundation of the build.\"\n },\n {\n id: \"completeLower\",\n name: \"Complete Lower\",\n description: \"Factory-built lower with stock, buffer system, and controls.\"\n },\n {\n id: \"lowerParts\",\n name: \"Lower Parts Kit\",\n description: \"Pins, springs, and controls for the lower.\"\n },\n {\n id: \"trigger\",\n name: \"Trigger / Fire Control\",\n description: \"Single-stage, two-stage, and match triggers.\"\n },\n {\n id: \"grip\",\n name: \"Pistol Grip\",\n description: \"Grips that shape how the rifle handles.\"\n },\n {\n id: \"safety\",\n name: \"Safety / Selector\",\n description: \"Ambi selectors and control upgrades.\"\n },\n {\n id: \"buffer\",\n name: \"Buffer System\",\n description: \"Buffer tube, buffer, spring, and related parts.\"\n },\n {\n id: \"stock\",\n name: \"Stock / Brace\",\n description: \"Adjustable, fixed, and minimalist stocks.\"\n },\n // UPPER\n {\n id: \"upper\",\n name: \"Stripped Upper Receiver\",\n description: \"The core of the top half of your build.\"\n },\n {\n id: \"completeUpper\",\n name: \"Complete Upper\",\n description: \"Pre-assembled uppers ready to pin and shoot.\"\n },\n {\n id: \"bcg\",\n name: \"Bolt Carrier Group\",\n description: \"The heartbeat of the rifle’s cycling.\"\n },\n {\n id: \"barrel\",\n name: \"Barrel\",\n description: \"Different lengths, profiles, and calibers.\"\n },\n {\n id: \"gasBlock\",\n name: \"Gas Block\",\n description: \"Standard and adjustable gas blocks.\"\n },\n {\n id: \"gasTube\",\n name: \"Gas Tube\",\n description: \"Carbine, mid, rifle, and more.\"\n },\n {\n id: \"muzzleDevice\",\n name: \"Muzzle Device\",\n description: \"Brakes, comps, and flash hiders.\"\n },\n {\n id: \"suppressor\",\n name: \"Suppressor\",\n description: \"Hearing-safe setups and hosts.\"\n },\n {\n id: \"handguard\",\n name: \"Handguard / Rail\",\n description: \"M-LOK rails and front-end furniture.\"\n },\n {\n id: \"chargingHandle\",\n name: \"Charging Handle\",\n description: \"Standard and ambi charging handles.\"\n },\n {\n id: \"sights\",\n name: \"Iron Sights\",\n description: \"Backup and primary irons.\"\n },\n {\n id: \"optic\",\n name: \"Optic\",\n description: \"LPVOs, red dots, and magnifiers.\"\n }\n];\nconst PARTS = [\n {\n id: \"lower-aero-m4e1\",\n name: \"M4E1 Stripped Lower Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"lower\",\n price: 129.99,\n affiliateUrl: \"https://example.com/aero-m4e1\",\n notes: \"Forged 7075-T6, threaded bolt catch\"\n },\n {\n id: \"lower-solgw\",\n name: \"Loyal 9 Stripped Lower\",\n brand: \"Sons of Liberty Gun Works\",\n categoryId: \"lower\",\n price: 189.0,\n affiliateUrl: \"https://example.com/solgw-lower\"\n },\n {\n id: \"upper-aero-enhanced\",\n name: \"Enhanced Upper Receiver\",\n brand: \"Aero Precision\",\n categoryId: \"upper\",\n price: 149.99,\n affiliateUrl: \"https://example.com/aero-enhanced-upper\"\n },\n {\n id: \"upper-bcm-m4\",\n name: \"M4 Upper Receiver\",\n brand: \"BCM\",\n categoryId: \"upper\",\n price: 159.99,\n affiliateUrl: \"https://example.com/bcm-m4-upper\"\n },\n {\n id: \"barrel-criterion-16\",\n name: '16\" Hybrid Barrel',\n brand: \"Criterion\",\n categoryId: \"barrel\",\n price: 279.99,\n affiliateUrl: \"https://example.com/criterion-16\",\n notes: \"Mid-length gas, chrome-lined\"\n },\n {\n id: \"barrel-ba-13-9\",\n name: '13.9\" Hanson Performance Series',\n brand: \"Ballistic Advantage\",\n categoryId: \"barrel\",\n price: 209.99,\n affiliateUrl: \"https://example.com/ba-13-9\"\n },\n {\n id: \"hg-geissele-mk8\",\n name: 'MK8 Rail 13.5\"',\n brand: \"Geissele\",\n categoryId: \"handguard\",\n price: 324.99,\n affiliateUrl: \"https://example.com/geissele-mk8\"\n },\n {\n id: \"hg-centurion-c4\",\n name: 'C4 M-LOK 12\"',\n brand: \"Centurion Arms\",\n categoryId: \"handguard\",\n price: 284.99,\n affiliateUrl: \"https://example.com/centurion-c4\"\n },\n {\n id: \"stock-b5-bravo\",\n name: \"BRAVO Stock\",\n brand: \"B5 Systems\",\n categoryId: \"stock\",\n price: 74.99,\n affiliateUrl: \"https://example.com/b5-bravo\"\n },\n {\n id: \"stock-magpul-sl\",\n name: \"MOE SL Carbine Stock\",\n brand: \"Magpul\",\n categoryId: \"stock\",\n price: 69.99,\n affiliateUrl: \"https://example.com/magpul-sl\"\n },\n {\n id: \"optic-eotech-exps3\",\n name: \"EXPS3 Holographic Sight\",\n brand: \"EOTECH\",\n categoryId: \"optic\",\n price: 749.0,\n affiliateUrl: \"https://example.com/eotech-exps3\"\n },\n {\n id: \"optic-holosun-509t\",\n name: \"HE509T Red Dot\",\n brand: \"Holosun\",\n categoryId: \"optic\",\n price: 349.99,\n affiliateUrl: \"https://example.com/holosun-509t\"\n }\n];\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2RhdGEvZ3VuYnVpbGRlclBhcnRzLnRzIiwibWFwcGluZ3MiOiI7Ozs7O0FBRU8sTUFBTUEsYUFBeUI7SUFDcEMsUUFBUTtJQUNSO1FBQ0VDLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBRUEsUUFBUTtJQUNSO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtJQUNBO1FBQ0VGLElBQUk7UUFDSkMsTUFBTTtRQUNOQyxhQUFhO0lBQ2Y7SUFDQTtRQUNFRixJQUFJO1FBQ0pDLE1BQU07UUFDTkMsYUFBYTtJQUNmO0lBQ0E7UUFDRUYsSUFBSTtRQUNKQyxNQUFNO1FBQ05DLGFBQWE7SUFDZjtDQUNELENBQUM7QUFFSyxNQUFNQyxRQUFnQjtJQUMzQjtRQUNFSCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztRQUNkQyxPQUFPO0lBQ1Q7SUFDQTtRQUNFUixJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtJQUNBO1FBQ0VQLElBQUk7UUFDSkMsTUFBTTtRQUNORyxPQUFPO1FBQ1BDLFlBQVk7UUFDWkMsT0FBTztRQUNQQyxjQUFjO0lBQ2hCO0lBQ0E7UUFDRVAsSUFBSTtRQUNKQyxNQUFNO1FBQ05HLE9BQU87UUFDUEMsWUFBWTtRQUNaQyxPQUFPO1FBQ1BDLGNBQWM7SUFDaEI7SUFDQTtRQUNFUCxJQUFJO1FBQ0pDLE1BQU07UUFDTkcsT0FBTztRQUNQQyxZQUFZO1FBQ1pDLE9BQU87UUFDUEMsY0FBYztJQUNoQjtDQUNELENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vZGF0YS9ndW5idWlsZGVyUGFydHMudHM/NzNhZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENhdGVnb3J5LCBQYXJ0IH0gZnJvbSBcIkAvdHlwZXMvZ3VuYnVpbGRlclwiO1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUklFUzogQ2F0ZWdvcnlbXSA9IFtcbiAgLy8gTE9XRVJcbiAge1xuICAgIGlkOiBcImxvd2VyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBMb3dlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlNlcmlhbGl6ZWQgbG93ZXIg4oCTIHRoZSBmb3VuZGF0aW9uIG9mIHRoZSBidWlsZC5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImNvbXBsZXRlTG93ZXJcIixcbiAgICBuYW1lOiBcIkNvbXBsZXRlIExvd2VyXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRmFjdG9yeS1idWlsdCBsb3dlciB3aXRoIHN0b2NrLCBidWZmZXIgc3lzdGVtLCBhbmQgY29udHJvbHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlclBhcnRzXCIsXG4gICAgbmFtZTogXCJMb3dlciBQYXJ0cyBLaXRcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQaW5zLCBzcHJpbmdzLCBhbmQgY29udHJvbHMgZm9yIHRoZSBsb3dlci5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInRyaWdnZXJcIixcbiAgICBuYW1lOiBcIlRyaWdnZXIgLyBGaXJlIENvbnRyb2xcIixcbiAgICBkZXNjcmlwdGlvbjogXCJTaW5nbGUtc3RhZ2UsIHR3by1zdGFnZSwgYW5kIG1hdGNoIHRyaWdnZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiZ3JpcFwiLFxuICAgIG5hbWU6IFwiUGlzdG9sIEdyaXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJHcmlwcyB0aGF0IHNoYXBlIGhvdyB0aGUgcmlmbGUgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNhZmV0eVwiLFxuICAgIG5hbWU6IFwiU2FmZXR5IC8gU2VsZWN0b3JcIixcbiAgICBkZXNjcmlwdGlvbjogXCJBbWJpIHNlbGVjdG9ycyBhbmQgY29udHJvbCB1cGdyYWRlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJ1ZmZlclwiLFxuICAgIG5hbWU6IFwiQnVmZmVyIFN5c3RlbVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkJ1ZmZlciB0dWJlLCBidWZmZXIsIHNwcmluZywgYW5kIHJlbGF0ZWQgcGFydHMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9ja1wiLFxuICAgIG5hbWU6IFwiU3RvY2sgLyBCcmFjZVwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkFkanVzdGFibGUsIGZpeGVkLCBhbmQgbWluaW1hbGlzdCBzdG9ja3MuXCIsXG4gIH0sXG5cbiAgLy8gVVBQRVJcbiAge1xuICAgIGlkOiBcInVwcGVyXCIsXG4gICAgbmFtZTogXCJTdHJpcHBlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIlRoZSBjb3JlIG9mIHRoZSB0b3AgaGFsZiBvZiB5b3VyIGJ1aWxkLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiY29tcGxldGVVcHBlclwiLFxuICAgIG5hbWU6IFwiQ29tcGxldGUgVXBwZXJcIixcbiAgICBkZXNjcmlwdGlvbjogXCJQcmUtYXNzZW1ibGVkIHVwcGVycyByZWFkeSB0byBwaW4gYW5kIHNob290LlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmNnXCIsXG4gICAgbmFtZTogXCJCb2x0IENhcnJpZXIgR3JvdXBcIixcbiAgICBkZXNjcmlwdGlvbjogXCJUaGUgaGVhcnRiZWF0IG9mIHRoZSByaWZsZeKAmXMgY3ljbGluZy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImJhcnJlbFwiLFxuICAgIG5hbWU6IFwiQmFycmVsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiRGlmZmVyZW50IGxlbmd0aHMsIHByb2ZpbGVzLCBhbmQgY2FsaWJlcnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJnYXNCbG9ja1wiLFxuICAgIG5hbWU6IFwiR2FzIEJsb2NrXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFkanVzdGFibGUgZ2FzIGJsb2Nrcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImdhc1R1YmVcIixcbiAgICBuYW1lOiBcIkdhcyBUdWJlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiQ2FyYmluZSwgbWlkLCByaWZsZSwgYW5kIG1vcmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJtdXp6bGVEZXZpY2VcIixcbiAgICBuYW1lOiBcIk11enpsZSBEZXZpY2VcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCcmFrZXMsIGNvbXBzLCBhbmQgZmxhc2ggaGlkZXJzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3VwcHJlc3NvclwiLFxuICAgIG5hbWU6IFwiU3VwcHJlc3NvclwiLFxuICAgIGRlc2NyaXB0aW9uOiBcIkhlYXJpbmctc2FmZSBzZXR1cHMgYW5kIGhvc3RzLlwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgbmFtZTogXCJIYW5kZ3VhcmQgLyBSYWlsXCIsXG4gICAgZGVzY3JpcHRpb246IFwiTS1MT0sgcmFpbHMgYW5kIGZyb250LWVuZCBmdXJuaXR1cmUuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJjaGFyZ2luZ0hhbmRsZVwiLFxuICAgIG5hbWU6IFwiQ2hhcmdpbmcgSGFuZGxlXCIsXG4gICAgZGVzY3JpcHRpb246IFwiU3RhbmRhcmQgYW5kIGFtYmkgY2hhcmdpbmcgaGFuZGxlcy5cIixcbiAgfSxcbiAge1xuICAgIGlkOiBcInNpZ2h0c1wiLFxuICAgIG5hbWU6IFwiSXJvbiBTaWdodHNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJCYWNrdXAgYW5kIHByaW1hcnkgaXJvbnMuXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpY1wiLFxuICAgIG5hbWU6IFwiT3B0aWNcIixcbiAgICBkZXNjcmlwdGlvbjogXCJMUFZPcywgcmVkIGRvdHMsIGFuZCBtYWduaWZpZXJzLlwiLFxuICB9LFxuXTtcblxuZXhwb3J0IGNvbnN0IFBBUlRTOiBQYXJ0W10gPSBbXG4gIHtcbiAgICBpZDogXCJsb3dlci1hZXJvLW00ZTFcIixcbiAgICBuYW1lOiBcIk00RTEgU3RyaXBwZWQgTG93ZXIgUmVjZWl2ZXJcIixcbiAgICBicmFuZDogXCJBZXJvIFByZWNpc2lvblwiLFxuICAgIGNhdGVnb3J5SWQ6IFwibG93ZXJcIixcbiAgICBwcmljZTogMTI5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2Flcm8tbTRlMVwiLFxuICAgIG5vdGVzOiBcIkZvcmdlZCA3MDc1LVQ2LCB0aHJlYWRlZCBib2x0IGNhdGNoXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJsb3dlci1zb2xnd1wiLFxuICAgIG5hbWU6IFwiTG95YWwgOSBTdHJpcHBlZCBMb3dlclwiLFxuICAgIGJyYW5kOiBcIlNvbnMgb2YgTGliZXJ0eSBHdW4gV29ya3NcIixcbiAgICBjYXRlZ29yeUlkOiBcImxvd2VyXCIsXG4gICAgcHJpY2U6IDE4OS4wLFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL3NvbGd3LWxvd2VyXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJ1cHBlci1hZXJvLWVuaGFuY2VkXCIsXG4gICAgbmFtZTogXCJFbmhhbmNlZCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkFlcm8gUHJlY2lzaW9uXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJ1cHBlclwiLFxuICAgIHByaWNlOiAxNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vYWVyby1lbmhhbmNlZC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwidXBwZXItYmNtLW00XCIsXG4gICAgbmFtZTogXCJNNCBVcHBlciBSZWNlaXZlclwiLFxuICAgIGJyYW5kOiBcIkJDTVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwidXBwZXJcIixcbiAgICBwcmljZTogMTU5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JjbS1tNC11cHBlclwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWNyaXRlcmlvbi0xNlwiLFxuICAgIG5hbWU6IFwiMTZcXFwiIEh5YnJpZCBCYXJyZWxcIixcbiAgICBicmFuZDogXCJDcml0ZXJpb25cIixcbiAgICBjYXRlZ29yeUlkOiBcImJhcnJlbFwiLFxuICAgIHByaWNlOiAyNzkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY3JpdGVyaW9uLTE2XCIsXG4gICAgbm90ZXM6IFwiTWlkLWxlbmd0aCBnYXMsIGNocm9tZS1saW5lZFwiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwiYmFycmVsLWJhLTEzLTlcIixcbiAgICBuYW1lOiBcIjEzLjlcXFwiIEhhbnNvbiBQZXJmb3JtYW5jZSBTZXJpZXNcIixcbiAgICBicmFuZDogXCJCYWxsaXN0aWMgQWR2YW50YWdlXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJiYXJyZWxcIixcbiAgICBwcmljZTogMjA5Ljk5LFxuICAgIGFmZmlsaWF0ZVVybDogXCJodHRwczovL2V4YW1wbGUuY29tL2JhLTEzLTlcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWdlaXNzZWxlLW1rOFwiLFxuICAgIG5hbWU6IFwiTUs4IFJhaWwgMTMuNVxcXCJcIixcbiAgICBicmFuZDogXCJHZWlzc2VsZVwiLFxuICAgIGNhdGVnb3J5SWQ6IFwiaGFuZGd1YXJkXCIsXG4gICAgcHJpY2U6IDMyNC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9nZWlzc2VsZS1tazhcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcImhnLWNlbnR1cmlvbi1jNFwiLFxuICAgIG5hbWU6IFwiQzQgTS1MT0sgMTJcXFwiXCIsXG4gICAgYnJhbmQ6IFwiQ2VudHVyaW9uIEFybXNcIixcbiAgICBjYXRlZ29yeUlkOiBcImhhbmRndWFyZFwiLFxuICAgIHByaWNlOiAyODQuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vY2VudHVyaW9uLWM0XCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJzdG9jay1iNS1icmF2b1wiLFxuICAgIG5hbWU6IFwiQlJBVk8gU3RvY2tcIixcbiAgICBicmFuZDogXCJCNSBTeXN0ZW1zXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJzdG9ja1wiLFxuICAgIHByaWNlOiA3NC45OSxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9iNS1icmF2b1wiLFxuICB9LFxuICB7XG4gICAgaWQ6IFwic3RvY2stbWFncHVsLXNsXCIsXG4gICAgbmFtZTogXCJNT0UgU0wgQ2FyYmluZSBTdG9ja1wiLFxuICAgIGJyYW5kOiBcIk1hZ3B1bFwiLFxuICAgIGNhdGVnb3J5SWQ6IFwic3RvY2tcIixcbiAgICBwcmljZTogNjkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vbWFncHVsLXNsXCIsXG4gIH0sXG4gIHtcbiAgICBpZDogXCJvcHRpYy1lb3RlY2gtZXhwczNcIixcbiAgICBuYW1lOiBcIkVYUFMzIEhvbG9ncmFwaGljIFNpZ2h0XCIsXG4gICAgYnJhbmQ6IFwiRU9URUNIXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiA3NDkuMCxcbiAgICBhZmZpbGlhdGVVcmw6IFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9lb3RlY2gtZXhwczNcIixcbiAgfSxcbiAge1xuICAgIGlkOiBcIm9wdGljLWhvbG9zdW4tNTA5dFwiLFxuICAgIG5hbWU6IFwiSEU1MDlUIFJlZCBEb3RcIixcbiAgICBicmFuZDogXCJIb2xvc3VuXCIsXG4gICAgY2F0ZWdvcnlJZDogXCJvcHRpY1wiLFxuICAgIHByaWNlOiAzNDkuOTksXG4gICAgYWZmaWxpYXRlVXJsOiBcImh0dHBzOi8vZXhhbXBsZS5jb20vaG9sb3N1bi01MDl0XCIsXG4gIH0sXG5dO1xuIl0sIm5hbWVzIjpbIkNBVEVHT1JJRVMiLCJpZCIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIlBBUlRTIiwiYnJhbmQiLCJjYXRlZ29yeUlkIiwicHJpY2UiLCJhZmZpbGlhdGVVcmwiLCJub3RlcyJdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./data/gunbuilderParts.ts\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.0154b3b16227569b.hot-update.js b/.next/static/webpack/app/layout.0154b3b16227569b.hot-update.js new file mode 100644 index 0000000..2bb62ba --- /dev/null +++ b/.next/static/webpack/app/layout.0154b3b16227569b.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"d0c680eac339\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJkMGM2ODBlYWMzMzlcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.33ba52be098c161e.hot-update.js b/.next/static/webpack/app/layout.33ba52be098c161e.hot-update.js new file mode 100644 index 0000000..6fefa91 --- /dev/null +++ b/.next/static/webpack/app/layout.33ba52be098c161e.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"c92bc8e6af0b\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJjOTJiYzhlNmFmMGJcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.37b5e01eea8ed1bc.hot-update.js b/.next/static/webpack/app/layout.37b5e01eea8ed1bc.hot-update.js new file mode 100644 index 0000000..7084813 --- /dev/null +++ b/.next/static/webpack/app/layout.37b5e01eea8ed1bc.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"e4a91796e7c8\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJlNGE5MTc5NmU3YzhcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.3caf0b9ac0e57aa2.hot-update.js b/.next/static/webpack/app/layout.3caf0b9ac0e57aa2.hot-update.js new file mode 100644 index 0000000..19317e2 --- /dev/null +++ b/.next/static/webpack/app/layout.3caf0b9ac0e57aa2.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"d7fab688d123\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJkN2ZhYjY4OGQxMjNcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.4600e69efa6f77ed.hot-update.js b/.next/static/webpack/app/layout.4600e69efa6f77ed.hot-update.js new file mode 100644 index 0000000..b56ffcb --- /dev/null +++ b/.next/static/webpack/app/layout.4600e69efa6f77ed.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"bda72c673e10\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJiZGE3MmM2NzNlMTBcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.5371990b51e58af5.hot-update.js b/.next/static/webpack/app/layout.5371990b51e58af5.hot-update.js new file mode 100644 index 0000000..2b1b7b9 --- /dev/null +++ b/.next/static/webpack/app/layout.5371990b51e58af5.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"d5459a6ce431\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJkNTQ1OWE2Y2U0MzFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.53c171f01978c097.hot-update.js b/.next/static/webpack/app/layout.53c171f01978c097.hot-update.js new file mode 100644 index 0000000..44d0abf --- /dev/null +++ b/.next/static/webpack/app/layout.53c171f01978c097.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"7ffc7fa59259\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI3ZmZjN2ZhNTkyNTlcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.6d78bd22f79ae832.hot-update.js b/.next/static/webpack/app/layout.6d78bd22f79ae832.hot-update.js new file mode 100644 index 0000000..cbccce7 --- /dev/null +++ b/.next/static/webpack/app/layout.6d78bd22f79ae832.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"3eb836f5be80\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIzZWI4MzZmNWJlODBcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.6f38bb490ac1fcd5.hot-update.js b/.next/static/webpack/app/layout.6f38bb490ac1fcd5.hot-update.js new file mode 100644 index 0000000..4cf308a --- /dev/null +++ b/.next/static/webpack/app/layout.6f38bb490ac1fcd5.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"c523e002adad\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJjNTIzZTAwMmFkYWRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.711cbdf6e524d616.hot-update.js b/.next/static/webpack/app/layout.711cbdf6e524d616.hot-update.js new file mode 100644 index 0000000..45ceb7f --- /dev/null +++ b/.next/static/webpack/app/layout.711cbdf6e524d616.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"ab568055d58f\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJhYjU2ODA1NWQ1OGZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.7a92340dcdac6dd1.hot-update.js b/.next/static/webpack/app/layout.7a92340dcdac6dd1.hot-update.js new file mode 100644 index 0000000..c2743a7 --- /dev/null +++ b/.next/static/webpack/app/layout.7a92340dcdac6dd1.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"3750a046e016\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIzNzUwYTA0NmUwMTZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.89a404237f86ae33.hot-update.js b/.next/static/webpack/app/layout.89a404237f86ae33.hot-update.js new file mode 100644 index 0000000..6f29c62 --- /dev/null +++ b/.next/static/webpack/app/layout.89a404237f86ae33.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"766428c15229\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI3NjY0MjhjMTUyMjlcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.8bf7e463053525e1.hot-update.js b/.next/static/webpack/app/layout.8bf7e463053525e1.hot-update.js new file mode 100644 index 0000000..8d246ca --- /dev/null +++ b/.next/static/webpack/app/layout.8bf7e463053525e1.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"2e71af5a1799\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIyZTcxYWY1YTE3OTlcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.9536828ef4709968.hot-update.js b/.next/static/webpack/app/layout.9536828ef4709968.hot-update.js new file mode 100644 index 0000000..36fad16 --- /dev/null +++ b/.next/static/webpack/app/layout.9536828ef4709968.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"50a01286fc81\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI1MGEwMTI4NmZjODFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.9f5a73668c8e9d1f.hot-update.js b/.next/static/webpack/app/layout.9f5a73668c8e9d1f.hot-update.js new file mode 100644 index 0000000..9745302 --- /dev/null +++ b/.next/static/webpack/app/layout.9f5a73668c8e9d1f.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"806c0c5c84f9\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI4MDZjMGM1Yzg0ZjlcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.adf656cf7013b288.hot-update.js b/.next/static/webpack/app/layout.adf656cf7013b288.hot-update.js new file mode 100644 index 0000000..9836cc9 --- /dev/null +++ b/.next/static/webpack/app/layout.adf656cf7013b288.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"fadf9e4f68f7\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJmYWRmOWU0ZjY4ZjdcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.b6c8dff37046039f.hot-update.js b/.next/static/webpack/app/layout.b6c8dff37046039f.hot-update.js new file mode 100644 index 0000000..1919836 --- /dev/null +++ b/.next/static/webpack/app/layout.b6c8dff37046039f.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"e518650ad9aa\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJlNTE4NjUwYWQ5YWFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.c0c69fec5ef092df.hot-update.js b/.next/static/webpack/app/layout.c0c69fec5ef092df.hot-update.js new file mode 100644 index 0000000..ed87792 --- /dev/null +++ b/.next/static/webpack/app/layout.c0c69fec5ef092df.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"1c49b4a6517d\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIxYzQ5YjRhNjUxN2RcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.c4eb215fcf760026.hot-update.js b/.next/static/webpack/app/layout.c4eb215fcf760026.hot-update.js new file mode 100644 index 0000000..6b761a5 --- /dev/null +++ b/.next/static/webpack/app/layout.c4eb215fcf760026.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"dc07371254c1\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJkYzA3MzcxMjU0YzFcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.cda5e07aba3a17f4.hot-update.js b/.next/static/webpack/app/layout.cda5e07aba3a17f4.hot-update.js new file mode 100644 index 0000000..26aec53 --- /dev/null +++ b/.next/static/webpack/app/layout.cda5e07aba3a17f4.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"1fc92058aaff\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIxZmM5MjA1OGFhZmZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.d9300228f9f83ab9.hot-update.js b/.next/static/webpack/app/layout.d9300228f9f83ab9.hot-update.js new file mode 100644 index 0000000..f628fc7 --- /dev/null +++ b/.next/static/webpack/app/layout.d9300228f9f83ab9.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"f4adf670dc94\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJmNGFkZjY3MGRjOTRcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.dbb1cbd00734aac6.hot-update.js b/.next/static/webpack/app/layout.dbb1cbd00734aac6.hot-update.js new file mode 100644 index 0000000..4c16345 --- /dev/null +++ b/.next/static/webpack/app/layout.dbb1cbd00734aac6.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"a7f62303143a\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJhN2Y2MjMwMzE0M2FcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.e77bac752e550447.hot-update.js b/.next/static/webpack/app/layout.e77bac752e550447.hot-update.js new file mode 100644 index 0000000..4f0ddc4 --- /dev/null +++ b/.next/static/webpack/app/layout.e77bac752e550447.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"7ae6a03958f5\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI3YWU2YTAzOTU4ZjVcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.fa6ba7f604e88fea.hot-update.js b/.next/static/webpack/app/layout.fa6ba7f604e88fea.hot-update.js new file mode 100644 index 0000000..408af2b --- /dev/null +++ b/.next/static/webpack/app/layout.fa6ba7f604e88fea.hot-update.js @@ -0,0 +1,22 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("app/layout",{ + +/***/ "(app-pages-browser)/./app/globals.css": +/*!*************************!*\ + !*** ./app/globals.css ***! + \*************************/ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony default export */ __webpack_exports__[\"default\"] = (\"f4bd80114186\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJmNGJkODAxMTQxODZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/b6c8dff37046039f.webpack.hot-update.json b/.next/static/webpack/b6c8dff37046039f.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/b6c8dff37046039f.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/c0c69fec5ef092df.webpack.hot-update.json b/.next/static/webpack/c0c69fec5ef092df.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/c0c69fec5ef092df.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/c4eb215fcf760026.webpack.hot-update.json b/.next/static/webpack/c4eb215fcf760026.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/c4eb215fcf760026.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/c7be720f450ad784.webpack.hot-update.json b/.next/static/webpack/c7be720f450ad784.webpack.hot-update.json new file mode 100644 index 0000000..b77309c --- /dev/null +++ b/.next/static/webpack/c7be720f450ad784.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","app/gunbuilder/build/page","app/gunbuilder/[categoryId]/[partId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/cda5e07aba3a17f4.webpack.hot-update.json b/.next/static/webpack/cda5e07aba3a17f4.webpack.hot-update.json new file mode 100644 index 0000000..31f1cde --- /dev/null +++ b/.next/static/webpack/cda5e07aba3a17f4.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/d9300228f9f83ab9.webpack.hot-update.json b/.next/static/webpack/d9300228f9f83ab9.webpack.hot-update.json new file mode 100644 index 0000000..5c82546 --- /dev/null +++ b/.next/static/webpack/d9300228f9f83ab9.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/dbb1cbd00734aac6.webpack.hot-update.json b/.next/static/webpack/dbb1cbd00734aac6.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/dbb1cbd00734aac6.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/dceafb6afbec686b.webpack.hot-update.json b/.next/static/webpack/dceafb6afbec686b.webpack.hot-update.json new file mode 100644 index 0000000..3823c4c --- /dev/null +++ b/.next/static/webpack/dceafb6afbec686b.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/e6ab26d29cc9c4c8.webpack.hot-update.json b/.next/static/webpack/e6ab26d29cc9c4c8.webpack.hot-update.json new file mode 100644 index 0000000..20fa880 --- /dev/null +++ b/.next/static/webpack/e6ab26d29cc9c4c8.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/e77bac752e550447.webpack.hot-update.json b/.next/static/webpack/e77bac752e550447.webpack.hot-update.json new file mode 100644 index 0000000..6a4f8ba --- /dev/null +++ b/.next/static/webpack/e77bac752e550447.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/f984af7569671cf9.webpack.hot-update.json b/.next/static/webpack/f984af7569671cf9.webpack.hot-update.json new file mode 100644 index 0000000..b77309c --- /dev/null +++ b/.next/static/webpack/f984af7569671cf9.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/gunbuilder/page","app/gunbuilder/[categoryId]/page","app/gunbuilder/build/page","app/gunbuilder/[categoryId]/[partId]/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/fa6ba7f604e88fea.webpack.hot-update.json b/.next/static/webpack/fa6ba7f604e88fea.webpack.hot-update.json new file mode 100644 index 0000000..2e7398d --- /dev/null +++ b/.next/static/webpack/fa6ba7f604e88fea.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/[categoryId]/page","webpack"],"r":["app/_not-found/page"],"m":["(app-pages-browser)/./node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","(app-pages-browser)/./node_modules/next/dist/client/components/not-found-error.js"]} \ No newline at end of file diff --git a/.next/static/webpack/webpack.0154b3b16227569b.hot-update.js b/.next/static/webpack/webpack.0154b3b16227569b.hot-update.js new file mode 100644 index 0000000..4951160 --- /dev/null +++ b/.next/static/webpack/webpack.0154b3b16227569b.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "3caf0b9ac0e57aa2"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.04e447b5b4d809a6.hot-update.js b/.next/static/webpack/webpack.04e447b5b4d809a6.hot-update.js new file mode 100644 index 0000000..1173501 --- /dev/null +++ b/.next/static/webpack/webpack.04e447b5b4d809a6.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "29420e8fdb9e3559"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.076391ec6128273f.hot-update.js b/.next/static/webpack/webpack.076391ec6128273f.hot-update.js new file mode 100644 index 0000000..90c694f --- /dev/null +++ b/.next/static/webpack/webpack.076391ec6128273f.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "0154b3b16227569b"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.29420e8fdb9e3559.hot-update.js b/.next/static/webpack/webpack.29420e8fdb9e3559.hot-update.js new file mode 100644 index 0000000..43293fa --- /dev/null +++ b/.next/static/webpack/webpack.29420e8fdb9e3559.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "e6ab26d29cc9c4c8"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.33ba52be098c161e.hot-update.js b/.next/static/webpack/webpack.33ba52be098c161e.hot-update.js new file mode 100644 index 0000000..7c37a46 --- /dev/null +++ b/.next/static/webpack/webpack.33ba52be098c161e.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "7f1da3c97852a23d"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.37b5e01eea8ed1bc.hot-update.js b/.next/static/webpack/webpack.37b5e01eea8ed1bc.hot-update.js new file mode 100644 index 0000000..b17e5e9 --- /dev/null +++ b/.next/static/webpack/webpack.37b5e01eea8ed1bc.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "80d755756c628dcb"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.3caf0b9ac0e57aa2.hot-update.js b/.next/static/webpack/webpack.3caf0b9ac0e57aa2.hot-update.js new file mode 100644 index 0000000..12b6be8 --- /dev/null +++ b/.next/static/webpack/webpack.3caf0b9ac0e57aa2.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "53c171f01978c097"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.421a9585f365390e.hot-update.js b/.next/static/webpack/webpack.421a9585f365390e.hot-update.js new file mode 100644 index 0000000..98a109e --- /dev/null +++ b/.next/static/webpack/webpack.421a9585f365390e.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "04e447b5b4d809a6"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.4600e69efa6f77ed.hot-update.js b/.next/static/webpack/webpack.4600e69efa6f77ed.hot-update.js new file mode 100644 index 0000000..d054ea3 --- /dev/null +++ b/.next/static/webpack/webpack.4600e69efa6f77ed.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "d9300228f9f83ab9"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.5371990b51e58af5.hot-update.js b/.next/static/webpack/webpack.5371990b51e58af5.hot-update.js new file mode 100644 index 0000000..c11b9a9 --- /dev/null +++ b/.next/static/webpack/webpack.5371990b51e58af5.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "6d78bd22f79ae832"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.53c171f01978c097.hot-update.js b/.next/static/webpack/webpack.53c171f01978c097.hot-update.js new file mode 100644 index 0000000..cb04068 --- /dev/null +++ b/.next/static/webpack/webpack.53c171f01978c097.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "37b5e01eea8ed1bc"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.6aeb98c2de082c28.hot-update.js b/.next/static/webpack/webpack.6aeb98c2de082c28.hot-update.js new file mode 100644 index 0000000..a084892 --- /dev/null +++ b/.next/static/webpack/webpack.6aeb98c2de082c28.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "c0c69fec5ef092df"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.6d78bd22f79ae832.hot-update.js b/.next/static/webpack/webpack.6d78bd22f79ae832.hot-update.js new file mode 100644 index 0000000..f881937 --- /dev/null +++ b/.next/static/webpack/webpack.6d78bd22f79ae832.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "e77bac752e550447"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.6f38bb490ac1fcd5.hot-update.js b/.next/static/webpack/webpack.6f38bb490ac1fcd5.hot-update.js new file mode 100644 index 0000000..f741cb2 --- /dev/null +++ b/.next/static/webpack/webpack.6f38bb490ac1fcd5.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "9536828ef4709968"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.711cbdf6e524d616.hot-update.js b/.next/static/webpack/webpack.711cbdf6e524d616.hot-update.js new file mode 100644 index 0000000..287c890 --- /dev/null +++ b/.next/static/webpack/webpack.711cbdf6e524d616.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "5371990b51e58af5"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.7a92340dcdac6dd1.hot-update.js b/.next/static/webpack/webpack.7a92340dcdac6dd1.hot-update.js new file mode 100644 index 0000000..137c484 --- /dev/null +++ b/.next/static/webpack/webpack.7a92340dcdac6dd1.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "c4eb215fcf760026"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.80d755756c628dcb.hot-update.js b/.next/static/webpack/webpack.80d755756c628dcb.hot-update.js new file mode 100644 index 0000000..2b504b0 --- /dev/null +++ b/.next/static/webpack/webpack.80d755756c628dcb.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "fa6ba7f604e88fea"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.89a404237f86ae33.hot-update.js b/.next/static/webpack/webpack.89a404237f86ae33.hot-update.js new file mode 100644 index 0000000..a11f7fd --- /dev/null +++ b/.next/static/webpack/webpack.89a404237f86ae33.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "4600e69efa6f77ed"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.8bf7e463053525e1.hot-update.js b/.next/static/webpack/webpack.8bf7e463053525e1.hot-update.js new file mode 100644 index 0000000..8c8a093 --- /dev/null +++ b/.next/static/webpack/webpack.8bf7e463053525e1.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "dceafb6afbec686b"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.8ed00c0ffa8517ea.hot-update.js b/.next/static/webpack/webpack.8ed00c0ffa8517ea.hot-update.js new file mode 100644 index 0000000..b150b12 --- /dev/null +++ b/.next/static/webpack/webpack.8ed00c0ffa8517ea.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "adf656cf7013b288"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.91342a80eaa2cbe0.hot-update.js b/.next/static/webpack/webpack.91342a80eaa2cbe0.hot-update.js new file mode 100644 index 0000000..0f904c3 --- /dev/null +++ b/.next/static/webpack/webpack.91342a80eaa2cbe0.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "8bf7e463053525e1"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.9536828ef4709968.hot-update.js b/.next/static/webpack/webpack.9536828ef4709968.hot-update.js new file mode 100644 index 0000000..e3b0dff --- /dev/null +++ b/.next/static/webpack/webpack.9536828ef4709968.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "33ba52be098c161e"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.9f5a73668c8e9d1f.hot-update.js b/.next/static/webpack/webpack.9f5a73668c8e9d1f.hot-update.js new file mode 100644 index 0000000..a442c78 --- /dev/null +++ b/.next/static/webpack/webpack.9f5a73668c8e9d1f.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "7a92340dcdac6dd1"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.a6f46b17097acafc.hot-update.js b/.next/static/webpack/webpack.a6f46b17097acafc.hot-update.js new file mode 100644 index 0000000..7bd4c88 --- /dev/null +++ b/.next/static/webpack/webpack.a6f46b17097acafc.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "f984af7569671cf9"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.adf656cf7013b288.hot-update.js b/.next/static/webpack/webpack.adf656cf7013b288.hot-update.js new file mode 100644 index 0000000..06d70f3 --- /dev/null +++ b/.next/static/webpack/webpack.adf656cf7013b288.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "076391ec6128273f"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.b6c8dff37046039f.hot-update.js b/.next/static/webpack/webpack.b6c8dff37046039f.hot-update.js new file mode 100644 index 0000000..71ab6f9 --- /dev/null +++ b/.next/static/webpack/webpack.b6c8dff37046039f.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "9f5a73668c8e9d1f"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.c0c69fec5ef092df.hot-update.js b/.next/static/webpack/webpack.c0c69fec5ef092df.hot-update.js new file mode 100644 index 0000000..f66e032 --- /dev/null +++ b/.next/static/webpack/webpack.c0c69fec5ef092df.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "cda5e07aba3a17f4"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.c4eb215fcf760026.hot-update.js b/.next/static/webpack/webpack.c4eb215fcf760026.hot-update.js new file mode 100644 index 0000000..606d597 --- /dev/null +++ b/.next/static/webpack/webpack.c4eb215fcf760026.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "91342a80eaa2cbe0"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.c7be720f450ad784.hot-update.js b/.next/static/webpack/webpack.c7be720f450ad784.hot-update.js new file mode 100644 index 0000000..5fe8218 --- /dev/null +++ b/.next/static/webpack/webpack.c7be720f450ad784.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "89a404237f86ae33"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.cda5e07aba3a17f4.hot-update.js b/.next/static/webpack/webpack.cda5e07aba3a17f4.hot-update.js new file mode 100644 index 0000000..1cbfb2c --- /dev/null +++ b/.next/static/webpack/webpack.cda5e07aba3a17f4.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "711cbdf6e524d616"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.d9300228f9f83ab9.hot-update.js b/.next/static/webpack/webpack.d9300228f9f83ab9.hot-update.js new file mode 100644 index 0000000..a5dd440 --- /dev/null +++ b/.next/static/webpack/webpack.d9300228f9f83ab9.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "6f38bb490ac1fcd5"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.dbb1cbd00734aac6.hot-update.js b/.next/static/webpack/webpack.dbb1cbd00734aac6.hot-update.js new file mode 100644 index 0000000..eef2ede --- /dev/null +++ b/.next/static/webpack/webpack.dbb1cbd00734aac6.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "b6c8dff37046039f"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.dceafb6afbec686b.hot-update.js b/.next/static/webpack/webpack.dceafb6afbec686b.hot-update.js new file mode 100644 index 0000000..91f85a8 --- /dev/null +++ b/.next/static/webpack/webpack.dceafb6afbec686b.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "421a9585f365390e"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.e6ab26d29cc9c4c8.hot-update.js b/.next/static/webpack/webpack.e6ab26d29cc9c4c8.hot-update.js new file mode 100644 index 0000000..35d7444 --- /dev/null +++ b/.next/static/webpack/webpack.e6ab26d29cc9c4c8.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "c7be720f450ad784"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.e77bac752e550447.hot-update.js b/.next/static/webpack/webpack.e77bac752e550447.hot-update.js new file mode 100644 index 0000000..6d7af6d --- /dev/null +++ b/.next/static/webpack/webpack.e77bac752e550447.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "8ed00c0ffa8517ea"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.f984af7569671cf9.hot-update.js b/.next/static/webpack/webpack.f984af7569671cf9.hot-update.js new file mode 100644 index 0000000..1e243da --- /dev/null +++ b/.next/static/webpack/webpack.f984af7569671cf9.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "6aeb98c2de082c28"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.fa6ba7f604e88fea.hot-update.js b/.next/static/webpack/webpack.fa6ba7f604e88fea.hot-update.js new file mode 100644 index 0000000..1e58380 --- /dev/null +++ b/.next/static/webpack/webpack.fa6ba7f604e88fea.hot-update.js @@ -0,0 +1,18 @@ +"use strict"; +/* + * ATTENTION: An "eval-source-map" devtool has been used. + * This devtool is neither made for production nor for readable output files. + * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools. + * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) + * or disable the default devtool with "devtool: false". + * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). + */ +self["webpackHotUpdate_N_E"]("webpack",{}, +/******/ function(__webpack_require__) { // webpackRuntimeModules +/******/ /* webpack/runtime/getFullHash */ +/******/ !function() { +/******/ __webpack_require__.h = function() { return "dbb1cbd00734aac6"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/trace b/.next/trace index 06ef97c..6095db7 100644 --- a/.next/trace +++ b/.next/trace @@ -18,3 +18,46 @@ [{"name":"client-success","duration":1,"timestamp":3855599709,"id":1228,"parentId":3,"tags":{},"startTime":1764675820905,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":3855600249,"id":1230,"parentId":3,"tags":{},"startTime":1764675820905,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":230000,"timestamp":3855387621,"id":1232,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/merchants","isPageHidden":true},"startTime":1764675820924,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19111,"timestamp":3855599869,"id":1229,"tags":{"url":"/gunbuilder/admin/merchants?_rsc=1o0yz","isTurbopack":false},"startTime":1764675820905,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":3855618992,"id":1233,"parentId":1229,"tags":{"url":"/gunbuilder/admin/merchants?_rsc=1o0yz","memory.rss":"476725248","memory.heapUsed":"168596536","memory.heapTotal":"192823296"},"startTime":1764675820924,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20165,"timestamp":3855600645,"id":1231,"tags":{"url":"/gunbuilder?_rsc=9gfev","isTurbopack":false},"startTime":1764675820906,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":3855620816,"id":1234,"parentId":1231,"tags":{"url":"/gunbuilder?_rsc=9gfev","memory.rss":"476725248","memory.heapUsed":"168795872","memory.heapTotal":"192823296"},"startTime":1764675820926,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":246000,"timestamp":3855387652,"id":1235,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764675820940,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13348,"timestamp":3864234298,"id":1241,"parentId":1239,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764675829539,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13351,"timestamp":3864234312,"id":1242,"parentId":1239,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764675829539,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13353,"timestamp":3864234322,"id":1243,"parentId":1239,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764675829539,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13350,"timestamp":3864234332,"id":1244,"parentId":1239,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764675829539,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2149,"timestamp":3864246960,"id":1247,"parentId":1246,"tags":{},"startTime":1764675829552,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2287,"timestamp":3864246827,"id":1246,"parentId":1245,"tags":{},"startTime":1764675829552,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":4201,"timestamp":3864246481,"id":1245,"parentId":1238,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764675829552,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17127,"timestamp":3864234210,"id":1240,"parentId":1239,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764675829539,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5699,"timestamp":3864258565,"id":1265,"parentId":1264,"tags":{},"startTime":1764675829564,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5809,"timestamp":3864258460,"id":1264,"parentId":1263,"tags":{},"startTime":1764675829564,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":11209,"timestamp":3864258246,"id":1263,"parentId":1238,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764675829563,"traceId":"247574ce86dfd828"},{"name":"make","duration":39178,"timestamp":3864231524,"id":1239,"parentId":1238,"tags":{},"startTime":1764675829537,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2579,"timestamp":3864272193,"id":1267,"parentId":1266,"tags":{},"startTime":1764675829577,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":3864274796,"id":1269,"parentId":1266,"tags":{},"startTime":1764675829580,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1972,"timestamp":3864274815,"id":1270,"parentId":1266,"tags":{},"startTime":1764675829580,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":3864276798,"id":1271,"parentId":1266,"tags":{},"startTime":1764675829582,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":3864276813,"id":1272,"parentId":1266,"tags":{},"startTime":1764675829582,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2317,"timestamp":3864274791,"id":1268,"parentId":1266,"tags":{},"startTime":1764675829580,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":396,"timestamp":3864277814,"id":1273,"parentId":1266,"tags":{},"startTime":1764675829583,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1190,"timestamp":3864278216,"id":1274,"parentId":1266,"tags":{},"startTime":1764675829583,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1144,"timestamp":3864280045,"id":1275,"parentId":1266,"tags":{},"startTime":1764675829585,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":67,"timestamp":3864281188,"id":1276,"parentId":1266,"tags":{},"startTime":1764675829586,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":43,"timestamp":3864281248,"id":1277,"parentId":1266,"tags":{},"startTime":1764675829586,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2235,"timestamp":3864281295,"id":1278,"parentId":1266,"tags":{},"startTime":1764675829586,"traceId":"247574ce86dfd828"},{"name":"seal","duration":14385,"timestamp":3864271895,"id":1266,"parentId":1238,"tags":{},"startTime":1764675829577,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":57719,"timestamp":3864230705,"id":1238,"parentId":1236,"tags":{"name":"server"},"startTime":1764675829536,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2937,"timestamp":3864288443,"id":1279,"parentId":1236,"tags":{},"startTime":1764675829594,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":71215,"timestamp":3864220511,"id":1236,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764675829526,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3707,"timestamp":3864300997,"id":1289,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3780,"timestamp":3864301003,"id":1291,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4335,"timestamp":3864300928,"id":1282,"parentId":1281,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4687,"timestamp":3864301000,"id":1290,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5147,"timestamp":3864300976,"id":1284,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6946,"timestamp":3864300987,"id":1286,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":4296,"timestamp":3864303765,"id":1295,"parentId":1294,"tags":{},"startTime":1764675829609,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4387,"timestamp":3864303675,"id":1294,"parentId":1293,"tags":{},"startTime":1764675829609,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":9632,"timestamp":3864303553,"id":1293,"parentId":1280,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764675829609,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":6695,"timestamp":3864306511,"id":1297,"parentId":1296,"tags":{},"startTime":1764675829612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15736,"timestamp":3864300970,"id":1283,"parentId":1281,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15725,"timestamp":3864300994,"id":1288,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":26430,"timestamp":3864313263,"id":1299,"parentId":1298,"tags":{},"startTime":1764675829618,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":26752,"timestamp":3864313249,"id":1298,"parentId":1296,"tags":{},"startTime":1764675829618,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":2880,"timestamp":3864340025,"id":1300,"parentId":1296,"tags":{"astUsed":"true"},"startTime":1764675829645,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":37145,"timestamp":3864306421,"id":1296,"parentId":1292,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764675829612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":42660,"timestamp":3864300991,"id":1287,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":41945,"timestamp":3864303283,"id":1292,"parentId":1280,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764675829608,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":15,"timestamp":3864345316,"id":1301,"parentId":1292,"tags":{},"startTime":1764675829650,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":44365,"timestamp":3864300984,"id":1285,"parentId":1281,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764675829606,"traceId":"247574ce86dfd828"},{"name":"make","duration":51996,"timestamp":3864293361,"id":1281,"parentId":1280,"tags":{},"startTime":1764675829599,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":686,"timestamp":3864346435,"id":1303,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":3864347128,"id":1305,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":22,"timestamp":3864347135,"id":1306,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":3864347163,"id":1307,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":3864347176,"id":1308,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":310,"timestamp":3864347126,"id":1304,"parentId":1302,"tags":{},"startTime":1764675829652,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":194,"timestamp":3864347864,"id":1309,"parentId":1302,"tags":{},"startTime":1764675829653,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":775,"timestamp":3864348062,"id":1310,"parentId":1302,"tags":{},"startTime":1764675829653,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1708,"timestamp":3864349381,"id":1311,"parentId":1302,"tags":{},"startTime":1764675829655,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":84,"timestamp":3864351089,"id":1312,"parentId":1302,"tags":{},"startTime":1764675829656,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":3864351170,"id":1313,"parentId":1302,"tags":{},"startTime":1764675829656,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2553,"timestamp":3864351204,"id":1314,"parentId":1302,"tags":{},"startTime":1764675829656,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":53,"timestamp":3864354212,"id":1316,"parentId":1280,"tags":{},"startTime":1764675829659,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":99,"timestamp":3864354170,"id":1315,"parentId":1280,"tags":{},"startTime":1764675829659,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8878,"timestamp":3864346186,"id":1302,"parentId":1280,"tags":{},"startTime":1764675829651,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":62031,"timestamp":3864293044,"id":1280,"parentId":1237,"tags":{"name":"client"},"startTime":1764675829598,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2673,"timestamp":3864355085,"id":1317,"parentId":1237,"tags":{},"startTime":1764675829660,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":137567,"timestamp":3864220836,"id":1237,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764675829526,"traceId":"247574ce86dfd828"}] [{"name":"client-success","duration":1,"timestamp":3864361828,"id":1318,"parentId":3,"tags":{},"startTime":1764675829667,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":3864362140,"id":1319,"parentId":3,"tags":{},"startTime":1764675829667,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9615,"timestamp":3864363212,"id":1320,"tags":{"url":"/gunbuilder/admin/merchants?_rsc=1o0yz","isTurbopack":false},"startTime":1764675829668,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":3864372846,"id":1322,"parentId":1320,"tags":{"url":"/gunbuilder/admin/merchants?_rsc=1o0yz","memory.rss":"499875840","memory.heapUsed":"192977504","memory.heapTotal":"215498752"},"startTime":1764675829678,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13715,"timestamp":3864363560,"id":1321,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764675829669,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":3864377287,"id":1323,"parentId":1321,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"500989952","memory.heapUsed":"194255464","memory.heapTotal":"216465408"},"startTime":1764675829682,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":159000,"timestamp":3864220783,"id":1324,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/merchants","isPageHidden":true},"startTime":1764675829687,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":166000,"timestamp":3864221889,"id":1325,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764675829693,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":64126,"timestamp":8040664221,"id":1326,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764680005980,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":8040728384,"id":1327,"parentId":1326,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"444334080","memory.heapUsed":"158259184","memory.heapTotal":"164855808"},"startTime":1764680006044,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":8040931821,"id":1328,"parentId":3,"tags":{},"startTime":1764680006247,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":31570,"timestamp":8046172753,"id":1329,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764680011488,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":8046204369,"id":1330,"parentId":1329,"tags":{"url":"/gunbuilder","memory.rss":"445284352","memory.heapUsed":"154830160","memory.heapTotal":"160808960"},"startTime":1764680011520,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":8046422888,"id":1331,"parentId":3,"tags":{},"startTime":1764680011738,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":8046426154,"id":1332,"parentId":3,"tags":{},"startTime":1764680011742,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19957,"timestamp":17909367196,"id":1333,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764689874654,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":17909387187,"id":1334,"parentId":1333,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"445825024","memory.heapUsed":"155059304","memory.heapTotal":"159236096"},"startTime":1764689874674,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":17909611348,"id":1335,"parentId":3,"tags":{},"startTime":1764689874899,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":28128,"timestamp":28865530969,"id":1336,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764700830804,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":28865559159,"id":1337,"parentId":1336,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"447397888","memory.heapUsed":"154813784","memory.heapTotal":"159760384"},"startTime":1764700830832,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":28865787925,"id":1338,"parentId":3,"tags":{},"startTime":1764700831061,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19537,"timestamp":28913921401,"id":1339,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764700879194,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":28913940985,"id":1340,"parentId":1339,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"448905216","memory.heapUsed":"155705736","memory.heapTotal":"160546816"},"startTime":1764700879213,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":28914150074,"id":1341,"parentId":3,"tags":{},"startTime":1764700879423,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25069,"timestamp":28915031421,"id":1342,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764700880304,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":28915056542,"id":1343,"parentId":1342,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"449036288","memory.heapUsed":"145089688","memory.heapTotal":"159219712"},"startTime":1764700880329,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":28915271342,"id":1344,"parentId":3,"tags":{},"startTime":1764700880544,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":26222,"timestamp":29320812876,"id":1345,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764701286085,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29320839157,"id":1346,"parentId":1345,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"439615488","memory.heapUsed":"145549392","memory.heapTotal":"159219712"},"startTime":1764701286111,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29321066772,"id":1347,"parentId":3,"tags":{},"startTime":1764701286338,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":22292,"timestamp":29697284295,"id":1348,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764701662555,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29697306640,"id":1349,"parentId":1348,"tags":{"url":"/gunbuilder","memory.rss":"439631872","memory.heapUsed":"145755496","memory.heapTotal":"159219712"},"startTime":1764701662578,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29697536507,"id":1350,"parentId":3,"tags":{},"startTime":1764701662808,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":29697539963,"id":1351,"parentId":3,"tags":{},"startTime":1764701662811,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24379,"timestamp":29711960528,"id":1352,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","isTurbopack":false},"startTime":1764701677232,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":29711984989,"id":1353,"parentId":1352,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","memory.rss":"440221696","memory.heapUsed":"146544824","memory.heapTotal":"160268288"},"startTime":1764701677256,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":5551,"timestamp":29711991625,"id":1354,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","isTurbopack":false},"startTime":1764701677263,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29711997201,"id":1355,"parentId":1354,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","memory.rss":"440221696","memory.heapUsed":"146664848","memory.heapTotal":"160530432"},"startTime":1764701677268,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24593,"timestamp":29728171544,"id":1356,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764701693442,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29728196182,"id":1357,"parentId":1356,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"440516608","memory.heapUsed":"147939384","memory.heapTotal":"160481280"},"startTime":1764701693467,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":29728399131,"id":1358,"parentId":3,"tags":{},"startTime":1764701693670,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29728408301,"id":1359,"parentId":3,"tags":{},"startTime":1764701693679,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25346,"timestamp":29778430690,"id":1360,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764701743702,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29778456075,"id":1361,"parentId":1360,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"440631296","memory.heapUsed":"146370328","memory.heapTotal":"153403392"},"startTime":1764701743727,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29778677443,"id":1362,"parentId":3,"tags":{},"startTime":1764701743948,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":29778682125,"id":1363,"parentId":3,"tags":{},"startTime":1764701743953,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15655,"timestamp":29799389311,"id":1364,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764701764660,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":29799405028,"id":1365,"parentId":1364,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"440631296","memory.heapUsed":"147014928","memory.heapTotal":"152354816"},"startTime":1764701764676,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":23649,"timestamp":29959288868,"id":1366,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764701924559,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":29959312600,"id":1367,"parentId":1366,"tags":{"url":"/gunbuilder","memory.rss":"440631296","memory.heapUsed":"147140200","memory.heapTotal":"152879104"},"startTime":1764701924583,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":29959546269,"id":1368,"parentId":3,"tags":{},"startTime":1764701924817,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29959549661,"id":1369,"parentId":3,"tags":{},"startTime":1764701924820,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20537,"timestamp":29980257293,"id":1370,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764701945528,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":29980277862,"id":1371,"parentId":1370,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"440631296","memory.heapUsed":"147609296","memory.heapTotal":"153403392"},"startTime":1764701945548,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29980506471,"id":1372,"parentId":3,"tags":{},"startTime":1764701945777,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":29980509395,"id":1373,"parentId":3,"tags":{},"startTime":1764701945780,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14363,"timestamp":37148514640,"id":1380,"parentId":1377,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709113780,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14379,"timestamp":37148514646,"id":1381,"parentId":1377,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709113780,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14380,"timestamp":37148514653,"id":1382,"parentId":1377,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709113780,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2578,"timestamp":37148528039,"id":1385,"parentId":1384,"tags":{},"startTime":1764709113793,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2750,"timestamp":37148527872,"id":1384,"parentId":1383,"tags":{},"startTime":1764709113793,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6596,"timestamp":37148527432,"id":1383,"parentId":1376,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764709113793,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19961,"timestamp":37148514561,"id":1378,"parentId":1377,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709113780,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20284,"timestamp":37148514631,"id":1379,"parentId":1377,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709113780,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5043,"timestamp":37148538713,"id":1403,"parentId":1402,"tags":{},"startTime":1764709113804,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5266,"timestamp":37148538495,"id":1402,"parentId":1401,"tags":{},"startTime":1764709113804,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":17477,"timestamp":37148538305,"id":1401,"parentId":1376,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764709113803,"traceId":"247574ce86dfd828"},{"name":"make","duration":47835,"timestamp":37148510141,"id":1377,"parentId":1376,"tags":{},"startTime":1764709113775,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1368,"timestamp":37148590838,"id":1405,"parentId":1404,"tags":{},"startTime":1764709113856,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":37148592222,"id":1407,"parentId":1404,"tags":{},"startTime":1764709113857,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1848,"timestamp":37148592265,"id":1408,"parentId":1404,"tags":{},"startTime":1764709113857,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":16,"timestamp":37148594175,"id":1409,"parentId":1404,"tags":{},"startTime":1764709113859,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":8,"timestamp":37148594225,"id":1410,"parentId":1404,"tags":{},"startTime":1764709113859,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2342,"timestamp":37148592218,"id":1406,"parentId":1404,"tags":{},"startTime":1764709113857,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":333,"timestamp":37148595154,"id":1411,"parentId":1404,"tags":{},"startTime":1764709113860,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":822,"timestamp":37148595497,"id":1412,"parentId":1404,"tags":{},"startTime":1764709113861,"traceId":"247574ce86dfd828"},{"name":"hash","duration":890,"timestamp":37148596866,"id":1413,"parentId":1404,"tags":{},"startTime":1764709113862,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":48,"timestamp":37148597756,"id":1414,"parentId":1404,"tags":{},"startTime":1764709113863,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":51,"timestamp":37148597800,"id":1415,"parentId":1404,"tags":{},"startTime":1764709113863,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2079,"timestamp":37148597853,"id":1416,"parentId":1404,"tags":{},"startTime":1764709113863,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11578,"timestamp":37148590615,"id":1404,"parentId":1376,"tags":{},"startTime":1764709113856,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":94935,"timestamp":37148508945,"id":1376,"parentId":1374,"tags":{"name":"server"},"startTime":1764709113774,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2159,"timestamp":37148603905,"id":1417,"parentId":1374,"tags":{},"startTime":1764709113869,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":109404,"timestamp":37148497088,"id":1374,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709113762,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2923,"timestamp":37148615691,"id":1427,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2977,"timestamp":37148615697,"id":1429,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3238,"timestamp":37148615631,"id":1420,"parentId":1419,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3447,"timestamp":37148615693,"id":1428,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3707,"timestamp":37148615681,"id":1422,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3486,"timestamp":37148618006,"id":1433,"parentId":1432,"tags":{},"startTime":1764709113883,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3567,"timestamp":37148617928,"id":1432,"parentId":1431,"tags":{},"startTime":1764709113883,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":10621,"timestamp":37148617848,"id":1431,"parentId":1418,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764709113883,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13949,"timestamp":37148615686,"id":1424,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":9971,"timestamp":37148619689,"id":1435,"parentId":1434,"tags":{},"startTime":1764709113885,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17501,"timestamp":37148615676,"id":1421,"parentId":1419,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17490,"timestamp":37148615690,"id":1426,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17531,"timestamp":37148615689,"id":1425,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":19518,"timestamp":37148629689,"id":1437,"parentId":1436,"tags":{},"startTime":1764709113895,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":19864,"timestamp":37148629680,"id":1436,"parentId":1434,"tags":{},"startTime":1764709113895,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4677,"timestamp":37148649576,"id":1438,"parentId":1434,"tags":{"astUsed":"true"},"startTime":1764709113915,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":35778,"timestamp":37148619562,"id":1434,"parentId":1430,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764709113885,"traceId":"247574ce86dfd828"}] [{"name":"build-module-css","duration":40829,"timestamp":37148617272,"id":1430,"parentId":1418,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764709113882,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":31,"timestamp":37148658230,"id":1439,"parentId":1430,"tags":{},"startTime":1764709113923,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":42597,"timestamp":37148615683,"id":1423,"parentId":1419,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709113881,"traceId":"247574ce86dfd828"},{"name":"make","duration":49826,"timestamp":37148608465,"id":1419,"parentId":1418,"tags":{},"startTime":1764709113874,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":876,"timestamp":37148664387,"id":1441,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37148665275,"id":1443,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":24,"timestamp":37148665310,"id":1444,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":37148665343,"id":1445,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37148665357,"id":1446,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":359,"timestamp":37148665271,"id":1442,"parentId":1440,"tags":{},"startTime":1764709113930,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":307,"timestamp":37148666250,"id":1447,"parentId":1440,"tags":{},"startTime":1764709113931,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1162,"timestamp":37148666562,"id":1448,"parentId":1440,"tags":{},"startTime":1764709113932,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2622,"timestamp":37148668661,"id":1449,"parentId":1440,"tags":{},"startTime":1764709113934,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":112,"timestamp":37148671282,"id":1450,"parentId":1440,"tags":{},"startTime":1764709113936,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":38,"timestamp":37148671388,"id":1451,"parentId":1440,"tags":{},"startTime":1764709113937,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3352,"timestamp":37148671429,"id":1452,"parentId":1440,"tags":{},"startTime":1764709113937,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":201,"timestamp":37148675581,"id":1454,"parentId":1418,"tags":{},"startTime":1764709113941,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":275,"timestamp":37148675512,"id":1453,"parentId":1418,"tags":{},"startTime":1764709113941,"traceId":"247574ce86dfd828"},{"name":"seal","duration":12759,"timestamp":37148664096,"id":1440,"parentId":1418,"tags":{},"startTime":1764709113929,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":69030,"timestamp":37148607844,"id":1418,"parentId":1375,"tags":{"name":"client"},"startTime":1764709113873,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7648,"timestamp":37148676883,"id":1455,"parentId":1375,"tags":{},"startTime":1764709113942,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":187908,"timestamp":37148497577,"id":1375,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709113763,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":7,"timestamp":37148688361,"id":1456,"parentId":3,"tags":{},"startTime":1764709113953,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":37148688921,"id":1457,"parentId":3,"tags":{},"startTime":1764709113954,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":18410,"timestamp":37148689033,"id":1458,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764709113954,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37148707464,"id":1460,"parentId":1458,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"482885632","memory.heapUsed":"168088720","memory.heapTotal":"201261056"},"startTime":1764709113973,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":22579,"timestamp":37148689334,"id":1459,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764709113954,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37148711924,"id":1461,"parentId":1459,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"483229696","memory.heapUsed":"169155960","memory.heapTotal":"201474048"},"startTime":1764709113977,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":219000,"timestamp":37148500173,"id":1462,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709113984,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":226000,"timestamp":37148497626,"id":1463,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709113990,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":66976,"timestamp":37157777075,"id":1464,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764709123042,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37157844078,"id":1465,"parentId":1464,"tags":{"url":"/gunbuilder","memory.rss":"441548800","memory.heapUsed":"154607720","memory.heapTotal":"159727616"},"startTime":1764709123109,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":37158055811,"id":1466,"parentId":3,"tags":{},"startTime":1764709123321,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":37158059526,"id":1467,"parentId":3,"tags":{},"startTime":1764709123325,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24455,"timestamp":37164611659,"id":1468,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764709129877,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":37164636176,"id":1469,"parentId":1468,"tags":{"url":"/gunbuilder","memory.rss":"443006976","memory.heapUsed":"154482968","memory.heapTotal":"159989760"},"startTime":1764709129901,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":37164845134,"id":1470,"parentId":3,"tags":{},"startTime":1764709130110,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":37164852132,"id":1471,"parentId":3,"tags":{},"startTime":1764709130117,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11860,"timestamp":37505264775,"id":1482,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11956,"timestamp":37505264784,"id":1483,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12102,"timestamp":37505264803,"id":1485,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13999,"timestamp":37505264585,"id":1476,"parentId":1475,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709470529,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14383,"timestamp":37505264793,"id":1484,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14961,"timestamp":37505264733,"id":1478,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15245,"timestamp":37505264744,"id":1479,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2481,"timestamp":37505277803,"id":1488,"parentId":1487,"tags":{},"startTime":1764709470543,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2636,"timestamp":37505277651,"id":1487,"parentId":1486,"tags":{},"startTime":1764709470542,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":10554,"timestamp":37505277238,"id":1486,"parentId":1474,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"app-pages-browser"},"startTime":1764709470542,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24539,"timestamp":37505264753,"id":1480,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24591,"timestamp":37505264766,"id":1481,"parentId":1475,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24849,"timestamp":37505264715,"id":1477,"parentId":1475,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709470530,"traceId":"247574ce86dfd828"},{"name":"make","duration":25588,"timestamp":37505263995,"id":1475,"parentId":1474,"tags":{},"startTime":1764709470529,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1201,"timestamp":37505310930,"id":1490,"parentId":1489,"tags":{},"startTime":1764709470576,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37505312151,"id":1492,"parentId":1489,"tags":{},"startTime":1764709470577,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":64,"timestamp":37505312160,"id":1493,"parentId":1489,"tags":{},"startTime":1764709470577,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":37505312264,"id":1494,"parentId":1489,"tags":{},"startTime":1764709470577,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37505312298,"id":1495,"parentId":1489,"tags":{},"startTime":1764709470577,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":387,"timestamp":37505312146,"id":1491,"parentId":1489,"tags":{},"startTime":1764709470577,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":345,"timestamp":37505313093,"id":1496,"parentId":1489,"tags":{},"startTime":1764709470578,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":620,"timestamp":37505313441,"id":1497,"parentId":1489,"tags":{},"startTime":1764709470578,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1783,"timestamp":37505314955,"id":1498,"parentId":1489,"tags":{},"startTime":1764709470580,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":70,"timestamp":37505316738,"id":1499,"parentId":1489,"tags":{},"startTime":1764709470582,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":37505316801,"id":1500,"parentId":1489,"tags":{},"startTime":1764709470582,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3866,"timestamp":37505316835,"id":1501,"parentId":1489,"tags":{},"startTime":1764709470582,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":42,"timestamp":37505321125,"id":1503,"parentId":1474,"tags":{},"startTime":1764709470586,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":74,"timestamp":37505321095,"id":1502,"parentId":1474,"tags":{},"startTime":1764709470586,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11323,"timestamp":37505310644,"id":1489,"parentId":1474,"tags":{},"startTime":1764709470575,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":58862,"timestamp":37505263119,"id":1474,"parentId":1472,"tags":{"name":"client"},"startTime":1764709470528,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3525,"timestamp":37505321991,"id":1504,"parentId":1472,"tags":{},"startTime":1764709470587,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":73105,"timestamp":37505252844,"id":1472,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709470518,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":37505327747,"id":1507,"parentId":3,"tags":{},"startTime":1764709470593,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":37505327774,"id":1508,"parentId":3,"tags":{},"startTime":1764709470593,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4572,"timestamp":37505328880,"id":1510,"parentId":1506,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709470594,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4582,"timestamp":37505328884,"id":1511,"parentId":1506,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709470594,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4584,"timestamp":37505328885,"id":1512,"parentId":1506,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709470594,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4582,"timestamp":37505328890,"id":1513,"parentId":1506,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709470594,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5577,"timestamp":37505328849,"id":1509,"parentId":1506,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709470594,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":82000,"timestamp":37505254080,"id":1532,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709470602,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1158,"timestamp":37505336165,"id":1531,"parentId":1530,"tags":{},"startTime":1764709470601,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1225,"timestamp":37505336099,"id":1530,"parentId":1529,"tags":{},"startTime":1764709470601,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2665,"timestamp":37505335969,"id":1529,"parentId":1505,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"ssr"},"startTime":1764709470601,"traceId":"247574ce86dfd828"},{"name":"make","duration":11471,"timestamp":37505327199,"id":1506,"parentId":1505,"tags":{},"startTime":1764709470592,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1433,"timestamp":37505345016,"id":1534,"parentId":1533,"tags":{},"startTime":1764709470610,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37505346463,"id":1536,"parentId":1533,"tags":{},"startTime":1764709470611,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1648,"timestamp":37505346522,"id":1537,"parentId":1533,"tags":{},"startTime":1764709470611,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":37505348192,"id":1538,"parentId":1533,"tags":{},"startTime":1764709470613,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":5,"timestamp":37505348207,"id":1539,"parentId":1533,"tags":{},"startTime":1764709470613,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1976,"timestamp":37505346459,"id":1535,"parentId":1533,"tags":{},"startTime":1764709470611,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":299,"timestamp":37505349032,"id":1540,"parentId":1533,"tags":{},"startTime":1764709470614,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":560,"timestamp":37505349337,"id":1541,"parentId":1533,"tags":{},"startTime":1764709470614,"traceId":"247574ce86dfd828"},{"name":"hash","duration":824,"timestamp":37505350460,"id":1542,"parentId":1533,"tags":{},"startTime":1764709470615,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":37505351284,"id":1543,"parentId":1533,"tags":{},"startTime":1764709470616,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":43,"timestamp":37505351338,"id":1544,"parentId":1533,"tags":{},"startTime":1764709470616,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2283,"timestamp":37505351389,"id":1545,"parentId":1533,"tags":{},"startTime":1764709470616,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":99000,"timestamp":37505254474,"id":1546,"parentId":3,"tags":{"updatedModules":["[project]/data/gunbuilderParts.ts","[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709470619,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10310,"timestamp":37505344759,"id":1533,"parentId":1505,"tags":{},"startTime":1764709470610,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":29685,"timestamp":37505327054,"id":1505,"parentId":1473,"tags":{"name":"server"},"startTime":1764709470592,"traceId":"247574ce86dfd828"},{"name":"emit","duration":12439,"timestamp":37505356752,"id":1547,"parentId":1473,"tags":{},"startTime":1764709470622,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":116176,"timestamp":37505253735,"id":1473,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709470519,"traceId":"247574ce86dfd828"}] +[{"name":"add-entry","duration":15683,"timestamp":37573922350,"id":1553,"parentId":1551,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709539187,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15693,"timestamp":37573922360,"id":1554,"parentId":1551,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709539187,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15695,"timestamp":37573922367,"id":1555,"parentId":1551,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709539187,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15694,"timestamp":37573922373,"id":1556,"parentId":1551,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709539187,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16766,"timestamp":37573922246,"id":1552,"parentId":1551,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709539187,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2248,"timestamp":37573943823,"id":1574,"parentId":1573,"tags":{},"startTime":1764709539209,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2495,"timestamp":37573943582,"id":1573,"parentId":1572,"tags":{},"startTime":1764709539208,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":5842,"timestamp":37573943276,"id":1572,"parentId":1550,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"ssr"},"startTime":1764709539208,"traceId":"247574ce86dfd828"},{"name":"make","duration":34376,"timestamp":37573915022,"id":1551,"parentId":1550,"tags":{},"startTime":1764709539180,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1435,"timestamp":37573976960,"id":1576,"parentId":1575,"tags":{},"startTime":1764709539242,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37573978411,"id":1578,"parentId":1575,"tags":{},"startTime":1764709539243,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1325,"timestamp":37573978455,"id":1579,"parentId":1575,"tags":{},"startTime":1764709539243,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":37573979845,"id":1580,"parentId":1575,"tags":{},"startTime":1764709539245,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":37573979900,"id":1581,"parentId":1575,"tags":{},"startTime":1764709539245,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1773,"timestamp":37573978408,"id":1577,"parentId":1575,"tags":{},"startTime":1764709539243,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":305,"timestamp":37573980773,"id":1582,"parentId":1575,"tags":{},"startTime":1764709539246,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":574,"timestamp":37573981083,"id":1583,"parentId":1575,"tags":{},"startTime":1764709539246,"traceId":"247574ce86dfd828"},{"name":"hash","duration":769,"timestamp":37573982270,"id":1584,"parentId":1575,"tags":{},"startTime":1764709539247,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":44,"timestamp":37573983039,"id":1585,"parentId":1575,"tags":{},"startTime":1764709539248,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":30,"timestamp":37573983080,"id":1586,"parentId":1575,"tags":{},"startTime":1764709539248,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":853,"timestamp":37573983112,"id":1587,"parentId":1575,"tags":{},"startTime":1764709539248,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8506,"timestamp":37573976736,"id":1575,"parentId":1550,"tags":{},"startTime":1764709539242,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":72370,"timestamp":37573914457,"id":1550,"parentId":1548,"tags":{"name":"server"},"startTime":1764709539179,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2416,"timestamp":37573986846,"id":1588,"parentId":1548,"tags":{},"startTime":1764709539252,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":85141,"timestamp":37573904569,"id":1548,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709539169,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1879,"timestamp":37573996877,"id":1597,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1904,"timestamp":37573996878,"id":1598,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1932,"timestamp":37573996890,"id":1600,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2616,"timestamp":37573996884,"id":1599,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2693,"timestamp":37573996812,"id":1591,"parentId":1590,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2903,"timestamp":37573996869,"id":1593,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3023,"timestamp":37573996871,"id":1594,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1203,"timestamp":37573999135,"id":1603,"parentId":1602,"tags":{},"startTime":1764709539264,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1277,"timestamp":37573999061,"id":1602,"parentId":1601,"tags":{},"startTime":1764709539264,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":3710,"timestamp":37573998933,"id":1601,"parentId":1589,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"app-pages-browser"},"startTime":1764709539264,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6049,"timestamp":37573996874,"id":1595,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6084,"timestamp":37573996866,"id":1592,"parentId":1590,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6077,"timestamp":37573996876,"id":1596,"parentId":1590,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709539262,"traceId":"247574ce86dfd828"},{"name":"make","duration":11260,"timestamp":37573991700,"id":1590,"parentId":1589,"tags":{},"startTime":1764709539256,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":842,"timestamp":37574008394,"id":1605,"parentId":1604,"tags":{},"startTime":1764709539273,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37574009247,"id":1607,"parentId":1604,"tags":{},"startTime":1764709539274,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":19,"timestamp":37574009283,"id":1608,"parentId":1604,"tags":{},"startTime":1764709539274,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":37574009312,"id":1609,"parentId":1604,"tags":{},"startTime":1764709539274,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":37574009322,"id":1610,"parentId":1604,"tags":{},"startTime":1764709539274,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":317,"timestamp":37574009244,"id":1606,"parentId":1604,"tags":{},"startTime":1764709539274,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":13892,"timestamp":37574010080,"id":1611,"parentId":1604,"tags":{},"startTime":1764709539275,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":504,"timestamp":37574023986,"id":1612,"parentId":1604,"tags":{},"startTime":1764709539289,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1994,"timestamp":37574025467,"id":1613,"parentId":1604,"tags":{},"startTime":1764709539290,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":65,"timestamp":37574027461,"id":1614,"parentId":1604,"tags":{},"startTime":1764709539292,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":37574027521,"id":1615,"parentId":1604,"tags":{},"startTime":1764709539292,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1544,"timestamp":37574027553,"id":1616,"parentId":1604,"tags":{},"startTime":1764709539292,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":191,"timestamp":37574029846,"id":1618,"parentId":1589,"tags":{},"startTime":1764709539295,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":278,"timestamp":37574029762,"id":1617,"parentId":1589,"tags":{},"startTime":1764709539295,"traceId":"247574ce86dfd828"},{"name":"seal","duration":22618,"timestamp":37574008153,"id":1604,"parentId":1589,"tags":{},"startTime":1764709539273,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":39772,"timestamp":37573991011,"id":1589,"parentId":1549,"tags":{"name":"client"},"startTime":1764709539256,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2873,"timestamp":37574030791,"id":1619,"parentId":1549,"tags":{},"startTime":1764709539296,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":129531,"timestamp":37573904892,"id":1549,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709539170,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":4,"timestamp":37574035206,"id":1620,"parentId":3,"tags":{},"startTime":1764709539300,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":37574035511,"id":1621,"parentId":3,"tags":{},"startTime":1764709539300,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":137000,"timestamp":37573906568,"id":1622,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709539308,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":144000,"timestamp":37573905842,"id":1623,"parentId":3,"tags":{"updatedModules":["[project]/data/gunbuilderParts.ts","[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709539316,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12956,"timestamp":37595298016,"id":1629,"parentId":1627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709560563,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12969,"timestamp":37595298023,"id":1630,"parentId":1627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709560563,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12976,"timestamp":37595298027,"id":1631,"parentId":1627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709560563,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12980,"timestamp":37595298031,"id":1632,"parentId":1627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709560563,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13962,"timestamp":37595297946,"id":1628,"parentId":1627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709560563,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2588,"timestamp":37595316827,"id":1650,"parentId":1649,"tags":{},"startTime":1764709560582,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2743,"timestamp":37595316680,"id":1649,"parentId":1648,"tags":{},"startTime":1764709560581,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":5986,"timestamp":37595316415,"id":1648,"parentId":1626,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"ssr"},"startTime":1764709560581,"traceId":"247574ce86dfd828"},{"name":"make","duration":29255,"timestamp":37595293513,"id":1627,"parentId":1626,"tags":{},"startTime":1764709560558,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1750,"timestamp":37595324233,"id":1652,"parentId":1651,"tags":{},"startTime":1764709560589,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":37595325994,"id":1654,"parentId":1651,"tags":{},"startTime":1764709560591,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1672,"timestamp":37595326006,"id":1655,"parentId":1651,"tags":{},"startTime":1764709560591,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":37595327689,"id":1656,"parentId":1651,"tags":{},"startTime":1764709560592,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37595327702,"id":1657,"parentId":1651,"tags":{},"startTime":1764709560592,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2003,"timestamp":37595325991,"id":1653,"parentId":1651,"tags":{},"startTime":1764709560591,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":339,"timestamp":37595328734,"id":1658,"parentId":1651,"tags":{},"startTime":1764709560594,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":691,"timestamp":37595329080,"id":1659,"parentId":1651,"tags":{},"startTime":1764709560594,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1176,"timestamp":37595330394,"id":1660,"parentId":1651,"tags":{},"startTime":1764709560595,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":55,"timestamp":37595331571,"id":1661,"parentId":1651,"tags":{},"startTime":1764709560596,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":37595331622,"id":1662,"parentId":1651,"tags":{},"startTime":1764709560596,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1293,"timestamp":37595331654,"id":1663,"parentId":1651,"tags":{},"startTime":1764709560596,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10103,"timestamp":37595323939,"id":1651,"parentId":1626,"tags":{},"startTime":1764709560589,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":44948,"timestamp":37595293194,"id":1626,"parentId":1624,"tags":{"name":"server"},"startTime":1764709560558,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1936,"timestamp":37595338162,"id":1664,"parentId":1624,"tags":{},"startTime":1764709560603,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":56768,"timestamp":37595283539,"id":1624,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709560548,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2047,"timestamp":37595346988,"id":1673,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2079,"timestamp":37595346990,"id":1674,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2133,"timestamp":37595346994,"id":1676,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2847,"timestamp":37595346992,"id":1675,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2902,"timestamp":37595346943,"id":1667,"parentId":1666,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3149,"timestamp":37595346977,"id":1669,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3290,"timestamp":37595346981,"id":1670,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1440,"timestamp":37595349434,"id":1679,"parentId":1678,"tags":{},"startTime":1764709560614,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1504,"timestamp":37595349372,"id":1678,"parentId":1677,"tags":{},"startTime":1764709560614,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":3891,"timestamp":37595349237,"id":1677,"parentId":1665,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"app-pages-browser"},"startTime":1764709560614,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7784,"timestamp":37595346983,"id":1671,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8019,"timestamp":37595346972,"id":1668,"parentId":1666,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8009,"timestamp":37595346986,"id":1672,"parentId":1666,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709560612,"traceId":"247574ce86dfd828"},{"name":"make","duration":13698,"timestamp":37595341311,"id":1666,"parentId":1665,"tags":{},"startTime":1764709560606,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":868,"timestamp":37595356172,"id":1681,"parentId":1680,"tags":{},"startTime":1764709560621,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":37595357053,"id":1683,"parentId":1680,"tags":{},"startTime":1764709560622,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":24,"timestamp":37595357065,"id":1684,"parentId":1680,"tags":{},"startTime":1764709560622,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":37595357100,"id":1685,"parentId":1680,"tags":{},"startTime":1764709560622,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":37595357111,"id":1686,"parentId":1680,"tags":{},"startTime":1764709560622,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":227,"timestamp":37595357049,"id":1682,"parentId":1680,"tags":{},"startTime":1764709560622,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":383,"timestamp":37595357825,"id":1687,"parentId":1680,"tags":{},"startTime":1764709560623,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":670,"timestamp":37595358214,"id":1688,"parentId":1680,"tags":{},"startTime":1764709560623,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1824,"timestamp":37595359607,"id":1689,"parentId":1680,"tags":{},"startTime":1764709560624,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":86,"timestamp":37595361431,"id":1690,"parentId":1680,"tags":{},"startTime":1764709560626,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":37595361511,"id":1691,"parentId":1680,"tags":{},"startTime":1764709560626,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1984,"timestamp":37595361539,"id":1692,"parentId":1680,"tags":{},"startTime":1764709560626,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":36,"timestamp":37595363976,"id":1694,"parentId":1665,"tags":{},"startTime":1764709560629,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":74,"timestamp":37595363943,"id":1693,"parentId":1665,"tags":{},"startTime":1764709560629,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8933,"timestamp":37595355911,"id":1680,"parentId":1665,"tags":{},"startTime":1764709560621,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":23748,"timestamp":37595341118,"id":1665,"parentId":1625,"tags":{"name":"client"},"startTime":1764709560606,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3972,"timestamp":37595364880,"id":1695,"parentId":1625,"tags":{},"startTime":1764709560630,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":85657,"timestamp":37595283740,"id":1625,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764709560549,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":37595370109,"id":1696,"parentId":3,"tags":{},"startTime":1764709560635,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":37595370135,"id":1697,"parentId":3,"tags":{},"startTime":1764709560635,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":98000,"timestamp":37595283856,"id":1698,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709560650,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":107000,"timestamp":37595285281,"id":1699,"parentId":3,"tags":{"updatedModules":["[project]/data/gunbuilderParts.ts","[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709560657,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14464,"timestamp":37748525858,"id":1706,"parentId":1703,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709713791,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14480,"timestamp":37748525866,"id":1707,"parentId":1703,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709713791,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14479,"timestamp":37748525874,"id":1708,"parentId":1703,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709713791,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15827,"timestamp":37748525730,"id":1704,"parentId":1703,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709713790,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2790,"timestamp":37748539564,"id":1711,"parentId":1710,"tags":{},"startTime":1764709713804,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2954,"timestamp":37748539404,"id":1710,"parentId":1709,"tags":{},"startTime":1764709713804,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6313,"timestamp":37748539050,"id":1709,"parentId":1702,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764709713804,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20142,"timestamp":37748525847,"id":1705,"parentId":1703,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709713791,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5746,"timestamp":37748549908,"id":1729,"parentId":1728,"tags":{},"startTime":1764709713815,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5864,"timestamp":37748549797,"id":1728,"parentId":1727,"tags":{},"startTime":1764709713814,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":15604,"timestamp":37748549580,"id":1727,"parentId":1702,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764709713814,"traceId":"247574ce86dfd828"},{"name":"make","duration":47220,"timestamp":37748521290,"id":1703,"parentId":1702,"tags":{},"startTime":1764709713786,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2503,"timestamp":37748576550,"id":1731,"parentId":1730,"tags":{},"startTime":1764709713841,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":5,"timestamp":37748579074,"id":1733,"parentId":1730,"tags":{},"startTime":1764709713844,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":2102,"timestamp":37748579096,"id":1734,"parentId":1730,"tags":{},"startTime":1764709713844,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":6,"timestamp":37748581217,"id":1735,"parentId":1730,"tags":{},"startTime":1764709713846,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":37748581236,"id":1736,"parentId":1730,"tags":{},"startTime":1764709713846,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2554,"timestamp":37748579068,"id":1732,"parentId":1730,"tags":{},"startTime":1764709713844,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":471,"timestamp":37748582488,"id":1737,"parentId":1730,"tags":{},"startTime":1764709713847,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1671,"timestamp":37748582967,"id":1738,"parentId":1730,"tags":{},"startTime":1764709713848,"traceId":"247574ce86dfd828"},{"name":"hash","duration":909,"timestamp":37748585472,"id":1739,"parentId":1730,"tags":{},"startTime":1764709713850,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":79,"timestamp":37748586381,"id":1740,"parentId":1730,"tags":{},"startTime":1764709713851,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":40,"timestamp":37748586455,"id":1741,"parentId":1730,"tags":{},"startTime":1764709713851,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2597,"timestamp":37748586498,"id":1742,"parentId":1730,"tags":{},"startTime":1764709713851,"traceId":"247574ce86dfd828"},{"name":"seal","duration":14522,"timestamp":37748576200,"id":1730,"parentId":1702,"tags":{},"startTime":1764709713841,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":72242,"timestamp":37748520678,"id":1702,"parentId":1700,"tags":{"name":"server"},"startTime":1764709713785,"traceId":"247574ce86dfd828"},{"name":"emit","duration":11820,"timestamp":37748592953,"id":1743,"parentId":1700,"tags":{},"startTime":1764709713858,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":94480,"timestamp":37748510532,"id":1700,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709713775,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2843,"timestamp":37748609987,"id":1753,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2894,"timestamp":37748609989,"id":1755,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3163,"timestamp":37748609931,"id":1746,"parentId":1745,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3367,"timestamp":37748609988,"id":1754,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3646,"timestamp":37748609977,"id":1748,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4747,"timestamp":37748609982,"id":1750,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":766,"timestamp":37748613977,"id":1761,"parentId":1760,"tags":{},"startTime":1764709713879,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8199,"timestamp":37748609974,"id":1747,"parentId":1745,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8191,"timestamp":37748609985,"id":1752,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":6023,"timestamp":37748612261,"id":1759,"parentId":1758,"tags":{},"startTime":1764709713877,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":6094,"timestamp":37748612190,"id":1758,"parentId":1757,"tags":{},"startTime":1764709713877,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":11012,"timestamp":37748612112,"id":1757,"parentId":1744,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764709713877,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":23383,"timestamp":37748614783,"id":1763,"parentId":1762,"tags":{},"startTime":1764709713879,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":23729,"timestamp":37748614771,"id":1762,"parentId":1760,"tags":{},"startTime":1764709713879,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3615,"timestamp":37748638524,"id":1764,"parentId":1760,"tags":{"astUsed":"true"},"startTime":1764709713903,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":29371,"timestamp":37748613838,"id":1760,"parentId":1756,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764709713878,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33462,"timestamp":37748609984,"id":1751,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":34121,"timestamp":37748611471,"id":1756,"parentId":1744,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764709713876,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":32,"timestamp":37748645659,"id":1765,"parentId":1756,"tags":{},"startTime":1764709713910,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":35730,"timestamp":37748609979,"id":1749,"parentId":1745,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709713875,"traceId":"247574ce86dfd828"},{"name":"make","duration":39915,"timestamp":37748605801,"id":1745,"parentId":1744,"tags":{},"startTime":1764709713870,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":847,"timestamp":37748651817,"id":1767,"parentId":1766,"tags":{},"startTime":1764709713916,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":37748652676,"id":1769,"parentId":1766,"tags":{},"startTime":1764709713917,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":22,"timestamp":37748652690,"id":1770,"parentId":1766,"tags":{},"startTime":1764709713917,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":37748652722,"id":1771,"parentId":1766,"tags":{},"startTime":1764709713917,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37748652739,"id":1772,"parentId":1766,"tags":{},"startTime":1764709713917,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":345,"timestamp":37748652672,"id":1768,"parentId":1766,"tags":{},"startTime":1764709713917,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":290,"timestamp":37748653584,"id":1773,"parentId":1766,"tags":{},"startTime":1764709713918,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1291,"timestamp":37748653880,"id":1774,"parentId":1766,"tags":{},"startTime":1764709713919,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1645,"timestamp":37748655877,"id":1775,"parentId":1766,"tags":{},"startTime":1764709713921,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":77,"timestamp":37748657522,"id":1776,"parentId":1766,"tags":{},"startTime":1764709713922,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":26,"timestamp":37748657593,"id":1777,"parentId":1766,"tags":{},"startTime":1764709713922,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3184,"timestamp":37748657623,"id":1778,"parentId":1766,"tags":{},"startTime":1764709713922,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":62,"timestamp":37748661264,"id":1780,"parentId":1744,"tags":{},"startTime":1764709713926,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":106,"timestamp":37748661230,"id":1779,"parentId":1744,"tags":{},"startTime":1764709713926,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10771,"timestamp":37748651513,"id":1766,"parentId":1744,"tags":{},"startTime":1764709713916,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":56652,"timestamp":37748605646,"id":1744,"parentId":1701,"tags":{"name":"client"},"startTime":1764709713870,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7398,"timestamp":37748662307,"id":1781,"parentId":1701,"tags":{},"startTime":1764709713927,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":159522,"timestamp":37748510709,"id":1701,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709713775,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":1,"timestamp":37748674145,"id":1782,"parentId":3,"tags":{},"startTime":1764709713939,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":37748675313,"id":1783,"parentId":3,"tags":{},"startTime":1764709713940,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":181000,"timestamp":37748511664,"id":1786,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709713958,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19072,"timestamp":37748675413,"id":1784,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764709713940,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37748694500,"id":1787,"parentId":1784,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"546406400","memory.heapUsed":"171530712","memory.heapTotal":"240484352"},"startTime":1764709713959,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":18424,"timestamp":37748676200,"id":1785,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764709713941,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37748694629,"id":1788,"parentId":1785,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"546406400","memory.heapUsed":"171565112","memory.heapTotal":"240484352"},"startTime":1764709713959,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":200000,"timestamp":37748511721,"id":1789,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709713977,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15379,"timestamp":37800580897,"id":1801,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15588,"timestamp":37800580907,"id":1803,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16278,"timestamp":37800580757,"id":1794,"parentId":1793,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17114,"timestamp":37800580902,"id":1802,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18846,"timestamp":37800580865,"id":1796,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23596,"timestamp":37800580875,"id":1798,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":10132,"timestamp":37800594618,"id":1807,"parentId":1806,"tags":{},"startTime":1764709765859,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":10351,"timestamp":37800594403,"id":1806,"parentId":1805,"tags":{},"startTime":1764709765859,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":27776,"timestamp":37800594173,"id":1805,"parentId":1792,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764709765859,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":41727,"timestamp":37800580892,"id":1800,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765846,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":22005,"timestamp":37800600638,"id":1809,"parentId":1808,"tags":{},"startTime":1764709765865,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":47570,"timestamp":37800580856,"id":1795,"parentId":1793,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":47899,"timestamp":37800580882,"id":1799,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765846,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":24766,"timestamp":37800622683,"id":1811,"parentId":1810,"tags":{},"startTime":1764709765887,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":25112,"timestamp":37800622665,"id":1810,"parentId":1808,"tags":{},"startTime":1764709765887,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3238,"timestamp":37800647791,"id":1812,"parentId":1808,"tags":{"astUsed":"true"},"startTime":1764709765912,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":52172,"timestamp":37800600450,"id":1808,"parentId":1804,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764709765865,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":61160,"timestamp":37800593593,"id":1804,"parentId":1792,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764709765858,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":15,"timestamp":37800654833,"id":1813,"parentId":1804,"tags":{},"startTime":1764709765919,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":73997,"timestamp":37800580871,"id":1797,"parentId":1793,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"make","duration":74671,"timestamp":37800580207,"id":1793,"parentId":1792,"tags":{},"startTime":1764709765845,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":705,"timestamp":37800655770,"id":1815,"parentId":1814,"tags":{},"startTime":1764709765920,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":37800656485,"id":1817,"parentId":1814,"tags":{},"startTime":1764709765921,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":22,"timestamp":37800656494,"id":1818,"parentId":1814,"tags":{},"startTime":1764709765921,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":37800656523,"id":1819,"parentId":1814,"tags":{},"startTime":1764709765921,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37800656534,"id":1820,"parentId":1814,"tags":{},"startTime":1764709765921,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":332,"timestamp":37800656482,"id":1816,"parentId":1814,"tags":{},"startTime":1764709765921,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":206,"timestamp":37800657316,"id":1821,"parentId":1814,"tags":{},"startTime":1764709765922,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1328,"timestamp":37800657527,"id":1822,"parentId":1814,"tags":{},"startTime":1764709765922,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1673,"timestamp":37800659393,"id":1823,"parentId":1814,"tags":{},"startTime":1764709765924,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":58,"timestamp":37800661066,"id":1824,"parentId":1814,"tags":{},"startTime":1764709765926,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":30,"timestamp":37800661120,"id":1825,"parentId":1814,"tags":{},"startTime":1764709765926,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2766,"timestamp":37800661152,"id":1826,"parentId":1814,"tags":{},"startTime":1764709765926,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":41,"timestamp":37800664272,"id":1828,"parentId":1792,"tags":{},"startTime":1764709765929,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":73,"timestamp":37800664241,"id":1827,"parentId":1792,"tags":{},"startTime":1764709765929,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9471,"timestamp":37800655549,"id":1814,"parentId":1792,"tags":{},"startTime":1764709765920,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":92406,"timestamp":37800572627,"id":1792,"parentId":1790,"tags":{"name":"client"},"startTime":1764709765837,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3060,"timestamp":37800665041,"id":1829,"parentId":1790,"tags":{},"startTime":1764709765930,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":106008,"timestamp":37800562499,"id":1790,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709765827,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":37800670530,"id":1832,"parentId":3,"tags":{},"startTime":1764709765935,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":37800670560,"id":1833,"parentId":3,"tags":{},"startTime":1764709765935,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6536,"timestamp":37800671618,"id":1836,"parentId":1831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709765936,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6544,"timestamp":37800671620,"id":1837,"parentId":1831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709765936,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6544,"timestamp":37800671623,"id":1838,"parentId":1831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709765936,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7294,"timestamp":37800671598,"id":1834,"parentId":1831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709765936,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1448,"timestamp":37800677474,"id":1841,"parentId":1840,"tags":{},"startTime":1764709765942,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1517,"timestamp":37800677406,"id":1840,"parentId":1839,"tags":{},"startTime":1764709765942,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2406,"timestamp":37800677228,"id":1839,"parentId":1830,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764709765942,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8542,"timestamp":37800671616,"id":1835,"parentId":1831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764709765936,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3939,"timestamp":37800683042,"id":1859,"parentId":1858,"tags":{},"startTime":1764709765948,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4119,"timestamp":37800682868,"id":1858,"parentId":1857,"tags":{},"startTime":1764709765947,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":13911,"timestamp":37800682389,"id":1857,"parentId":1830,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764709765947,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":131000,"timestamp":37800563643,"id":1860,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764709765962,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":135000,"timestamp":37800563593,"id":1861,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764709765967,"traceId":"247574ce86dfd828"},{"name":"make","duration":32775,"timestamp":37800669965,"id":1831,"parentId":1830,"tags":{},"startTime":1764709765935,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1319,"timestamp":37800703706,"id":1863,"parentId":1862,"tags":{},"startTime":1764709765968,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":37800705040,"id":1865,"parentId":1862,"tags":{},"startTime":1764709765970,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1114,"timestamp":37800705051,"id":1866,"parentId":1862,"tags":{},"startTime":1764709765970,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":37800706178,"id":1867,"parentId":1862,"tags":{},"startTime":1764709765971,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":37800706194,"id":1868,"parentId":1862,"tags":{},"startTime":1764709765971,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1317,"timestamp":37800705036,"id":1864,"parentId":1862,"tags":{},"startTime":1764709765970,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":210,"timestamp":37800706760,"id":1869,"parentId":1862,"tags":{},"startTime":1764709765971,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":754,"timestamp":37800706974,"id":1870,"parentId":1862,"tags":{},"startTime":1764709765972,"traceId":"247574ce86dfd828"},{"name":"hash","duration":742,"timestamp":37800708287,"id":1871,"parentId":1862,"tags":{},"startTime":1764709765973,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":40,"timestamp":37800709029,"id":1872,"parentId":1862,"tags":{},"startTime":1764709765974,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":37800709066,"id":1873,"parentId":1862,"tags":{},"startTime":1764709765974,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1950,"timestamp":37800709098,"id":1874,"parentId":1862,"tags":{},"startTime":1764709765974,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8515,"timestamp":37800703538,"id":1862,"parentId":1830,"tags":{},"startTime":1764709765968,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":43882,"timestamp":37800669807,"id":1830,"parentId":1791,"tags":{"name":"server"},"startTime":1764709765934,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1683,"timestamp":37800713706,"id":1875,"parentId":1791,"tags":{},"startTime":1764709765978,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":152122,"timestamp":37800563811,"id":1791,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764709765828,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":9376,"timestamp":37800721172,"id":1876,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764709765986,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37800730568,"id":1878,"parentId":1876,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"482410496","memory.heapUsed":"170864576","memory.heapTotal":"194183168"},"startTime":1764709765995,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":12038,"timestamp":37800721398,"id":1877,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764709765986,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":37800733444,"id":1879,"parentId":1877,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"482410496","memory.heapUsed":"171142544","memory.heapTotal":"194183168"},"startTime":1764709765998,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19905,"timestamp":37833989951,"id":1880,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","isTurbopack":false},"startTime":1764709799255,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":37834009951,"id":1881,"parentId":1880,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","memory.rss":"481509376","memory.heapUsed":"173520896","memory.heapTotal":"196034560"},"startTime":1764709799275,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8358,"timestamp":37834016670,"id":1882,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","isTurbopack":false},"startTime":1764709799281,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":37834025065,"id":1883,"parentId":1882,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","memory.rss":"482426880","memory.heapUsed":"174470704","memory.heapTotal":"197083136"},"startTime":1764709799290,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11627,"timestamp":37839217235,"id":1884,"tags":{"url":"/gunbuilder?_rsc=k58jv","isTurbopack":false},"startTime":1764709804482,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":37839228908,"id":1885,"parentId":1884,"tags":{"url":"/gunbuilder?_rsc=k58jv","memory.rss":"483311616","memory.heapUsed":"175351984","memory.heapTotal":"197869568"},"startTime":1764709804493,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12920,"timestamp":38102927834,"id":1897,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13162,"timestamp":38102927849,"id":1899,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13870,"timestamp":38102927709,"id":1890,"parentId":1889,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14602,"timestamp":38102927839,"id":1898,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16137,"timestamp":38102927809,"id":1892,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":21084,"timestamp":38102927819,"id":1894,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":21179,"timestamp":38102927830,"id":1896,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":4211,"timestamp":38102944862,"id":1905,"parentId":1904,"tags":{},"startTime":1764710068209,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":20413,"timestamp":38102938517,"id":1903,"parentId":1902,"tags":{},"startTime":1764710068203,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":20710,"timestamp":38102938234,"id":1902,"parentId":1901,"tags":{},"startTime":1764710068203,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":37809,"timestamp":38102938007,"id":1901,"parentId":1888,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764710068202,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":48687,"timestamp":38102927800,"id":1891,"parentId":1889,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":48548,"timestamp":38102949168,"id":1907,"parentId":1906,"tags":{},"startTime":1764710068214,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":48959,"timestamp":38102949150,"id":1906,"parentId":1904,"tags":{},"startTime":1764710068214,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4356,"timestamp":38102998159,"id":1908,"parentId":1904,"tags":{"astUsed":"true"},"startTime":1764710068263,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":59669,"timestamp":38102944508,"id":1904,"parentId":1900,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764710068209,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":76951,"timestamp":38102927825,"id":1895,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":71559,"timestamp":38102936382,"id":1900,"parentId":1888,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764710068201,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":39,"timestamp":38103008086,"id":1909,"parentId":1900,"tags":{},"startTime":1764710068272,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":80331,"timestamp":38102927814,"id":1893,"parentId":1889,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710068192,"traceId":"247574ce86dfd828"},{"name":"make","duration":81064,"timestamp":38102927098,"id":1889,"parentId":1888,"tags":{},"startTime":1764710068191,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":838,"timestamp":38103036887,"id":1911,"parentId":1910,"tags":{},"startTime":1764710068301,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":38103037739,"id":1913,"parentId":1910,"tags":{},"startTime":1764710068302,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":36,"timestamp":38103037785,"id":1914,"parentId":1910,"tags":{},"startTime":1764710068302,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":38103037849,"id":1915,"parentId":1910,"tags":{},"startTime":1764710068302,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":38103037881,"id":1916,"parentId":1910,"tags":{},"startTime":1764710068302,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":440,"timestamp":38103037737,"id":1912,"parentId":1910,"tags":{},"startTime":1764710068302,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":239,"timestamp":38103038619,"id":1917,"parentId":1910,"tags":{},"startTime":1764710068303,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":957,"timestamp":38103038863,"id":1918,"parentId":1910,"tags":{},"startTime":1764710068303,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2419,"timestamp":38103041603,"id":1919,"parentId":1910,"tags":{},"startTime":1764710068306,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":127,"timestamp":38103044016,"id":1920,"parentId":1910,"tags":{},"startTime":1764710068308,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":54,"timestamp":38103044133,"id":1921,"parentId":1910,"tags":{},"startTime":1764710068309,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2964,"timestamp":38103044191,"id":1922,"parentId":1910,"tags":{},"startTime":1764710068309,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":1441,"timestamp":38103047958,"id":1924,"parentId":1888,"tags":{},"startTime":1764710068312,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":1522,"timestamp":38103047883,"id":1923,"parentId":1888,"tags":{},"startTime":1764710068312,"traceId":"247574ce86dfd828"},{"name":"seal","duration":13795,"timestamp":38103036539,"id":1910,"parentId":1888,"tags":{},"startTime":1764710068301,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":125043,"timestamp":38102925315,"id":1888,"parentId":1886,"tags":{"name":"client"},"startTime":1764710068190,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3341,"timestamp":38103050376,"id":1925,"parentId":1886,"tags":{},"startTime":1764710068315,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":141766,"timestamp":38102912515,"id":1886,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764710068177,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":38103056359,"id":1928,"parentId":3,"tags":{},"startTime":1764710068321,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":38103056392,"id":1929,"parentId":3,"tags":{},"startTime":1764710068321,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4503,"timestamp":38103058111,"id":1931,"parentId":1927,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710068322,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4511,"timestamp":38103058114,"id":1932,"parentId":1927,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710068323,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4513,"timestamp":38103058115,"id":1933,"parentId":1927,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710068323,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4515,"timestamp":38103058117,"id":1934,"parentId":1927,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710068323,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1287,"timestamp":38103062219,"id":1937,"parentId":1936,"tags":{},"startTime":1764710068327,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1370,"timestamp":38103062139,"id":1936,"parentId":1935,"tags":{},"startTime":1764710068327,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2595,"timestamp":38103061963,"id":1935,"parentId":1926,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764710068326,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6981,"timestamp":38103058074,"id":1930,"parentId":1927,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710068322,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":154000,"timestamp":38102913365,"id":1956,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764710068333,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2788,"timestamp":38103066640,"id":1955,"parentId":1954,"tags":{},"startTime":1764710068331,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2838,"timestamp":38103066591,"id":1954,"parentId":1953,"tags":{},"startTime":1764710068331,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":8889,"timestamp":38103066502,"id":1953,"parentId":1926,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764710068331,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":161000,"timestamp":38102913940,"id":1957,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764710068341,"traceId":"247574ce86dfd828"},{"name":"make","duration":21601,"timestamp":38103055666,"id":1927,"parentId":1926,"tags":{},"startTime":1764710068320,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1580,"timestamp":38103082520,"id":1959,"parentId":1958,"tags":{},"startTime":1764710068347,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":38103084115,"id":1961,"parentId":1958,"tags":{},"startTime":1764710068349,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1444,"timestamp":38103084170,"id":1962,"parentId":1958,"tags":{},"startTime":1764710068349,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":38103085628,"id":1963,"parentId":1958,"tags":{},"startTime":1764710068350,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":6,"timestamp":38103085644,"id":1964,"parentId":1958,"tags":{},"startTime":1764710068350,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1800,"timestamp":38103084110,"id":1960,"parentId":1958,"tags":{},"startTime":1764710068348,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":272,"timestamp":38103086454,"id":1965,"parentId":1958,"tags":{},"startTime":1764710068351,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1040,"timestamp":38103086733,"id":1966,"parentId":1958,"tags":{},"startTime":1764710068351,"traceId":"247574ce86dfd828"},{"name":"hash","duration":809,"timestamp":38103088319,"id":1967,"parentId":1958,"tags":{},"startTime":1764710068353,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":63,"timestamp":38103089128,"id":1968,"parentId":1958,"tags":{},"startTime":1764710068354,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":27,"timestamp":38103089186,"id":1969,"parentId":1958,"tags":{},"startTime":1764710068354,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2175,"timestamp":38103089218,"id":1970,"parentId":1958,"tags":{},"startTime":1764710068354,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10246,"timestamp":38103082328,"id":1958,"parentId":1926,"tags":{},"startTime":1764710068347,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":38964,"timestamp":38103055461,"id":1926,"parentId":1887,"tags":{"name":"server"},"startTime":1764710068320,"traceId":"247574ce86dfd828"},{"name":"emit","duration":11198,"timestamp":38103094442,"id":1971,"parentId":1887,"tags":{},"startTime":1764710068359,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":191645,"timestamp":38102914746,"id":1887,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764710068179,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":18467,"timestamp":38103111286,"id":1972,"tags":{"url":"/gunbuilder?_rsc=9gfev","isTurbopack":false},"startTime":1764710068376,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38103129775,"id":1974,"parentId":1972,"tags":{"url":"/gunbuilder?_rsc=9gfev","memory.rss":"502087680","memory.heapUsed":"175005240","memory.heapTotal":"199294976"},"startTime":1764710068394,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":21081,"timestamp":38103111645,"id":1973,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764710068376,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38103132733,"id":1975,"parentId":1973,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"502087680","memory.heapUsed":"175267784","memory.heapTotal":"199294976"},"startTime":1764710068397,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10659,"timestamp":38306719109,"id":1986,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10754,"timestamp":38306719114,"id":1987,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10855,"timestamp":38306719141,"id":1989,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13975,"timestamp":38306718936,"id":1980,"parentId":1979,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14773,"timestamp":38306719119,"id":1988,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15660,"timestamp":38306719084,"id":1982,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5729,"timestamp":38306730848,"id":1993,"parentId":1992,"tags":{},"startTime":1764710271995,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5950,"timestamp":38306730633,"id":1992,"parentId":1991,"tags":{},"startTime":1764710271995,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":12831,"timestamp":38306730382,"id":1991,"parentId":1978,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"app-pages-browser"},"startTime":1764710271995,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":25054,"timestamp":38306719096,"id":1984,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":11055,"timestamp":38306735651,"id":1995,"parentId":1994,"tags":{},"startTime":1764710272000,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33499,"timestamp":38306719070,"id":1981,"parentId":1979,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":30709,"timestamp":38306746785,"id":1997,"parentId":1996,"tags":{},"startTime":1764710272011,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":31114,"timestamp":38306746768,"id":1996,"parentId":1994,"tags":{},"startTime":1764710272011,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4349,"timestamp":38306777930,"id":1998,"parentId":1994,"tags":{"astUsed":"true"},"startTime":1764710272042,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":48680,"timestamp":38306735297,"id":1994,"parentId":1990,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764710272000,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":65346,"timestamp":38306725443,"id":1990,"parentId":1978,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764710271990,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":38,"timestamp":38306791165,"id":1999,"parentId":1990,"tags":{},"startTime":1764710272055,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":72149,"timestamp":38306719090,"id":1983,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":78505,"timestamp":38306719104,"id":1985,"parentId":1979,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710271983,"traceId":"247574ce86dfd828"},{"name":"make","duration":79503,"timestamp":38306718117,"id":1979,"parentId":1978,"tags":{},"startTime":1764710271982,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":766,"timestamp":38306798623,"id":2001,"parentId":2000,"tags":{},"startTime":1764710272063,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":38306799402,"id":2003,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":33,"timestamp":38306799438,"id":2004,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":38306799492,"id":2005,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":38306799520,"id":2006,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":368,"timestamp":38306799398,"id":2002,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":323,"timestamp":38306800266,"id":2007,"parentId":2000,"tags":{},"startTime":1764710272064,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":910,"timestamp":38306800602,"id":2008,"parentId":2000,"tags":{},"startTime":1764710272065,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2360,"timestamp":38306802462,"id":2009,"parentId":2000,"tags":{},"startTime":1764710272067,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":112,"timestamp":38306804822,"id":2010,"parentId":2000,"tags":{},"startTime":1764710272069,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":46,"timestamp":38306804926,"id":2011,"parentId":2000,"tags":{},"startTime":1764710272069,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1853,"timestamp":38306804977,"id":2012,"parentId":2000,"tags":{},"startTime":1764710272069,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":214,"timestamp":38306807771,"id":2014,"parentId":1978,"tags":{},"startTime":1764710272072,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":290,"timestamp":38306807699,"id":2013,"parentId":1978,"tags":{},"startTime":1764710272072,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10743,"timestamp":38306798377,"id":2000,"parentId":1978,"tags":{},"startTime":1764710272063,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":92683,"timestamp":38306716453,"id":1978,"parentId":1976,"tags":{"name":"client"},"startTime":1764710271981,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7598,"timestamp":38306809148,"id":2015,"parentId":1976,"tags":{},"startTime":1764710272073,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":109090,"timestamp":38306708316,"id":1976,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764710271973,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":9,"timestamp":38306819319,"id":2018,"parentId":3,"tags":{},"startTime":1764710272084,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":38306819357,"id":2019,"parentId":3,"tags":{},"startTime":1764710272084,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4169,"timestamp":38306821157,"id":2021,"parentId":2017,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710272085,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4189,"timestamp":38306821160,"id":2022,"parentId":2017,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710272085,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4190,"timestamp":38306821161,"id":2023,"parentId":2017,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710272085,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4190,"timestamp":38306821165,"id":2024,"parentId":2017,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710272085,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4718,"timestamp":38306821124,"id":2020,"parentId":2017,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710272085,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1124,"timestamp":38306828118,"id":2042,"parentId":2041,"tags":{},"startTime":1764710272092,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1207,"timestamp":38306828037,"id":2041,"parentId":2040,"tags":{},"startTime":1764710272092,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":3338,"timestamp":38306827885,"id":2040,"parentId":2016,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"ssr"},"startTime":1764710272092,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":121000,"timestamp":38306708428,"id":2043,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764710272096,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":124000,"timestamp":38306709172,"id":2044,"parentId":3,"tags":{"updatedModules":["[project]/components/CategoryColumn.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764710272099,"traceId":"247574ce86dfd828"},{"name":"make","duration":37670,"timestamp":38306818547,"id":2017,"parentId":2016,"tags":{},"startTime":1764710272083,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1253,"timestamp":38306857208,"id":2046,"parentId":2045,"tags":{},"startTime":1764710272121,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":6,"timestamp":38306858469,"id":2048,"parentId":2045,"tags":{},"startTime":1764710272123,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1130,"timestamp":38306858512,"id":2049,"parentId":2045,"tags":{},"startTime":1764710272123,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":8,"timestamp":38306859651,"id":2050,"parentId":2045,"tags":{},"startTime":1764710272124,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":38306859668,"id":2051,"parentId":2045,"tags":{},"startTime":1764710272124,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1384,"timestamp":38306858466,"id":2047,"parentId":2045,"tags":{},"startTime":1764710272123,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":161,"timestamp":38306860243,"id":2052,"parentId":2045,"tags":{},"startTime":1764710272124,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":516,"timestamp":38306860407,"id":2053,"parentId":2045,"tags":{},"startTime":1764710272125,"traceId":"247574ce86dfd828"},{"name":"hash","duration":733,"timestamp":38306861365,"id":2054,"parentId":2045,"tags":{},"startTime":1764710272126,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":37,"timestamp":38306862098,"id":2055,"parentId":2045,"tags":{},"startTime":1764710272126,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":23,"timestamp":38306862133,"id":2056,"parentId":2045,"tags":{},"startTime":1764710272126,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":569,"timestamp":38306862159,"id":2057,"parentId":2045,"tags":{},"startTime":1764710272126,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6545,"timestamp":38306857053,"id":2045,"parentId":2016,"tags":{},"startTime":1764710272121,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":46768,"timestamp":38306818371,"id":2016,"parentId":1977,"tags":{"name":"server"},"startTime":1764710272083,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2539,"timestamp":38306865150,"id":2058,"parentId":1977,"tags":{},"startTime":1764710272129,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":159733,"timestamp":38306708781,"id":1977,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764710271973,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":17855,"timestamp":38306872821,"id":2059,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764710272137,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38306890696,"id":2061,"parentId":2059,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"499482624","memory.heapUsed":"175099280","memory.heapTotal":"201179136"},"startTime":1764710272155,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":18925,"timestamp":38306873115,"id":2060,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764710272137,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38306892050,"id":2062,"parentId":2060,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"499482624","memory.heapUsed":"175131736","memory.heapTotal":"201179136"},"startTime":1764710272156,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":28495,"timestamp":38366841584,"id":2073,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":28532,"timestamp":38366841586,"id":2074,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":28580,"timestamp":38366841600,"id":2076,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":29188,"timestamp":38366841521,"id":2067,"parentId":2066,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":29416,"timestamp":38366841596,"id":2075,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3185,"timestamp":38366870538,"id":2080,"parentId":2079,"tags":{},"startTime":1764710332135,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3297,"timestamp":38366870432,"id":2079,"parentId":2078,"tags":{},"startTime":1764710332135,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6143,"timestamp":38366870339,"id":2078,"parentId":2065,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"app-pages-browser"},"startTime":1764710332135,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":35238,"timestamp":38366841570,"id":2069,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":50211,"timestamp":38366841579,"id":2071,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":50388,"timestamp":38366841582,"id":2072,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":14759,"timestamp":38366877217,"id":2082,"parentId":2081,"tags":{},"startTime":1764710332141,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":54643,"timestamp":38366841563,"id":2068,"parentId":2066,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":15916,"timestamp":38366892002,"id":2084,"parentId":2083,"tags":{},"startTime":1764710332156,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":16237,"timestamp":38366891993,"id":2083,"parentId":2081,"tags":{},"startTime":1764710332156,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4040,"timestamp":38366908252,"id":2085,"parentId":2081,"tags":{"astUsed":"true"},"startTime":1764710332172,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":35776,"timestamp":38366877156,"id":2081,"parentId":2077,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764710332141,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":47718,"timestamp":38366866931,"id":2077,"parentId":2065,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764710332131,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":31,"timestamp":38366921914,"id":2086,"parentId":2077,"tags":{},"startTime":1764710332186,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":80399,"timestamp":38366841573,"id":2070,"parentId":2066,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764710332106,"traceId":"247574ce86dfd828"},{"name":"make","duration":80787,"timestamp":38366841207,"id":2066,"parentId":2065,"tags":{},"startTime":1764710332105,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":750,"timestamp":38366943629,"id":2088,"parentId":2087,"tags":{},"startTime":1764710332208,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":38366944391,"id":2090,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":26,"timestamp":38366944403,"id":2091,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":38366944440,"id":2092,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":38366944457,"id":2093,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":352,"timestamp":38366944387,"id":2089,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":253,"timestamp":38366945247,"id":2094,"parentId":2087,"tags":{},"startTime":1764710332209,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":700,"timestamp":38366945506,"id":2095,"parentId":2087,"tags":{},"startTime":1764710332210,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1801,"timestamp":38366946917,"id":2096,"parentId":2087,"tags":{},"startTime":1764710332211,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":104,"timestamp":38366948718,"id":2097,"parentId":2087,"tags":{},"startTime":1764710332213,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":38,"timestamp":38366948817,"id":2098,"parentId":2087,"tags":{},"startTime":1764710332213,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1772,"timestamp":38366948857,"id":2099,"parentId":2087,"tags":{},"startTime":1764710332213,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":60,"timestamp":38366951046,"id":2101,"parentId":2065,"tags":{},"startTime":1764710332215,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":90,"timestamp":38366951019,"id":2100,"parentId":2065,"tags":{},"startTime":1764710332215,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8609,"timestamp":38366943375,"id":2087,"parentId":2065,"tags":{},"startTime":1764710332208,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":111638,"timestamp":38366840358,"id":2065,"parentId":2063,"tags":{"name":"client"},"startTime":1764710332105,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3034,"timestamp":38366952004,"id":2102,"parentId":2063,"tags":{},"startTime":1764710332216,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":137569,"timestamp":38366817962,"id":2063,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764710332082,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":10,"timestamp":38366961584,"id":2105,"parentId":3,"tags":{},"startTime":1764710332226,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":38366961630,"id":2106,"parentId":3,"tags":{},"startTime":1764710332226,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3869,"timestamp":38366963583,"id":2108,"parentId":2104,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710332228,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3871,"timestamp":38366963585,"id":2109,"parentId":2104,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710332228,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3873,"timestamp":38366963587,"id":2110,"parentId":2104,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710332228,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3873,"timestamp":38366963590,"id":2111,"parentId":2104,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710332228,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4367,"timestamp":38366963538,"id":2107,"parentId":2104,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764710332228,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1151,"timestamp":38366969697,"id":2129,"parentId":2128,"tags":{},"startTime":1764710332234,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1210,"timestamp":38366969640,"id":2128,"parentId":2127,"tags":{},"startTime":1764710332234,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2818,"timestamp":38366969530,"id":2127,"parentId":2103,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"ssr"},"startTime":1764710332234,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":153000,"timestamp":38366818516,"id":2130,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764710332237,"traceId":"247574ce86dfd828"},{"name":"make","duration":15516,"timestamp":38366957260,"id":2104,"parentId":2103,"tags":{},"startTime":1764710332221,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1623,"timestamp":38366977767,"id":2132,"parentId":2131,"tags":{},"startTime":1764710332242,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":38366979412,"id":2134,"parentId":2131,"tags":{},"startTime":1764710332244,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1467,"timestamp":38366979446,"id":2135,"parentId":2131,"tags":{},"startTime":1764710332244,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":38366980933,"id":2136,"parentId":2131,"tags":{},"startTime":1764710332245,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":38366980947,"id":2137,"parentId":2131,"tags":{},"startTime":1764710332245,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1810,"timestamp":38366979399,"id":2133,"parentId":2131,"tags":{},"startTime":1764710332244,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":255,"timestamp":38366981811,"id":2138,"parentId":2131,"tags":{},"startTime":1764710332246,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":687,"timestamp":38366982072,"id":2139,"parentId":2131,"tags":{},"startTime":1764710332246,"traceId":"247574ce86dfd828"},{"name":"hash","duration":884,"timestamp":38366983406,"id":2140,"parentId":2131,"tags":{},"startTime":1764710332248,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":71,"timestamp":38366984290,"id":2141,"parentId":2131,"tags":{},"startTime":1764710332248,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":40,"timestamp":38366984356,"id":2142,"parentId":2131,"tags":{},"startTime":1764710332249,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":698,"timestamp":38366984399,"id":2143,"parentId":2131,"tags":{},"startTime":1764710332249,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":155000,"timestamp":38366818614,"id":2144,"parentId":3,"tags":{"updatedModules":["[project]/components/CategoryColumn.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764710332250,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8741,"timestamp":38366977539,"id":2131,"parentId":2103,"tags":{},"startTime":1764710332242,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":31118,"timestamp":38366956968,"id":2103,"parentId":2064,"tags":{"name":"server"},"startTime":1764710332221,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1636,"timestamp":38366988109,"id":2145,"parentId":2064,"tags":{},"startTime":1764710332252,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":171697,"timestamp":38366818510,"id":2064,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764710332083,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":10620,"timestamp":38367002211,"id":2146,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764710332266,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38367012852,"id":2148,"parentId":2146,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"518864896","memory.heapUsed":"170368640","memory.heapTotal":"210468864"},"startTime":1764710332277,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13360,"timestamp":38367002477,"id":2147,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764710332267,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38367015846,"id":2149,"parentId":2147,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"518864896","memory.heapUsed":"170568856","memory.heapTotal":"210468864"},"startTime":1764710332280,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":23636,"timestamp":38388736393,"id":2150,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764710354001,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":38388760127,"id":2151,"parentId":2150,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"456491008","memory.heapUsed":"155719720","memory.heapTotal":"162365440"},"startTime":1764710354024,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6172,"timestamp":38388765608,"id":2152,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764710354030,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":38388771801,"id":2153,"parentId":2152,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"456720384","memory.heapUsed":"155374552","memory.heapTotal":"162627584"},"startTime":1764710354036,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10663,"timestamp":38390412005,"id":2154,"tags":{"url":"/gunbuilder?_rsc=1jxy8","isTurbopack":false},"startTime":1764710355676,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":38390422723,"id":2155,"parentId":2154,"tags":{"url":"/gunbuilder?_rsc=1jxy8","memory.rss":"456736768","memory.heapUsed":"156100664","memory.heapTotal":"162627584"},"startTime":1764710355687,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":12293,"timestamp":38396930129,"id":2156,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","isTurbopack":false},"startTime":1764710362194,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":38396942481,"id":2157,"parentId":2156,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","memory.rss":"451133440","memory.heapUsed":"156248352","memory.heapTotal":"161579008"},"startTime":1764710362207,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14792,"timestamp":39871041758,"id":2163,"parentId":2161,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764711836306,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14796,"timestamp":39871041771,"id":2165,"parentId":2161,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764711836306,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14799,"timestamp":39871041775,"id":2166,"parentId":2161,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764711836306,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15753,"timestamp":39871041678,"id":2162,"parentId":2161,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764711836306,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2789,"timestamp":39871055854,"id":2169,"parentId":2168,"tags":{},"startTime":1764711836320,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2934,"timestamp":39871055713,"id":2168,"parentId":2167,"tags":{},"startTime":1764711836320,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6201,"timestamp":39871055373,"id":2167,"parentId":2160,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764711836320,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":55525,"timestamp":39871041766,"id":2164,"parentId":2161,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764711836306,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":10516,"timestamp":39871099598,"id":2187,"parentId":2186,"tags":{},"startTime":1764711836364,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":10706,"timestamp":39871099413,"id":2186,"parentId":2185,"tags":{},"startTime":1764711836364,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":19548,"timestamp":39871099228,"id":2185,"parentId":2160,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764711836363,"traceId":"247574ce86dfd828"},{"name":"make","duration":84891,"timestamp":39871037162,"id":2161,"parentId":2160,"tags":{},"startTime":1764711836301,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1347,"timestamp":39871123290,"id":2189,"parentId":2188,"tags":{},"startTime":1764711836387,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":39871124646,"id":2191,"parentId":2188,"tags":{},"startTime":1764711836389,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1124,"timestamp":39871124677,"id":2192,"parentId":2188,"tags":{},"startTime":1764711836389,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":39871125826,"id":2193,"parentId":2188,"tags":{},"startTime":1764711836390,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":5,"timestamp":39871125852,"id":2194,"parentId":2188,"tags":{},"startTime":1764711836390,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1475,"timestamp":39871124643,"id":2190,"parentId":2188,"tags":{},"startTime":1764711836389,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":613,"timestamp":39871126663,"id":2195,"parentId":2188,"tags":{},"startTime":1764711836391,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":769,"timestamp":39871127280,"id":2196,"parentId":2188,"tags":{},"startTime":1764711836391,"traceId":"247574ce86dfd828"},{"name":"hash","duration":868,"timestamp":39871128586,"id":2197,"parentId":2188,"tags":{},"startTime":1764711836393,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":57,"timestamp":39871129454,"id":2198,"parentId":2188,"tags":{},"startTime":1764711836394,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":35,"timestamp":39871129507,"id":2199,"parentId":2188,"tags":{},"startTime":1764711836394,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2401,"timestamp":39871129544,"id":2200,"parentId":2188,"tags":{},"startTime":1764711836394,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9878,"timestamp":39871123120,"id":2188,"parentId":2160,"tags":{},"startTime":1764711836387,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":98186,"timestamp":39871036596,"id":2160,"parentId":2158,"tags":{"name":"server"},"startTime":1764711836301,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2517,"timestamp":39871134808,"id":2201,"parentId":2158,"tags":{},"startTime":1764711836399,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":110549,"timestamp":39871027150,"id":2158,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764711836291,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3517,"timestamp":39871143789,"id":2211,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3564,"timestamp":39871143794,"id":2213,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3803,"timestamp":39871143745,"id":2204,"parentId":2203,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4016,"timestamp":39871143791,"id":2212,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4258,"timestamp":39871143779,"id":2206,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6699,"timestamp":39871143785,"id":2208,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":2187,"timestamp":39871148321,"id":2219,"parentId":2218,"tags":{},"startTime":1764711836412,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10069,"timestamp":39871143775,"id":2205,"parentId":2203,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10060,"timestamp":39871143787,"id":2209,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":7235,"timestamp":39871146757,"id":2217,"parentId":2216,"tags":{},"startTime":1764711836411,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":7290,"timestamp":39871146703,"id":2216,"parentId":2215,"tags":{},"startTime":1764711836411,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":14733,"timestamp":39871146630,"id":2215,"parentId":2202,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764711836411,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":27977,"timestamp":39871150540,"id":2221,"parentId":2220,"tags":{},"startTime":1764711836415,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":28354,"timestamp":39871150531,"id":2220,"parentId":2218,"tags":{},"startTime":1764711836415,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4683,"timestamp":39871178913,"id":2222,"parentId":2218,"tags":{"astUsed":"true"},"startTime":1764711836443,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":36073,"timestamp":39871148212,"id":2218,"parentId":2214,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764711836412,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":44937,"timestamp":39871146017,"id":2214,"parentId":2202,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764711836410,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":43,"timestamp":39871194171,"id":2223,"parentId":2214,"tags":{},"startTime":1764711836458,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":50473,"timestamp":39871143782,"id":2207,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":57392,"timestamp":39871143788,"id":2210,"parentId":2203,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764711836408,"traceId":"247574ce86dfd828"},{"name":"make","duration":61813,"timestamp":39871139378,"id":2203,"parentId":2202,"tags":{},"startTime":1764711836404,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":792,"timestamp":39871202514,"id":2225,"parentId":2224,"tags":{},"startTime":1764711836467,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":39871203321,"id":2227,"parentId":2224,"tags":{},"startTime":1764711836467,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":24,"timestamp":39871203363,"id":2228,"parentId":2224,"tags":{},"startTime":1764711836467,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":39871203399,"id":2229,"parentId":2224,"tags":{},"startTime":1764711836468,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":39871203414,"id":2230,"parentId":2224,"tags":{},"startTime":1764711836468,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":342,"timestamp":39871203315,"id":2226,"parentId":2224,"tags":{},"startTime":1764711836467,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":291,"timestamp":39871204177,"id":2231,"parentId":2224,"tags":{},"startTime":1764711836468,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1197,"timestamp":39871204476,"id":2232,"parentId":2224,"tags":{},"startTime":1764711836469,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2016,"timestamp":39871206463,"id":2233,"parentId":2224,"tags":{},"startTime":1764711836471,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":75,"timestamp":39871208480,"id":2234,"parentId":2224,"tags":{},"startTime":1764711836473,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":34,"timestamp":39871208549,"id":2235,"parentId":2224,"tags":{},"startTime":1764711836473,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3649,"timestamp":39871208585,"id":2236,"parentId":2224,"tags":{},"startTime":1764711836473,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":250,"timestamp":39871213462,"id":2238,"parentId":2202,"tags":{},"startTime":1764711836478,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":353,"timestamp":39871213362,"id":2237,"parentId":2202,"tags":{},"startTime":1764711836477,"traceId":"247574ce86dfd828"},{"name":"seal","duration":12853,"timestamp":39871202133,"id":2224,"parentId":2202,"tags":{},"startTime":1764711836466,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":76177,"timestamp":39871138828,"id":2202,"parentId":2159,"tags":{"name":"client"},"startTime":1764711836403,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7022,"timestamp":39871215018,"id":2239,"parentId":2159,"tags":{},"startTime":1764711836479,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":195574,"timestamp":39871027461,"id":2159,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764711836292,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":63705,"timestamp":39875183492,"id":2240,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764711840448,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":39875247216,"id":2241,"parentId":2240,"tags":{"url":"/gunbuilder","memory.rss":"503283712","memory.heapUsed":"178950000","memory.heapTotal":"204029952"},"startTime":1764711840511,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":8,"timestamp":39875445786,"id":2242,"parentId":3,"tags":{},"startTime":1764711840710,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25749,"timestamp":39880588082,"id":2243,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","isTurbopack":false},"startTime":1764711845852,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39880613908,"id":2244,"parentId":2243,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","memory.rss":"462127104","memory.heapUsed":"160316336","memory.heapTotal":"165675008"},"startTime":1764711845878,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6907,"timestamp":39880620917,"id":2245,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","isTurbopack":false},"startTime":1764711845885,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":39880627849,"id":2246,"parentId":2245,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","memory.rss":"463060992","memory.heapUsed":"161301440","memory.heapTotal":"166461440"},"startTime":1764711845892,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":14873,"timestamp":39892852750,"id":2247,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764711858117,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39892867681,"id":2248,"parentId":2247,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"463519744","memory.heapUsed":"160334728","memory.heapTotal":"165412864"},"startTime":1764711858132,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":7768,"timestamp":39892872316,"id":2249,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764711858136,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39892880137,"id":2250,"parentId":2249,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"463552512","memory.heapUsed":"160482872","memory.heapTotal":"166199296"},"startTime":1764711858144,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":17784,"timestamp":39904898076,"id":2251,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","isTurbopack":false},"startTime":1764711870162,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39904915959,"id":2252,"parentId":2251,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","memory.rss":"463142912","memory.heapUsed":"160514000","memory.heapTotal":"165150720"},"startTime":1764711870180,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9969,"timestamp":39904921176,"id":2253,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","isTurbopack":false},"startTime":1764711870185,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":39904931177,"id":2254,"parentId":2253,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","memory.rss":"463175680","memory.heapUsed":"160612520","memory.heapTotal":"165412864"},"startTime":1764711870195,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10863,"timestamp":39914440505,"id":2255,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764711879705,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":39914451408,"id":2256,"parentId":2255,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"462389248","memory.heapUsed":"160613752","memory.heapTotal":"165150720"},"startTime":1764711879716,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":17565,"timestamp":39926102711,"id":2257,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","isTurbopack":false},"startTime":1764711891367,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39926120365,"id":2258,"parentId":2257,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","memory.rss":"456409088","memory.heapUsed":"160627632","memory.heapTotal":"164364288"},"startTime":1764711891384,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11455,"timestamp":39926124898,"id":2259,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","isTurbopack":false},"startTime":1764711891389,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":39926136388,"id":2260,"parentId":2259,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","memory.rss":"456409088","memory.heapUsed":"160778720","memory.heapTotal":"165412864"},"startTime":1764711891400,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15949,"timestamp":39955750898,"id":2261,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","isTurbopack":false},"startTime":1764711921015,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":4,"timestamp":39955767291,"id":2262,"parentId":2261,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","memory.rss":"476053504","memory.heapUsed":"163107816","memory.heapTotal":"172572672"},"startTime":1764711921031,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9295,"timestamp":39955771396,"id":2263,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","isTurbopack":false},"startTime":1764711921035,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39955780737,"id":2264,"parentId":2263,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","memory.rss":"476053504","memory.heapUsed":"164035536","memory.heapTotal":"172572672"},"startTime":1764711921045,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10244,"timestamp":39959783611,"id":2265,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764711925048,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":39959793907,"id":2266,"parentId":2265,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"476413952","memory.heapUsed":"164816344","memory.heapTotal":"173096960"},"startTime":1764711925058,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":42988,"timestamp":40060676889,"id":2279,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":43029,"timestamp":40060676892,"id":2280,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":43084,"timestamp":40060676905,"id":2282,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":61135,"timestamp":40060676785,"id":2273,"parentId":2272,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":61397,"timestamp":40060676896,"id":2281,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":65590,"timestamp":40060676865,"id":2275,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":65757,"timestamp":40060676869,"id":2276,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":67903,"timestamp":40060676873,"id":2277,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":67959,"timestamp":40060676885,"id":2278,"parentId":2272,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":68431,"timestamp":40060676857,"id":2274,"parentId":2272,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":68626,"timestamp":40060676909,"id":2283,"parentId":2272,"tags":{"request":"next-client-pages-loader?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"},"startTime":1764712025941,"traceId":"247574ce86dfd828"},{"name":"make","duration":69835,"timestamp":40060675763,"id":2272,"parentId":2271,"tags":{},"startTime":1764712025940,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":708,"timestamp":40060746484,"id":2285,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":4,"timestamp":40060747200,"id":2287,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":32,"timestamp":40060747236,"id":2288,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":40060747286,"id":2289,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":40060747315,"id":2290,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":382,"timestamp":40060747197,"id":2286,"parentId":2284,"tags":{},"startTime":1764712026011,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":201,"timestamp":40060748063,"id":2291,"parentId":2284,"tags":{},"startTime":1764712026012,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":427,"timestamp":40060748267,"id":2292,"parentId":2284,"tags":{},"startTime":1764712026012,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1813,"timestamp":40060749812,"id":2293,"parentId":2284,"tags":{},"startTime":1764712026014,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":77,"timestamp":40060751625,"id":2294,"parentId":2284,"tags":{},"startTime":1764712026016,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":40060751697,"id":2295,"parentId":2284,"tags":{},"startTime":1764712026016,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2093,"timestamp":40060751729,"id":2296,"parentId":2284,"tags":{},"startTime":1764712026016,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":223,"timestamp":40060754750,"id":2298,"parentId":2271,"tags":{},"startTime":1764712026019,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":314,"timestamp":40060754661,"id":2297,"parentId":2271,"tags":{},"startTime":1764712026019,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9824,"timestamp":40060746253,"id":2284,"parentId":2271,"tags":{},"startTime":1764712026010,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":81782,"timestamp":40060674314,"id":2271,"parentId":2268,"tags":{"name":"client"},"startTime":1764712025938,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2521,"timestamp":40060756113,"id":2299,"parentId":2268,"tags":{},"startTime":1764712026020,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":89467,"timestamp":40060669887,"id":2268,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764712025934,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22042,"timestamp":40060763117,"id":2304,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22051,"timestamp":40060763119,"id":2305,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22052,"timestamp":40060763121,"id":2306,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22054,"timestamp":40060763123,"id":2307,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22391,"timestamp":40060763114,"id":2303,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":34813,"timestamp":40060763075,"id":2302,"parentId":2301,"tags":{"request":"next-app-loader?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712026027,"traceId":"247574ce86dfd828"},{"name":"make","duration":40950,"timestamp":40060760944,"id":2301,"parentId":2300,"tags":{},"startTime":1764712026025,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1871,"timestamp":40060803267,"id":2326,"parentId":2325,"tags":{},"startTime":1764712026067,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":40060805155,"id":2328,"parentId":2325,"tags":{},"startTime":1764712026069,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1762,"timestamp":40060805220,"id":2329,"parentId":2325,"tags":{},"startTime":1764712026069,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":6,"timestamp":40060806996,"id":2330,"parentId":2325,"tags":{},"startTime":1764712026071,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":40060807016,"id":2331,"parentId":2325,"tags":{},"startTime":1764712026071,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2112,"timestamp":40060805151,"id":2327,"parentId":2325,"tags":{},"startTime":1764712026069,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":388,"timestamp":40060808200,"id":2332,"parentId":2325,"tags":{},"startTime":1764712026072,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":858,"timestamp":40060808601,"id":2333,"parentId":2325,"tags":{},"startTime":1764712026073,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1067,"timestamp":40060810384,"id":2334,"parentId":2325,"tags":{},"startTime":1764712026074,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":40060811451,"id":2335,"parentId":2325,"tags":{},"startTime":1764712026075,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":49,"timestamp":40060811506,"id":2336,"parentId":2325,"tags":{},"startTime":1764712026076,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":243,"timestamp":40060811558,"id":2337,"parentId":2325,"tags":{},"startTime":1764712026076,"traceId":"247574ce86dfd828"},{"name":"seal","duration":14584,"timestamp":40060803012,"id":2325,"parentId":2300,"tags":{},"startTime":1764712026067,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":58690,"timestamp":40060760672,"id":2300,"parentId":2270,"tags":{"name":"server"},"startTime":1764712026025,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1421,"timestamp":40060819403,"id":2338,"parentId":2270,"tags":{},"startTime":1764712026083,"traceId":"247574ce86dfd828"},{"name":"compile-path","duration":151241,"timestamp":40060669975,"id":2269,"tags":{"trigger":"/_not-found","isTurbopack":false},"startTime":1764712025934,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":151396,"timestamp":40060670124,"id":2270,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764712025934,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":8,"timestamp":40061132207,"id":2339,"parentId":3,"tags":{},"startTime":1764712026396,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":5000,"timestamp":40061132447,"id":2340,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":false},"startTime":1764712026402,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":23655,"timestamp":40062648194,"id":2341,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1pg42","isTurbopack":false},"startTime":1764712027912,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":40062671896,"id":2342,"parentId":2341,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1pg42","memory.rss":"513310720","memory.heapUsed":"185056816","memory.heapTotal":"202620928"},"startTime":1764712027936,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9577,"timestamp":40069849193,"id":2343,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764712035113,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":40069858822,"id":2344,"parentId":2343,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"514736128","memory.heapUsed":"186449200","memory.heapTotal":"203767808"},"startTime":1764712035123,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12574,"timestamp":40173399290,"id":2356,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12728,"timestamp":40173399316,"id":2358,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14635,"timestamp":40173399116,"id":2349,"parentId":2348,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15177,"timestamp":40173399300,"id":2357,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15871,"timestamp":40173399254,"id":2351,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":9716,"timestamp":40173410283,"id":2362,"parentId":2361,"tags":{},"startTime":1764712138674,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":9961,"timestamp":40173410047,"id":2361,"parentId":2360,"tags":{},"startTime":1764712138674,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":22649,"timestamp":40173409796,"id":2360,"parentId":2347,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764712138674,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33526,"timestamp":40173399268,"id":2353,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33631,"timestamp":40173399277,"id":2354,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":17066,"timestamp":40173415860,"id":2364,"parentId":2363,"tags":{},"startTime":1764712138680,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":37530,"timestamp":40173399284,"id":2355,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":38229,"timestamp":40173399239,"id":2350,"parentId":2348,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":21754,"timestamp":40173432958,"id":2366,"parentId":2365,"tags":{},"startTime":1764712138697,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":22212,"timestamp":40173432947,"id":2365,"parentId":2363,"tags":{},"startTime":1764712138697,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":5412,"timestamp":40173455203,"id":2367,"parentId":2363,"tags":{"astUsed":"true"},"startTime":1764712138719,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":46659,"timestamp":40173415568,"id":2363,"parentId":2359,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764712138680,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":58090,"timestamp":40173408477,"id":2359,"parentId":2347,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764712138672,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":34,"timestamp":40173466704,"id":2368,"parentId":2359,"tags":{},"startTime":1764712138731,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":67500,"timestamp":40173399262,"id":2352,"parentId":2348,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712138663,"traceId":"247574ce86dfd828"},{"name":"make","duration":68639,"timestamp":40173398138,"id":2348,"parentId":2347,"tags":{},"startTime":1764712138662,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":735,"timestamp":40173487190,"id":2370,"parentId":2369,"tags":{},"startTime":1764712138751,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":40173487936,"id":2372,"parentId":2369,"tags":{},"startTime":1764712138752,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":35,"timestamp":40173487980,"id":2373,"parentId":2369,"tags":{},"startTime":1764712138752,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":40173488044,"id":2374,"parentId":2369,"tags":{},"startTime":1764712138752,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":40173488070,"id":2375,"parentId":2369,"tags":{},"startTime":1764712138752,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":375,"timestamp":40173487933,"id":2371,"parentId":2369,"tags":{},"startTime":1764712138752,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":220,"timestamp":40173488716,"id":2376,"parentId":2369,"tags":{},"startTime":1764712138753,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":909,"timestamp":40173488940,"id":2377,"parentId":2369,"tags":{},"startTime":1764712138753,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1495,"timestamp":40173490497,"id":2378,"parentId":2369,"tags":{},"startTime":1764712138754,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":58,"timestamp":40173491992,"id":2379,"parentId":2369,"tags":{},"startTime":1764712138756,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":40173492046,"id":2380,"parentId":2369,"tags":{},"startTime":1764712138756,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3297,"timestamp":40173492080,"id":2381,"parentId":2369,"tags":{},"startTime":1764712138756,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":251,"timestamp":40173496575,"id":2383,"parentId":2347,"tags":{},"startTime":1764712138761,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":339,"timestamp":40173496491,"id":2382,"parentId":2347,"tags":{},"startTime":1764712138760,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10989,"timestamp":40173486848,"id":2369,"parentId":2347,"tags":{},"startTime":1764712138751,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":102013,"timestamp":40173395840,"id":2347,"parentId":2345,"tags":{"name":"client"},"startTime":1764712138660,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3302,"timestamp":40173497862,"id":2384,"parentId":2345,"tags":{},"startTime":1764712138762,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":114243,"timestamp":40173387571,"id":2345,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764712138652,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":40173503921,"id":2387,"parentId":3,"tags":{},"startTime":1764712138768,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4321,"timestamp":40173505565,"id":2389,"parentId":2386,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712138770,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4323,"timestamp":40173505569,"id":2391,"parentId":2386,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712138770,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4324,"timestamp":40173505571,"id":2392,"parentId":2386,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712138770,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4621,"timestamp":40173505528,"id":2388,"parentId":2386,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712138769,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1444,"timestamp":40173509480,"id":2395,"parentId":2394,"tags":{},"startTime":1764712138773,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1535,"timestamp":40173509390,"id":2394,"parentId":2393,"tags":{},"startTime":1764712138773,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2806,"timestamp":40173509184,"id":2393,"parentId":2385,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764712138773,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6863,"timestamp":40173505567,"id":2390,"parentId":2386,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712138770,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3206,"timestamp":40173515003,"id":2413,"parentId":2412,"tags":{},"startTime":1764712138779,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3261,"timestamp":40173514952,"id":2412,"parentId":2411,"tags":{},"startTime":1764712138779,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":8841,"timestamp":40173514859,"id":2411,"parentId":2385,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764712138779,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":132000,"timestamp":40173388226,"id":2414,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","[project]/node_modules/next/dist/client/components/not-found-error.js","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764712138788,"traceId":"247574ce86dfd828"},{"name":"make","duration":21297,"timestamp":40173503147,"id":2386,"parentId":2385,"tags":{},"startTime":1764712138767,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1559,"timestamp":40173530212,"id":2416,"parentId":2415,"tags":{},"startTime":1764712138794,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":40173531784,"id":2418,"parentId":2415,"tags":{},"startTime":1764712138796,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1359,"timestamp":40173531850,"id":2419,"parentId":2415,"tags":{},"startTime":1764712138796,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":40173533226,"id":2420,"parentId":2415,"tags":{},"startTime":1764712138797,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":7,"timestamp":40173533237,"id":2421,"parentId":2415,"tags":{},"startTime":1764712138797,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1663,"timestamp":40173531781,"id":2417,"parentId":2415,"tags":{},"startTime":1764712138796,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":253,"timestamp":40173533968,"id":2422,"parentId":2415,"tags":{},"startTime":1764712138798,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1128,"timestamp":40173534226,"id":2423,"parentId":2415,"tags":{},"startTime":1764712138798,"traceId":"247574ce86dfd828"},{"name":"hash","duration":604,"timestamp":40173535955,"id":2424,"parentId":2415,"tags":{},"startTime":1764712138800,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":63,"timestamp":40173536558,"id":2425,"parentId":2415,"tags":{},"startTime":1764712138801,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":32,"timestamp":40173536617,"id":2426,"parentId":2415,"tags":{},"startTime":1764712138801,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2200,"timestamp":40173536652,"id":2427,"parentId":2415,"tags":{},"startTime":1764712138801,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10074,"timestamp":40173529984,"id":2415,"parentId":2385,"tags":{},"startTime":1764712138794,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":38889,"timestamp":40173502967,"id":2385,"parentId":2346,"tags":{"name":"server"},"startTime":1764712138767,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2215,"timestamp":40173541876,"id":2428,"parentId":2346,"tags":{},"startTime":1764712138806,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":156910,"timestamp":40173387986,"id":2346,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764712138652,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":19099,"timestamp":40173557674,"id":2429,"tags":{"url":"/gunbuilder?_rsc=9gfev","isTurbopack":false},"startTime":1764712138822,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":40173576802,"id":2430,"parentId":2429,"tags":{"url":"/gunbuilder?_rsc=9gfev","memory.rss":"520994816","memory.heapUsed":"172947144","memory.heapTotal":"208535552"},"startTime":1764712138841,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":63876,"timestamp":40181643203,"id":2431,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764712146907,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":40181707102,"id":2432,"parentId":2431,"tags":{"url":"/gunbuilder","memory.rss":"521437184","memory.heapUsed":"176911688","memory.heapTotal":"209321984"},"startTime":1764712146971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2929,"timestamp":40181726356,"id":2445,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2960,"timestamp":40181726357,"id":2446,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3006,"timestamp":40181726360,"id":2448,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3010,"timestamp":40181726361,"id":2449,"parentId":2438,"tags":{"request":"next-client-pages-loader?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3250,"timestamp":40181726317,"id":2439,"parentId":2438,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3469,"timestamp":40181726358,"id":2447,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3697,"timestamp":40181726348,"id":2441,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3802,"timestamp":40181726351,"id":2442,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4444,"timestamp":40181726353,"id":2443,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4466,"timestamp":40181726355,"id":2444,"parentId":2438,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4635,"timestamp":40181726344,"id":2440,"parentId":2438,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"make","duration":5150,"timestamp":40181725845,"id":2438,"parentId":2437,"tags":{},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":639,"timestamp":40181731606,"id":2451,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":40181732252,"id":2453,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":15,"timestamp":40181732259,"id":2454,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":40181732279,"id":2455,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":40181732287,"id":2456,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":274,"timestamp":40181732249,"id":2452,"parentId":2450,"tags":{},"startTime":1764712146996,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":149,"timestamp":40181732916,"id":2457,"parentId":2450,"tags":{},"startTime":1764712146997,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":336,"timestamp":40181733069,"id":2458,"parentId":2450,"tags":{},"startTime":1764712146997,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1208,"timestamp":40181733998,"id":2459,"parentId":2450,"tags":{},"startTime":1764712146998,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":40181735206,"id":2460,"parentId":2450,"tags":{},"startTime":1764712146999,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":40181735262,"id":2461,"parentId":2450,"tags":{},"startTime":1764712146999,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":781,"timestamp":40181735295,"id":2462,"parentId":2450,"tags":{},"startTime":1764712146999,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":38,"timestamp":40181736381,"id":2464,"parentId":2437,"tags":{},"startTime":1764712147000,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":69,"timestamp":40181736352,"id":2463,"parentId":2437,"tags":{},"startTime":1764712147000,"traceId":"247574ce86dfd828"},{"name":"seal","duration":5690,"timestamp":40181731437,"id":2450,"parentId":2437,"tags":{},"startTime":1764712146995,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":11485,"timestamp":40181725655,"id":2437,"parentId":2434,"tags":{"name":"client"},"startTime":1764712146990,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3353,"timestamp":40181737148,"id":2465,"parentId":2434,"tags":{},"startTime":1764712147001,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":15817,"timestamp":40181725000,"id":2434,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764712146989,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3859,"timestamp":40181745157,"id":2470,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3865,"timestamp":40181745158,"id":2471,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3867,"timestamp":40181745160,"id":2472,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3868,"timestamp":40181745161,"id":2473,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3979,"timestamp":40181745133,"id":2468,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4366,"timestamp":40181745154,"id":2469,"parentId":2467,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712147009,"traceId":"247574ce86dfd828"},{"name":"make","duration":10580,"timestamp":40181742098,"id":2467,"parentId":2466,"tags":{},"startTime":1764712147006,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1349,"timestamp":40181753700,"id":2492,"parentId":2491,"tags":{},"startTime":1764712147018,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":40181755060,"id":2494,"parentId":2491,"tags":{},"startTime":1764712147019,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1282,"timestamp":40181755067,"id":2495,"parentId":2491,"tags":{},"startTime":1764712147019,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":40181756361,"id":2496,"parentId":2491,"tags":{},"startTime":1764712147020,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":40181756368,"id":2497,"parentId":2491,"tags":{},"startTime":1764712147020,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1436,"timestamp":40181755057,"id":2493,"parentId":2491,"tags":{},"startTime":1764712147019,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":140,"timestamp":40181756910,"id":2498,"parentId":2491,"tags":{},"startTime":1764712147021,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":292,"timestamp":40181757053,"id":2499,"parentId":2491,"tags":{},"startTime":1764712147021,"traceId":"247574ce86dfd828"},{"name":"hash","duration":446,"timestamp":40181757664,"id":2500,"parentId":2491,"tags":{},"startTime":1764712147022,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":34,"timestamp":40181758110,"id":2501,"parentId":2491,"tags":{},"startTime":1764712147022,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":24,"timestamp":40181758142,"id":2502,"parentId":2491,"tags":{},"startTime":1764712147022,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":133,"timestamp":40181758167,"id":2503,"parentId":2491,"tags":{},"startTime":1764712147022,"traceId":"247574ce86dfd828"},{"name":"seal","duration":5517,"timestamp":40181753556,"id":2491,"parentId":2466,"tags":{},"startTime":1764712147018,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":19054,"timestamp":40181741922,"id":2466,"parentId":2436,"tags":{"name":"server"},"startTime":1764712147006,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3411,"timestamp":40181760988,"id":2504,"parentId":2436,"tags":{},"startTime":1764712147025,"traceId":"247574ce86dfd828"},{"name":"compile-path","duration":39689,"timestamp":40181725033,"id":2435,"tags":{"trigger":"/_not-found","isTurbopack":false},"startTime":1764712146989,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":39736,"timestamp":40181725047,"id":2436,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764712146989,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":22,"timestamp":40182060954,"id":2505,"parentId":3,"tags":{},"startTime":1764712147325,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24700,"timestamp":40188103277,"id":2506,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764712153367,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":40188128035,"id":2507,"parentId":2506,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"527761408","memory.heapUsed":"161477840","memory.heapTotal":"223526912"},"startTime":1764712153392,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6609,"timestamp":40188133819,"id":2508,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764712153398,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":40188140467,"id":2509,"parentId":2508,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"527761408","memory.heapUsed":"162459584","memory.heapTotal":"223526912"},"startTime":1764712153404,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10785,"timestamp":40195878914,"id":2521,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10957,"timestamp":40195878928,"id":2523,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10971,"timestamp":40195878934,"id":2524,"parentId":2513,"tags":{"request":"next-client-pages-loader?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12797,"timestamp":40195878771,"id":2514,"parentId":2513,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13366,"timestamp":40195878920,"id":2522,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14224,"timestamp":40195878871,"id":2516,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":9573,"timestamp":40195887846,"id":2528,"parentId":2527,"tags":{},"startTime":1764712161152,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":9785,"timestamp":40195887643,"id":2527,"parentId":2526,"tags":{},"startTime":1764712161152,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":27315,"timestamp":40195887456,"id":2526,"parentId":2512,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764712161151,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":36542,"timestamp":40195878885,"id":2518,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":36713,"timestamp":40195878901,"id":2519,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":21846,"timestamp":40195893788,"id":2530,"parentId":2529,"tags":{},"startTime":1764712161158,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":41935,"timestamp":40195878908,"id":2520,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":42171,"timestamp":40195878859,"id":2515,"parentId":2513,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":24893,"timestamp":40195915675,"id":2532,"parentId":2531,"tags":{},"startTime":1764712161180,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":25279,"timestamp":40195915657,"id":2531,"parentId":2529,"tags":{},"startTime":1764712161180,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3799,"timestamp":40195940955,"id":2533,"parentId":2529,"tags":{"astUsed":"true"},"startTime":1764712161205,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":52609,"timestamp":40195893653,"id":2529,"parentId":2525,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764712161158,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":61546,"timestamp":40195887026,"id":2525,"parentId":2512,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764712161151,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":17,"timestamp":40195948659,"id":2534,"parentId":2525,"tags":{},"startTime":1764712161213,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":69845,"timestamp":40195878879,"id":2517,"parentId":2513,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764712161143,"traceId":"247574ce86dfd828"},{"name":"make","duration":73579,"timestamp":40195875156,"id":2513,"parentId":2512,"tags":{},"startTime":1764712161139,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":739,"timestamp":40195949740,"id":2536,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":40195950488,"id":2538,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":22,"timestamp":40195950497,"id":2539,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":40195950526,"id":2540,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":40195950538,"id":2541,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":323,"timestamp":40195950484,"id":2537,"parentId":2535,"tags":{},"startTime":1764712161214,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":218,"timestamp":40195951348,"id":2542,"parentId":2535,"tags":{},"startTime":1764712161215,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1451,"timestamp":40195951571,"id":2543,"parentId":2535,"tags":{},"startTime":1764712161216,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1785,"timestamp":40195953635,"id":2544,"parentId":2535,"tags":{},"startTime":1764712161218,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":68,"timestamp":40195955420,"id":2545,"parentId":2535,"tags":{},"startTime":1764712161219,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":36,"timestamp":40195955483,"id":2546,"parentId":2535,"tags":{},"startTime":1764712161219,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3162,"timestamp":40195955521,"id":2547,"parentId":2535,"tags":{},"startTime":1764712161219,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":47,"timestamp":40195959120,"id":2549,"parentId":2512,"tags":{},"startTime":1764712161223,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":85,"timestamp":40195959083,"id":2548,"parentId":2512,"tags":{},"startTime":1764712161223,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10557,"timestamp":40195949474,"id":2535,"parentId":2512,"tags":{},"startTime":1764712161213,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":85804,"timestamp":40195874244,"id":2512,"parentId":2510,"tags":{"name":"client"},"startTime":1764712161138,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3545,"timestamp":40195960059,"id":2550,"parentId":2510,"tags":{},"startTime":1764712161224,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":101223,"timestamp":40195862799,"id":2510,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764712161127,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":40195965997,"id":2553,"parentId":3,"tags":{},"startTime":1764712161230,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5225,"timestamp":40195966926,"id":2555,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5230,"timestamp":40195966928,"id":2556,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5230,"timestamp":40195966931,"id":2558,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5232,"timestamp":40195966932,"id":2559,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5677,"timestamp":40195966908,"id":2554,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1805,"timestamp":40195971500,"id":2562,"parentId":2561,"tags":{},"startTime":1764712161235,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1856,"timestamp":40195971450,"id":2561,"parentId":2560,"tags":{},"startTime":1764712161235,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2704,"timestamp":40195971332,"id":2560,"parentId":2551,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764712161235,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7367,"timestamp":40195966929,"id":2557,"parentId":2552,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764712161231,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2993,"timestamp":40195976322,"id":2582,"parentId":2581,"tags":{},"startTime":1764712161240,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3056,"timestamp":40195976261,"id":2581,"parentId":2580,"tags":{},"startTime":1764712161240,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":12585,"timestamp":40195976164,"id":2580,"parentId":2551,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764712161240,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":115000,"timestamp":40195864432,"id":2583,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764712161253,"traceId":"247574ce86dfd828"},{"name":"make","duration":27977,"timestamp":40195965407,"id":2552,"parentId":2551,"tags":{},"startTime":1764712161229,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1451,"timestamp":40195994309,"id":2585,"parentId":2584,"tags":{},"startTime":1764712161258,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":40195995769,"id":2587,"parentId":2584,"tags":{},"startTime":1764712161260,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1376,"timestamp":40195995778,"id":2588,"parentId":2584,"tags":{},"startTime":1764712161260,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":40195997163,"id":2589,"parentId":2584,"tags":{},"startTime":1764712161261,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":40195997174,"id":2590,"parentId":2584,"tags":{},"startTime":1764712161261,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1643,"timestamp":40195995766,"id":2586,"parentId":2584,"tags":{},"startTime":1764712161260,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":189,"timestamp":40195997828,"id":2591,"parentId":2584,"tags":{},"startTime":1764712161262,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":709,"timestamp":40195998021,"id":2592,"parentId":2584,"tags":{},"startTime":1764712161262,"traceId":"247574ce86dfd828"},{"name":"hash","duration":707,"timestamp":40195999141,"id":2593,"parentId":2584,"tags":{},"startTime":1764712161263,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":39,"timestamp":40195999848,"id":2594,"parentId":2584,"tags":{},"startTime":1764712161264,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":23,"timestamp":40195999883,"id":2595,"parentId":2584,"tags":{},"startTime":1764712161264,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1861,"timestamp":40195999907,"id":2596,"parentId":2584,"tags":{},"startTime":1764712161264,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8514,"timestamp":40195994148,"id":2584,"parentId":2551,"tags":{},"startTime":1764712161258,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":39379,"timestamp":40195965235,"id":2551,"parentId":2511,"tags":{"name":"server"},"startTime":1764712161229,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1705,"timestamp":40196004626,"id":2597,"parentId":2511,"tags":{},"startTime":1764712161269,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":143252,"timestamp":40195863423,"id":2511,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764712161127,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":9818,"timestamp":40196012416,"id":2598,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764712161276,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":40196022248,"id":2599,"parentId":2598,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"496123904","memory.heapUsed":"173829584","memory.heapTotal":"195624960"},"startTime":1764712161286,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":162000,"timestamp":40195864142,"id":2600,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764712161290,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":51540,"timestamp":40341888719,"id":2601,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764712307153,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":40341940282,"id":2602,"parentId":2601,"tags":{"url":"/gunbuilder","memory.rss":"449134592","memory.heapUsed":"156581984","memory.heapTotal":"163151872"},"startTime":1764712307204,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":14,"timestamp":40342255658,"id":2604,"parentId":3,"tags":{},"startTime":1764712307520,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":18683,"timestamp":41088694320,"id":2605,"tags":{"url":"/gunbuilder/admin/debug/merchants","isTurbopack":false},"startTime":1764713053958,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":41088713083,"id":2606,"parentId":2605,"tags":{"url":"/gunbuilder/admin/debug/merchants","memory.rss":"451313664","memory.heapUsed":"157479816","memory.heapTotal":"162365440"},"startTime":1764713053977,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":41088924478,"id":2607,"parentId":3,"tags":{},"startTime":1764713054188,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":41088933774,"id":2608,"parentId":3,"tags":{},"startTime":1764713054198,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":31388,"timestamp":41100591335,"id":2609,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764713065855,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":41100622787,"id":2610,"parentId":2609,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"451903488","memory.heapUsed":"157744152","memory.heapTotal":"163364864"},"startTime":1764713065887,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":41100834722,"id":2611,"parentId":3,"tags":{},"startTime":1764713066099,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":41100838611,"id":2612,"parentId":3,"tags":{},"startTime":1764713066103,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":27394,"timestamp":41404140917,"id":2613,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764713369405,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":41404168361,"id":2614,"parentId":2613,"tags":{"url":"/gunbuilder","memory.rss":"451919872","memory.heapUsed":"158449088","memory.heapTotal":"164151296"},"startTime":1764713369432,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":41404508531,"id":2616,"parentId":3,"tags":{},"startTime":1764713369772,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":6,"timestamp":41404513627,"id":2617,"parentId":3,"tags":{},"startTime":1764713369778,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19719,"timestamp":42329233293,"id":2618,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764714294497,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":42329253044,"id":2619,"parentId":2618,"tags":{"url":"/gunbuilder","memory.rss":"452050944","memory.heapUsed":"156690560","memory.heapTotal":"163627008"},"startTime":1764714294517,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":42329564903,"id":2621,"parentId":3,"tags":{},"startTime":1764714294828,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":42329571894,"id":2622,"parentId":3,"tags":{},"startTime":1764714294835,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":23498,"timestamp":42332789709,"id":2623,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764714298053,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":42332813245,"id":2624,"parentId":2623,"tags":{"url":"/gunbuilder","memory.rss":"452050944","memory.heapUsed":"157964104","memory.heapTotal":"164413440"},"startTime":1764714298077,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":42333122790,"id":2626,"parentId":3,"tags":{},"startTime":1764714298386,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":42333128635,"id":2627,"parentId":3,"tags":{},"startTime":1764714298392,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20749,"timestamp":42341981623,"id":2628,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764714307245,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":42342002420,"id":2629,"parentId":2628,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"452919296","memory.heapUsed":"159151496","memory.heapTotal":"166789120"},"startTime":1764714307266,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":7631,"timestamp":42342007164,"id":2630,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764714307271,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":42342014857,"id":2631,"parentId":2630,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"453066752","memory.heapUsed":"158470216","memory.heapTotal":"164167680"},"startTime":1764714307278,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":21642,"timestamp":42678345980,"id":2632,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764714643611,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":42678367672,"id":2633,"parentId":2632,"tags":{"url":"/gunbuilder","memory.rss":"453165056","memory.heapUsed":"158779720","memory.heapTotal":"165478400"},"startTime":1764714643632,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":42678681853,"id":2635,"parentId":3,"tags":{},"startTime":1764714643947,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":42678689617,"id":2636,"parentId":3,"tags":{},"startTime":1764714643954,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10327,"timestamp":42680999097,"id":2637,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764714646264,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":42681009580,"id":2638,"parentId":2637,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"453214208","memory.heapUsed":"159258880","memory.heapTotal":"164954112"},"startTime":1764714646274,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9503,"timestamp":42681014001,"id":2639,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764714646279,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":42681023548,"id":2640,"parentId":2639,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"453246976","memory.heapUsed":"159521744","memory.heapTotal":"165740544"},"startTime":1764714646288,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20034,"timestamp":43571910323,"id":2641,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764715537175,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":43571930392,"id":2642,"parentId":2641,"tags":{"url":"/gunbuilder","memory.rss":"453312512","memory.heapUsed":"159024240","memory.heapTotal":"166002688"},"startTime":1764715537195,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":43572236426,"id":2644,"parentId":3,"tags":{},"startTime":1764715537501,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":43572242316,"id":2645,"parentId":3,"tags":{},"startTime":1764715537507,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13968,"timestamp":43575383184,"id":2646,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764715540648,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":43575397188,"id":2647,"parentId":2646,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"453165056","memory.heapUsed":"158192336","memory.heapTotal":"164429824"},"startTime":1764715540662,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8622,"timestamp":43575402603,"id":2648,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764715540667,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":43575411264,"id":2649,"parentId":2648,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"453165056","memory.heapUsed":"158394480","memory.heapTotal":"165478400"},"startTime":1764715540676,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":16540,"timestamp":43587518139,"id":2650,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","isTurbopack":false},"startTime":1764715552783,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":43587534785,"id":2651,"parentId":2650,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","memory.rss":"453165056","memory.heapUsed":"157824584","memory.heapTotal":"164429824"},"startTime":1764715552800,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9051,"timestamp":43587539454,"id":2652,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","isTurbopack":false},"startTime":1764715552804,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":43587548577,"id":2653,"parentId":2652,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","memory.rss":"453165056","memory.heapUsed":"157960104","memory.heapTotal":"164691968"},"startTime":1764715552813,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19680,"timestamp":44035799517,"id":2655,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764716001064,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44035819234,"id":2656,"parentId":2655,"tags":{"url":"/gunbuilder","memory.rss":"453312512","memory.heapUsed":"158724168","memory.heapTotal":"165216256"},"startTime":1764716001084,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":44036139444,"id":2658,"parentId":3,"tags":{},"startTime":1764716001404,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":44036142243,"id":2659,"parentId":3,"tags":{},"startTime":1764716001407,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":21611,"timestamp":44039105522,"id":2660,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764716004370,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44039127173,"id":2661,"parentId":2660,"tags":{"url":"/gunbuilder","memory.rss":"453312512","memory.heapUsed":"159091488","memory.heapTotal":"165478400"},"startTime":1764716004392,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":44039449459,"id":2663,"parentId":3,"tags":{},"startTime":1764716004714,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":6,"timestamp":44039455117,"id":2664,"parentId":3,"tags":{},"startTime":1764716004720,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":17475,"timestamp":44052370859,"id":2665,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","isTurbopack":false},"startTime":1764716017636,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":44052388509,"id":2666,"parentId":2665,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","memory.rss":"453312512","memory.heapUsed":"159515184","memory.heapTotal":"164429824"},"startTime":1764716017653,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9011,"timestamp":44052396410,"id":2667,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","isTurbopack":false},"startTime":1764716017661,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":44052405484,"id":2668,"parentId":2667,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","memory.rss":"453312512","memory.heapUsed":"158996568","memory.heapTotal":"165478400"},"startTime":1764716017670,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14199,"timestamp":44285099535,"id":2679,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14263,"timestamp":44285099543,"id":2680,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15910,"timestamp":44285099391,"id":2673,"parentId":2672,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16362,"timestamp":44285099550,"id":2681,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17174,"timestamp":44285099504,"id":2675,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20429,"timestamp":44285099519,"id":2677,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20479,"timestamp":44285099528,"id":2678,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":2564,"timestamp":44285117498,"id":2688,"parentId":2687,"tags":{},"startTime":1764716250382,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":15268,"timestamp":44285112334,"id":2686,"parentId":2685,"tags":{},"startTime":1764716250377,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":15524,"timestamp":44285112083,"id":2685,"parentId":2684,"tags":{},"startTime":1764716250377,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":28794,"timestamp":44285111885,"id":2684,"parentId":2671,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764716250377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":41387,"timestamp":44285099490,"id":2674,"parentId":2672,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":57002,"timestamp":44285120130,"id":2690,"parentId":2689,"tags":{},"startTime":1764716250385,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":57363,"timestamp":44285120112,"id":2689,"parentId":2687,"tags":{},"startTime":1764716250385,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4363,"timestamp":44285177506,"id":2691,"parentId":2687,"tags":{"astUsed":"true"},"startTime":1764716250442,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":66934,"timestamp":44285117217,"id":2687,"parentId":2683,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764716250382,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":76653,"timestamp":44285110006,"id":2683,"parentId":2671,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764716250375,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":38,"timestamp":44285190179,"id":2692,"parentId":2683,"tags":{},"startTime":1764716250455,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":90892,"timestamp":44285099512,"id":2676,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":97702,"timestamp":44285099570,"id":2682,"parentId":2672,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764716250364,"traceId":"247574ce86dfd828"},{"name":"make","duration":98744,"timestamp":44285098539,"id":2672,"parentId":2671,"tags":{},"startTime":1764716250363,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":892,"timestamp":44285198391,"id":2694,"parentId":2693,"tags":{},"startTime":1764716250463,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":44285199303,"id":2696,"parentId":2693,"tags":{},"startTime":1764716250464,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":35,"timestamp":44285199341,"id":2697,"parentId":2693,"tags":{},"startTime":1764716250464,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":44285199399,"id":2698,"parentId":2693,"tags":{},"startTime":1764716250464,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":44285199425,"id":2699,"parentId":2693,"tags":{},"startTime":1764716250464,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":410,"timestamp":44285199299,"id":2695,"parentId":2693,"tags":{},"startTime":1764716250464,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":274,"timestamp":44285200288,"id":2700,"parentId":2693,"tags":{},"startTime":1764716250465,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1098,"timestamp":44285200567,"id":2701,"parentId":2693,"tags":{},"startTime":1764716250465,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2391,"timestamp":44285202550,"id":2702,"parentId":2693,"tags":{},"startTime":1764716250467,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":91,"timestamp":44285204941,"id":2703,"parentId":2693,"tags":{},"startTime":1764716250470,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":27,"timestamp":44285205025,"id":2704,"parentId":2693,"tags":{},"startTime":1764716250470,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3140,"timestamp":44285205078,"id":2705,"parentId":2693,"tags":{},"startTime":1764716250470,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":190,"timestamp":44285209022,"id":2707,"parentId":2671,"tags":{},"startTime":1764716250474,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":262,"timestamp":44285208953,"id":2706,"parentId":2671,"tags":{},"startTime":1764716250474,"traceId":"247574ce86dfd828"},{"name":"seal","duration":12075,"timestamp":44285198102,"id":2693,"parentId":2671,"tags":{},"startTime":1764716250463,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":114205,"timestamp":44285095984,"id":2671,"parentId":2669,"tags":{"name":"client"},"startTime":1764716250361,"traceId":"247574ce86dfd828"},{"name":"emit","duration":6651,"timestamp":44285210197,"id":2708,"parentId":2669,"tags":{},"startTime":1764716250475,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":132663,"timestamp":44285084688,"id":2669,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764716250350,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":0,"timestamp":44285219211,"id":2711,"parentId":3,"tags":{},"startTime":1764716250484,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":44285219238,"id":2712,"parentId":3,"tags":{},"startTime":1764716250484,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4931,"timestamp":44285220194,"id":2714,"parentId":2710,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764716250485,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4935,"timestamp":44285220197,"id":2715,"parentId":2710,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764716250485,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4935,"timestamp":44285220200,"id":2717,"parentId":2710,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764716250485,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5403,"timestamp":44285220164,"id":2713,"parentId":2710,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764716250485,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":994,"timestamp":44285224734,"id":2720,"parentId":2719,"tags":{},"startTime":1764716250490,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1080,"timestamp":44285224649,"id":2719,"parentId":2718,"tags":{},"startTime":1764716250490,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2221,"timestamp":44285224486,"id":2718,"parentId":2709,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764716250489,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":143000,"timestamp":44285085418,"id":2721,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","[project]/node_modules/next/dist/client/components/not-found-error.js"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764716250496,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20355,"timestamp":44285220198,"id":2716,"parentId":2710,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764716250485,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":7166,"timestamp":44285242407,"id":2739,"parentId":2738,"tags":{},"startTime":1764716250507,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":7242,"timestamp":44285242335,"id":2738,"parentId":2737,"tags":{},"startTime":1764716250507,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":13136,"timestamp":44285242210,"id":2737,"parentId":2709,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764716250507,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":161000,"timestamp":44285085423,"id":2740,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","[project]/node_modules/next/dist/client/components/not-found-error.js","[project]/app/gunbuilder/admin/category-mappings/page.tsx"],"page":"/gunbuilder/admin/category-mappings","isPageHidden":false},"startTime":1764716250520,"traceId":"247574ce86dfd828"},{"name":"make","duration":37419,"timestamp":44285218451,"id":2710,"parentId":2709,"tags":{},"startTime":1764716250483,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1325,"timestamp":44285257262,"id":2742,"parentId":2741,"tags":{},"startTime":1764716250522,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":44285258600,"id":2744,"parentId":2741,"tags":{},"startTime":1764716250524,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1144,"timestamp":44285258661,"id":2745,"parentId":2741,"tags":{},"startTime":1764716250524,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":44285259817,"id":2746,"parentId":2741,"tags":{},"startTime":1764716250525,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":44285259833,"id":2747,"parentId":2741,"tags":{},"startTime":1764716250525,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1465,"timestamp":44285258598,"id":2743,"parentId":2741,"tags":{},"startTime":1764716250523,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":176,"timestamp":44285260464,"id":2748,"parentId":2741,"tags":{},"startTime":1764716250525,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":639,"timestamp":44285260644,"id":2749,"parentId":2741,"tags":{},"startTime":1764716250526,"traceId":"247574ce86dfd828"},{"name":"hash","duration":685,"timestamp":44285261923,"id":2750,"parentId":2741,"tags":{},"startTime":1764716250527,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":33,"timestamp":44285262608,"id":2751,"parentId":2741,"tags":{},"startTime":1764716250528,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":28,"timestamp":44285262638,"id":2752,"parentId":2741,"tags":{},"startTime":1764716250528,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1512,"timestamp":44285262669,"id":2753,"parentId":2741,"tags":{},"startTime":1764716250528,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8037,"timestamp":44285257050,"id":2741,"parentId":2709,"tags":{},"startTime":1764716250522,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":48415,"timestamp":44285218237,"id":2709,"parentId":2670,"tags":{"name":"server"},"startTime":1764716250483,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1625,"timestamp":44285266670,"id":2754,"parentId":2670,"tags":{},"startTime":1764716250532,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":183867,"timestamp":44285085315,"id":2670,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764716250350,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":17922,"timestamp":44285274657,"id":2755,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764716250540,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44285292597,"id":2757,"parentId":2755,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"515358720","memory.heapUsed":"184331496","memory.heapTotal":"218546176"},"startTime":1764716250557,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20464,"timestamp":44285274894,"id":2756,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764716250540,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44285295372,"id":2758,"parentId":2756,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"515358720","memory.heapUsed":"184615136","memory.heapTotal":"218546176"},"startTime":1764716250560,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":67755,"timestamp":44467425058,"id":2759,"tags":{"url":"/gunbuilder/admin/merchants","isTurbopack":false},"startTime":1764716432690,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44467492844,"id":2760,"parentId":2759,"tags":{"url":"/gunbuilder/admin/merchants","memory.rss":"477659136","memory.heapUsed":"173208952","memory.heapTotal":"183074816"},"startTime":1764716432758,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":9,"timestamp":44467686305,"id":2761,"parentId":3,"tags":{},"startTime":1764716432951,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":44467695902,"id":2762,"parentId":3,"tags":{},"startTime":1764716432961,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":32909,"timestamp":44795735928,"id":2763,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764716761001,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44795768896,"id":2764,"parentId":2763,"tags":{"url":"/gunbuilder","memory.rss":"477822976","memory.heapUsed":"171138632","memory.heapTotal":"179175424"},"startTime":1764716761034,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":44795994347,"id":2765,"parentId":3,"tags":{},"startTime":1764716761259,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":44795999427,"id":2766,"parentId":3,"tags":{},"startTime":1764716761264,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24771,"timestamp":44801800116,"id":2767,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","isTurbopack":false},"startTime":1764716767065,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":44801824961,"id":2768,"parentId":2767,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","memory.rss":"479543296","memory.heapUsed":"172044888","memory.heapTotal":"179453952"},"startTime":1764716767090,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6494,"timestamp":44801833380,"id":2769,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","isTurbopack":false},"startTime":1764716767098,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":44801839894,"id":2770,"parentId":2769,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","memory.rss":"479559680","memory.heapUsed":"173015216","memory.heapTotal":"180502528"},"startTime":1764716767105,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13623,"timestamp":44812004939,"id":2771,"tags":{"url":"/gunbuilder/chargingHandle?_rsc=1acsq","isTurbopack":false},"startTime":1764716777270,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":44812018674,"id":2772,"parentId":2771,"tags":{"url":"/gunbuilder/chargingHandle?_rsc=1acsq","memory.rss":"479559680","memory.heapUsed":"172628816","memory.heapTotal":"179191808"},"startTime":1764716777284,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10632,"timestamp":44812023461,"id":2773,"tags":{"url":"/gunbuilder/chargingHandle?_rsc=1nj36","isTurbopack":false},"startTime":1764716777288,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":44812034141,"id":2774,"parentId":2773,"tags":{"url":"/gunbuilder/chargingHandle?_rsc=1nj36","memory.rss":"479559680","memory.heapUsed":"172848296","memory.heapTotal":"179978240"},"startTime":1764716777299,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25159,"timestamp":45599160407,"id":2775,"tags":{"url":"/gunbuilder/chargingHandle","isTurbopack":false},"startTime":1764717564425,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":45599185632,"id":2776,"parentId":2775,"tags":{"url":"/gunbuilder/chargingHandle","memory.rss":"479576064","memory.heapUsed":"172999728","memory.heapTotal":"179978240"},"startTime":1764717564451,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":45599400422,"id":2777,"parentId":3,"tags":{},"startTime":1764717564665,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":45599402311,"id":2778,"parentId":3,"tags":{},"startTime":1764717564667,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":71960,"timestamp":45609120942,"id":2786,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":71966,"timestamp":45609120947,"id":2787,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":71964,"timestamp":45609120953,"id":2788,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fbuild%2Fpage&page=%2Fgunbuilder%2Fbuild%2Fpage&appPaths=%2Fgunbuilder%2Fbuild%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fbuild%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":71960,"timestamp":45609120959,"id":2789,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":73124,"timestamp":45609120859,"id":2784,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":84930,"timestamp":45609120933,"id":2785,"parentId":2783,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764717574386,"traceId":"247574ce86dfd828"},{"name":"make","duration":96058,"timestamp":45609116839,"id":2783,"parentId":2782,"tags":{},"startTime":1764717574382,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1948,"timestamp":45609214316,"id":2809,"parentId":2808,"tags":{},"startTime":1764717574479,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":45609216280,"id":2811,"parentId":2808,"tags":{},"startTime":1764717574481,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1740,"timestamp":45609216321,"id":2812,"parentId":2808,"tags":{},"startTime":1764717574481,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":10,"timestamp":45609218108,"id":2813,"parentId":2808,"tags":{},"startTime":1764717574483,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":45609218144,"id":2814,"parentId":2808,"tags":{},"startTime":1764717574483,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2213,"timestamp":45609216276,"id":2810,"parentId":2808,"tags":{},"startTime":1764717574481,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":377,"timestamp":45609219197,"id":2815,"parentId":2808,"tags":{},"startTime":1764717574484,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":602,"timestamp":45609219579,"id":2816,"parentId":2808,"tags":{},"startTime":1764717574484,"traceId":"247574ce86dfd828"},{"name":"hash","duration":937,"timestamp":45609220992,"id":2817,"parentId":2808,"tags":{},"startTime":1764717574486,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":52,"timestamp":45609221928,"id":2818,"parentId":2808,"tags":{},"startTime":1764717574487,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":48,"timestamp":45609221976,"id":2819,"parentId":2808,"tags":{},"startTime":1764717574487,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":953,"timestamp":45609222027,"id":2820,"parentId":2808,"tags":{},"startTime":1764717574487,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10048,"timestamp":45609214044,"id":2808,"parentId":2782,"tags":{},"startTime":1764717574479,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":109781,"timestamp":45609116231,"id":2782,"parentId":2780,"tags":{"name":"server"},"startTime":1764717574381,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7528,"timestamp":45609226026,"id":2821,"parentId":2780,"tags":{},"startTime":1764717574491,"traceId":"247574ce86dfd828"},{"name":"compile-path","duration":123316,"timestamp":45609110825,"id":2781,"tags":{"trigger":"/gunbuilder/[categoryId]/[partId]","isTurbopack":false},"startTime":1764717574376,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":123803,"timestamp":45609110675,"id":2780,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764717574376,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":149139,"timestamp":45609106891,"id":2779,"tags":{"url":"/gunbuilder/chargingHandle/579?_rsc=14jbn","isTurbopack":false},"startTime":1764717574372,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":45609256049,"id":2822,"parentId":2779,"tags":{"url":"/gunbuilder/chargingHandle/579?_rsc=14jbn","memory.rss":"506642432","memory.heapUsed":"185896368","memory.heapTotal":"208977920"},"startTime":1764717574521,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":5514,"timestamp":45609263444,"id":2823,"tags":{"url":"/gunbuilder/chargingHandle/579?_rsc=tm7l4","isTurbopack":false},"startTime":1764717574528,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":45609268978,"id":2824,"parentId":2823,"tags":{"url":"/gunbuilder/chargingHandle/579?_rsc=tm7l4","memory.rss":"507658240","memory.heapUsed":"186954208","memory.heapTotal":"209764352"},"startTime":1764717574534,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":16126,"timestamp":45619460217,"id":2825,"tags":{"url":"/gunbuilder?_rsc=13k4c","isTurbopack":false},"startTime":1764717584725,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":45619476430,"id":2826,"parentId":2825,"tags":{"url":"/gunbuilder?_rsc=13k4c","memory.rss":"509034496","memory.heapUsed":"188336352","memory.heapTotal":"211173376"},"startTime":1764717584741,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11087,"timestamp":45619482835,"id":2827,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764717584748,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":45619493992,"id":2828,"parentId":2827,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"509755392","memory.heapUsed":"189093408","memory.heapTotal":"211959808"},"startTime":1764717584759,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":66848,"timestamp":52856088049,"id":2829,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764724821333,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":52856154943,"id":2830,"parentId":2829,"tags":{"url":"/gunbuilder","memory.rss":"512589824","memory.heapUsed":"169730712","memory.heapTotal":"182403072"},"startTime":1764724821400,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":8,"timestamp":52856367571,"id":2831,"parentId":3,"tags":{},"startTime":1764724821613,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15719,"timestamp":52859188711,"id":2832,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","isTurbopack":false},"startTime":1764724824434,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52859204483,"id":2833,"parentId":2832,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1acsq","memory.rss":"512933888","memory.heapUsed":"171021976","memory.heapTotal":"182730752"},"startTime":1764724824449,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6726,"timestamp":52859210761,"id":2834,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764724824456,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":52859217519,"id":2835,"parentId":2834,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"512933888","memory.heapUsed":"169823624","memory.heapTotal":"179847168"},"startTime":1764724824463,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11954,"timestamp":52862860752,"id":2836,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","isTurbopack":false},"startTime":1764724828106,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52862872793,"id":2837,"parentId":2836,"tags":{"url":"/gunbuilder/buffer?_rsc=1acsq","memory.rss":"512950272","memory.heapUsed":"170862896","memory.heapTotal":"180895744"},"startTime":1764724828118,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8330,"timestamp":52862876335,"id":2838,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","isTurbopack":false},"startTime":1764724828121,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52862884714,"id":2839,"parentId":2838,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","memory.rss":"512950272","memory.heapUsed":"170297944","memory.heapTotal":"179585024"},"startTime":1764724828130,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13658,"timestamp":52866436330,"id":2840,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","isTurbopack":false},"startTime":1764724831681,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":52866450095,"id":2841,"parentId":2840,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","memory.rss":"512311296","memory.heapUsed":"170473520","memory.heapTotal":"179322880"},"startTime":1764724831695,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9015,"timestamp":52866454986,"id":2842,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","isTurbopack":false},"startTime":1764724831700,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":52866464061,"id":2843,"parentId":2842,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","memory.rss":"512311296","memory.heapUsed":"169923520","memory.heapTotal":"180633600"},"startTime":1764724831709,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8569,"timestamp":52870783757,"id":2844,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","isTurbopack":false},"startTime":1764724836029,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52870792374,"id":2845,"parentId":2844,"tags":{"url":"/gunbuilder/upper?_rsc=1acsq","memory.rss":"512311296","memory.heapUsed":"170009816","memory.heapTotal":"179585024"},"startTime":1764724836037,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10268,"timestamp":52870794847,"id":2846,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","isTurbopack":false},"startTime":1764724836040,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52870805158,"id":2847,"parentId":2846,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","memory.rss":"512311296","memory.heapUsed":"170123408","memory.heapTotal":"179847168"},"startTime":1764724836050,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":12262,"timestamp":52879797058,"id":2848,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","isTurbopack":false},"startTime":1764724845042,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52879809397,"id":2849,"parentId":2848,"tags":{"url":"/gunbuilder/suppressor?_rsc=1acsq","memory.rss":"512327680","memory.heapUsed":"170177168","memory.heapTotal":"179585024"},"startTime":1764724845054,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10201,"timestamp":52879812947,"id":2850,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","isTurbopack":false},"startTime":1764724845058,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52879823204,"id":2851,"parentId":2850,"tags":{"url":"/gunbuilder/suppressor?_rsc=uve0s","memory.rss":"512327680","memory.heapUsed":"170313008","memory.heapTotal":"179847168"},"startTime":1764724845068,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":12958,"timestamp":52886657019,"id":2852,"tags":{"url":"/gunbuilder/optic?_rsc=1acsq","isTurbopack":false},"startTime":1764724851902,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52886670051,"id":2853,"parentId":2852,"tags":{"url":"/gunbuilder/optic?_rsc=1acsq","memory.rss":"512327680","memory.heapUsed":"170351792","memory.heapTotal":"180633600"},"startTime":1764724851915,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9005,"timestamp":52886674137,"id":2854,"tags":{"url":"/gunbuilder/optic?_rsc=l6cyw","isTurbopack":false},"startTime":1764724851919,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52886683200,"id":2855,"parentId":2854,"tags":{"url":"/gunbuilder/optic?_rsc=l6cyw","memory.rss":"512344064","memory.heapUsed":"170448192","memory.heapTotal":"180895744"},"startTime":1764724851928,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15970,"timestamp":52889314239,"id":2856,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764724854559,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":52889330284,"id":2857,"parentId":2856,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"512344064","memory.heapUsed":"170396528","memory.heapTotal":"179847168"},"startTime":1764724854575,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":14723,"timestamp":52971939710,"id":2858,"tags":{"url":"/gunbuilder/sights?_rsc=1jn8g","isTurbopack":false},"startTime":1764724937184,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52971954526,"id":2859,"parentId":2858,"tags":{"url":"/gunbuilder/sights?_rsc=1jn8g","memory.rss":"512344064","memory.heapUsed":"170784488","memory.heapTotal":"179322880"},"startTime":1764724937199,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13088,"timestamp":52971957659,"id":2860,"tags":{"url":"/gunbuilder/sights?_rsc=1eh78","isTurbopack":false},"startTime":1764724937202,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":52971970784,"id":2861,"parentId":2860,"tags":{"url":"/gunbuilder/sights?_rsc=1eh78","memory.rss":"512360448","memory.heapUsed":"170992704","memory.heapTotal":"180633600"},"startTime":1764724937215,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13228,"timestamp":52977791282,"id":2862,"tags":{"url":"/gunbuilder/handguard?_rsc=1jn8g","isTurbopack":false},"startTime":1764724943036,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":52977804606,"id":2863,"parentId":2862,"tags":{"url":"/gunbuilder/handguard?_rsc=1jn8g","memory.rss":"512360448","memory.heapUsed":"171141624","memory.heapTotal":"179847168"},"startTime":1764724943049,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9322,"timestamp":52977809705,"id":2864,"tags":{"url":"/gunbuilder/handguard?_rsc=rs5ev","isTurbopack":false},"startTime":1764724943054,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":52977819069,"id":2865,"parentId":2864,"tags":{"url":"/gunbuilder/handguard?_rsc=rs5ev","memory.rss":"512360448","memory.heapUsed":"171276648","memory.heapTotal":"180895744"},"startTime":1764724943064,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15357,"timestamp":52983448897,"id":2866,"tags":{"url":"/gunbuilder/suppressor?_rsc=z0q2d","isTurbopack":false},"startTime":1764724948694,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":4,"timestamp":52983464349,"id":2867,"parentId":2866,"tags":{"url":"/gunbuilder/suppressor?_rsc=z0q2d","memory.rss":"512360448","memory.heapUsed":"170727240","memory.heapTotal":"179847168"},"startTime":1764724948709,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13495,"timestamp":53165251093,"id":2879,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13578,"timestamp":53165251116,"id":2881,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14185,"timestamp":53165250964,"id":2872,"parentId":2871,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14584,"timestamp":53165251100,"id":2880,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16357,"timestamp":53165251058,"id":2874,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19446,"timestamp":53165251072,"id":2876,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":8799,"timestamp":53165262045,"id":2885,"parentId":2884,"tags":{},"startTime":1764725130506,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":9044,"timestamp":53165261803,"id":2884,"parentId":2883,"tags":{},"startTime":1764725130506,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":19686,"timestamp":53165261593,"id":2883,"parentId":2870,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764725130506,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":30419,"timestamp":53165251080,"id":2877,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":13442,"timestamp":53165268087,"id":2887,"parentId":2886,"tags":{},"startTime":1764725130512,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":34612,"timestamp":53165251046,"id":2873,"parentId":2871,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":34575,"timestamp":53165251087,"id":2878,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":17117,"timestamp":53165281566,"id":2889,"parentId":2888,"tags":{},"startTime":1764725130526,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":17435,"timestamp":53165281554,"id":2888,"parentId":2886,"tags":{},"startTime":1764725130526,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3977,"timestamp":53165299017,"id":2890,"parentId":2886,"tags":{"astUsed":"true"},"startTime":1764725130543,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":36585,"timestamp":53165267805,"id":2886,"parentId":2882,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764725130512,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":46786,"timestamp":53165260061,"id":2882,"parentId":2870,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764725130504,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":30,"timestamp":53165306995,"id":2891,"parentId":2882,"tags":{},"startTime":1764725130551,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":55984,"timestamp":53165251065,"id":2875,"parentId":2871,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725130495,"traceId":"247574ce86dfd828"},{"name":"make","duration":56832,"timestamp":53165250225,"id":2871,"parentId":2870,"tags":{},"startTime":1764725130494,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":861,"timestamp":53165331134,"id":2893,"parentId":2892,"tags":{},"startTime":1764725130575,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":4,"timestamp":53165332015,"id":2895,"parentId":2892,"tags":{},"startTime":1764725130576,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":34,"timestamp":53165332082,"id":2896,"parentId":2892,"tags":{},"startTime":1764725130576,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":53165332134,"id":2897,"parentId":2892,"tags":{},"startTime":1764725130576,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":53165332147,"id":2898,"parentId":2892,"tags":{},"startTime":1764725130576,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":385,"timestamp":53165332010,"id":2894,"parentId":2892,"tags":{},"startTime":1764725130576,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":252,"timestamp":53165332863,"id":2899,"parentId":2892,"tags":{},"startTime":1764725130577,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":930,"timestamp":53165333120,"id":2900,"parentId":2892,"tags":{},"startTime":1764725130577,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1718,"timestamp":53165334813,"id":2901,"parentId":2892,"tags":{},"startTime":1764725130579,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":605,"timestamp":53165336530,"id":2902,"parentId":2892,"tags":{},"startTime":1764725130581,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":72,"timestamp":53165337120,"id":2903,"parentId":2892,"tags":{},"startTime":1764725130581,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3483,"timestamp":53165337200,"id":2904,"parentId":2892,"tags":{},"startTime":1764725130581,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":209,"timestamp":53165341580,"id":2906,"parentId":2870,"tags":{},"startTime":1764725130586,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":312,"timestamp":53165341484,"id":2905,"parentId":2870,"tags":{},"startTime":1764725130586,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11719,"timestamp":53165330873,"id":2892,"parentId":2870,"tags":{},"startTime":1764725130575,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":93747,"timestamp":53165248865,"id":2870,"parentId":2868,"tags":{"name":"client"},"startTime":1764725130493,"traceId":"247574ce86dfd828"},{"name":"emit","duration":4746,"timestamp":53165342626,"id":2907,"parentId":2868,"tags":{},"startTime":1764725130587,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":109140,"timestamp":53165238817,"id":2868,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764725130483,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":53165349823,"id":2910,"parentId":3,"tags":{},"startTime":1764725130594,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5570,"timestamp":53165350584,"id":2913,"parentId":2909,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725130595,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5574,"timestamp":53165350586,"id":2914,"parentId":2909,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725130595,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5575,"timestamp":53165350587,"id":2915,"parentId":2909,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725130595,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6032,"timestamp":53165350549,"id":2911,"parentId":2909,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725130595,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1233,"timestamp":53165355606,"id":2918,"parentId":2917,"tags":{},"startTime":1764725130600,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1315,"timestamp":53165355526,"id":2917,"parentId":2916,"tags":{},"startTime":1764725130600,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2516,"timestamp":53165355319,"id":2916,"parentId":2908,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764725130599,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7523,"timestamp":53165350582,"id":2912,"parentId":2909,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725130595,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2933,"timestamp":53165359441,"id":2936,"parentId":2935,"tags":{},"startTime":1764725130604,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2980,"timestamp":53165359397,"id":2935,"parentId":2934,"tags":{},"startTime":1764725130604,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":9137,"timestamp":53165359325,"id":2934,"parentId":2908,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764725130603,"traceId":"247574ce86dfd828"},{"name":"make","duration":19789,"timestamp":53165349264,"id":2909,"parentId":2908,"tags":{},"startTime":1764725130593,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1467,"timestamp":53165373846,"id":2938,"parentId":2937,"tags":{},"startTime":1764725130618,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":53165375325,"id":2940,"parentId":2937,"tags":{},"startTime":1764725130619,"traceId":"247574ce86dfd828"}] +[{"name":"optimize-chunks","duration":1232,"timestamp":53165375450,"id":2941,"parentId":2937,"tags":{},"startTime":1764725130620,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":53165376698,"id":2942,"parentId":2937,"tags":{},"startTime":1764725130621,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":53165376710,"id":2943,"parentId":2937,"tags":{},"startTime":1764725130621,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1570,"timestamp":53165375321,"id":2939,"parentId":2937,"tags":{},"startTime":1764725130619,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":236,"timestamp":53165377372,"id":2944,"parentId":2937,"tags":{},"startTime":1764725130621,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":923,"timestamp":53165377613,"id":2945,"parentId":2937,"tags":{},"startTime":1764725130622,"traceId":"247574ce86dfd828"},{"name":"hash","duration":882,"timestamp":53165378976,"id":2946,"parentId":2937,"tags":{},"startTime":1764725130623,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":77,"timestamp":53165379857,"id":2947,"parentId":2937,"tags":{},"startTime":1764725130624,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":40,"timestamp":53165379927,"id":2948,"parentId":2937,"tags":{},"startTime":1764725130624,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2157,"timestamp":53165379969,"id":2949,"parentId":2937,"tags":{},"startTime":1764725130624,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9761,"timestamp":53165373635,"id":2937,"parentId":2908,"tags":{},"startTime":1764725130618,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":36062,"timestamp":53165349091,"id":2908,"parentId":2869,"tags":{"name":"server"},"startTime":1764725130593,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2193,"timestamp":53165385167,"id":2950,"parentId":2869,"tags":{},"startTime":1764725130629,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":148536,"timestamp":53165239259,"id":2869,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764725130483,"traceId":"247574ce86dfd828"}] +[{"name":"client-hmr-latency","duration":236000,"timestamp":53165239501,"id":2951,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764725130721,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11723,"timestamp":53165478184,"id":2952,"tags":{"url":"/gunbuilder/suppressor?_rsc=1vi7t","isTurbopack":false},"startTime":1764725130722,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":53165489934,"id":2953,"parentId":2952,"tags":{"url":"/gunbuilder/suppressor?_rsc=1vi7t","memory.rss":"519569408","memory.heapUsed":"185133928","memory.heapTotal":"215744512"},"startTime":1764725130734,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":14865,"timestamp":53168811649,"id":2954,"tags":{"url":"/gunbuilder?_rsc=hzxn6","isTurbopack":false},"startTime":1764725134056,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":53168826551,"id":2955,"parentId":2954,"tags":{"url":"/gunbuilder?_rsc=hzxn6","memory.rss":"519929856","memory.heapUsed":"186564000","memory.heapTotal":"216104960"},"startTime":1764725134071,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":18606,"timestamp":53190339374,"id":2956,"tags":{"url":"/gunbuilder/suppressor?_rsc=1jn8g","isTurbopack":false},"startTime":1764725155583,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":53190358062,"id":2957,"parentId":2956,"tags":{"url":"/gunbuilder/suppressor?_rsc=1jn8g","memory.rss":"519340032","memory.heapUsed":"187522120","memory.heapTotal":"216104960"},"startTime":1764725155602,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17661,"timestamp":53247583386,"id":2964,"parentId":2961,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725212827,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17682,"timestamp":53247583393,"id":2965,"parentId":2961,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725212827,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17685,"timestamp":53247583400,"id":2966,"parentId":2961,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725212827,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19014,"timestamp":53247583270,"id":2962,"parentId":2961,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725212827,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3180,"timestamp":53247600167,"id":2969,"parentId":2968,"tags":{},"startTime":1764725212844,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3385,"timestamp":53247599969,"id":2968,"parentId":2967,"tags":{},"startTime":1764725212844,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7097,"timestamp":53247599534,"id":2967,"parentId":2960,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764725212843,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24354,"timestamp":53247583376,"id":2963,"parentId":2961,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725212827,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5858,"timestamp":53247610356,"id":2987,"parentId":2986,"tags":{},"startTime":1764725212854,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5952,"timestamp":53247610267,"id":2986,"parentId":2985,"tags":{},"startTime":1764725212854,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":19039,"timestamp":53247610098,"id":2985,"parentId":2960,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764725212854,"traceId":"247574ce86dfd828"},{"name":"make","duration":52577,"timestamp":53247577645,"id":2961,"parentId":2960,"tags":{},"startTime":1764725212822,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1387,"timestamp":53247658361,"id":2989,"parentId":2988,"tags":{},"startTime":1764725212902,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":53247659761,"id":2991,"parentId":2988,"tags":{},"startTime":1764725212904,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1150,"timestamp":53247659826,"id":2992,"parentId":2988,"tags":{},"startTime":1764725212904,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":6,"timestamp":53247661019,"id":2993,"parentId":2988,"tags":{},"startTime":1764725212905,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":11,"timestamp":53247661052,"id":2994,"parentId":2988,"tags":{},"startTime":1764725212905,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1674,"timestamp":53247659758,"id":2990,"parentId":2988,"tags":{},"startTime":1764725212904,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":251,"timestamp":53247661965,"id":2995,"parentId":2988,"tags":{},"startTime":1764725212906,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":856,"timestamp":53247662221,"id":2996,"parentId":2988,"tags":{},"startTime":1764725212906,"traceId":"247574ce86dfd828"},{"name":"hash","duration":857,"timestamp":53247663580,"id":2997,"parentId":2988,"tags":{},"startTime":1764725212907,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":48,"timestamp":53247664437,"id":2998,"parentId":2988,"tags":{},"startTime":1764725212908,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":27,"timestamp":53247664481,"id":2999,"parentId":2988,"tags":{},"startTime":1764725212908,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2021,"timestamp":53247664510,"id":3000,"parentId":2988,"tags":{},"startTime":1764725212908,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9746,"timestamp":53247658134,"id":2988,"parentId":2960,"tags":{},"startTime":1764725212902,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":92555,"timestamp":53247576830,"id":2960,"parentId":2958,"tags":{"name":"server"},"startTime":1764725212821,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1581,"timestamp":53247669402,"id":3001,"parentId":2958,"tags":{},"startTime":1764725212913,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":107521,"timestamp":53247563694,"id":2958,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764725212808,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2360,"timestamp":53247677329,"id":3011,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2386,"timestamp":53247677336,"id":3013,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2594,"timestamp":53247677279,"id":3004,"parentId":3003,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2729,"timestamp":53247677331,"id":3012,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4092,"timestamp":53247677313,"id":3006,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4997,"timestamp":53247677317,"id":3008,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":615,"timestamp":53247681715,"id":3019,"parentId":3018,"tags":{},"startTime":1764725212926,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7960,"timestamp":53247677310,"id":3005,"parentId":3003,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7954,"timestamp":53247677319,"id":3009,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":6168,"timestamp":53247679230,"id":3017,"parentId":3016,"tags":{},"startTime":1764725212923,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":6234,"timestamp":53247679164,"id":3016,"parentId":3015,"tags":{},"startTime":1764725212923,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":13116,"timestamp":53247679101,"id":3015,"parentId":3002,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764725212923,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15679,"timestamp":53247677320,"id":3010,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":23812,"timestamp":53247682355,"id":3021,"parentId":3020,"tags":{},"startTime":1764725212926,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":24120,"timestamp":53247682347,"id":3020,"parentId":3018,"tags":{},"startTime":1764725212926,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4253,"timestamp":53247706490,"id":3022,"parentId":3018,"tags":{"astUsed":"true"},"startTime":1764725212950,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":29668,"timestamp":53247681577,"id":3018,"parentId":3014,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764725212925,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":34858,"timestamp":53247678587,"id":3014,"parentId":3002,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764725212922,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":29,"timestamp":53247713549,"id":3023,"parentId":3014,"tags":{},"startTime":1764725212957,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":36281,"timestamp":53247677315,"id":3007,"parentId":3003,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725212921,"traceId":"247574ce86dfd828"},{"name":"make","duration":40890,"timestamp":53247672713,"id":3003,"parentId":3002,"tags":{},"startTime":1764725212917,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":834,"timestamp":53247719141,"id":3025,"parentId":3024,"tags":{},"startTime":1764725212963,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":53247719987,"id":3027,"parentId":3024,"tags":{},"startTime":1764725212964,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":23,"timestamp":53247720026,"id":3028,"parentId":3024,"tags":{},"startTime":1764725212964,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":53247720058,"id":3029,"parentId":3024,"tags":{},"startTime":1764725212964,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":53247720069,"id":3030,"parentId":3024,"tags":{},"startTime":1764725212964,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":349,"timestamp":53247719983,"id":3026,"parentId":3024,"tags":{},"startTime":1764725212964,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":269,"timestamp":53247720918,"id":3031,"parentId":3024,"tags":{},"startTime":1764725212965,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1227,"timestamp":53247721192,"id":3032,"parentId":3024,"tags":{},"startTime":1764725212965,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2263,"timestamp":53247723240,"id":3033,"parentId":3024,"tags":{},"startTime":1764725212967,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":91,"timestamp":53247725503,"id":3034,"parentId":3024,"tags":{},"startTime":1764725212969,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":30,"timestamp":53247725589,"id":3035,"parentId":3024,"tags":{},"startTime":1764725212969,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3431,"timestamp":53247725621,"id":3036,"parentId":3024,"tags":{},"startTime":1764725212970,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":211,"timestamp":53247729849,"id":3038,"parentId":3002,"tags":{},"startTime":1764725212974,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":284,"timestamp":53247729779,"id":3037,"parentId":3002,"tags":{},"startTime":1764725212974,"traceId":"247574ce86dfd828"},{"name":"seal","duration":12330,"timestamp":53247718845,"id":3024,"parentId":3002,"tags":{},"startTime":1764725212963,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":58973,"timestamp":53247672218,"id":3002,"parentId":2959,"tags":{"name":"client"},"startTime":1764725212916,"traceId":"247574ce86dfd828"},{"name":"emit","duration":6928,"timestamp":53247731200,"id":3039,"parentId":2959,"tags":{},"startTime":1764725212975,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":175125,"timestamp":53247563904,"id":2959,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764725212808,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":8,"timestamp":53247742047,"id":3040,"parentId":3,"tags":{},"startTime":1764725212986,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":16916,"timestamp":53247743593,"id":3041,"tags":{"url":"/gunbuilder/suppressor?_rsc=g6kxx","isTurbopack":false},"startTime":1764725212987,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":53247760528,"id":3042,"parentId":3041,"tags":{"url":"/gunbuilder/suppressor?_rsc=g6kxx","memory.rss":"513818624","memory.heapUsed":"182083824","memory.heapTotal":"214958080"},"startTime":1764725213004,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":203000,"timestamp":53247563884,"id":3043,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764725213011,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":64494,"timestamp":53651136473,"id":3044,"tags":{"url":"/gunbuilder/suppressor","isTurbopack":false},"startTime":1764725616379,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":53651200996,"id":3045,"parentId":3044,"tags":{"url":"/gunbuilder/suppressor","memory.rss":"469319680","memory.heapUsed":"167716264","memory.heapTotal":"173588480"},"startTime":1764725616444,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":53651407611,"id":3046,"parentId":3,"tags":{},"startTime":1764725616650,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9807,"timestamp":53655765012,"id":3059,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9858,"timestamp":53655765023,"id":3060,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9924,"timestamp":53655765044,"id":3062,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9929,"timestamp":53655765051,"id":3063,"parentId":3052,"tags":{"request":"next-client-pages-loader?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10428,"timestamp":53655764885,"id":3053,"parentId":3052,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10824,"timestamp":53655765029,"id":3061,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11450,"timestamp":53655764983,"id":3055,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11696,"timestamp":53655764991,"id":3056,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13879,"timestamp":53655764997,"id":3057,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13933,"timestamp":53655765006,"id":3058,"parentId":3052,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14162,"timestamp":53655764971,"id":3054,"parentId":3052,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764725621008,"traceId":"247574ce86dfd828"},{"name":"make","duration":15797,"timestamp":53655763412,"id":3052,"parentId":3051,"tags":{},"startTime":1764725621006,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":788,"timestamp":53655803569,"id":3065,"parentId":3064,"tags":{},"startTime":1764725621046,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":53655804371,"id":3067,"parentId":3064,"tags":{},"startTime":1764725621047,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":30,"timestamp":53655804418,"id":3068,"parentId":3064,"tags":{},"startTime":1764725621047,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":53655804476,"id":3069,"parentId":3064,"tags":{},"startTime":1764725621047,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":53655804503,"id":3070,"parentId":3064,"tags":{},"startTime":1764725621047,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":577,"timestamp":53655804368,"id":3066,"parentId":3064,"tags":{},"startTime":1764725621047,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":198,"timestamp":53655805450,"id":3071,"parentId":3064,"tags":{},"startTime":1764725621048,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":442,"timestamp":53655805653,"id":3072,"parentId":3064,"tags":{},"startTime":1764725621048,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2068,"timestamp":53655807935,"id":3073,"parentId":3064,"tags":{},"startTime":1764725621051,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":87,"timestamp":53655810002,"id":3074,"parentId":3064,"tags":{},"startTime":1764725621053,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":44,"timestamp":53655810077,"id":3075,"parentId":3064,"tags":{},"startTime":1764725621053,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1607,"timestamp":53655810124,"id":3076,"parentId":3064,"tags":{},"startTime":1764725621053,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":200,"timestamp":53655812441,"id":3078,"parentId":3051,"tags":{},"startTime":1764725621055,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":279,"timestamp":53655812363,"id":3077,"parentId":3051,"tags":{},"startTime":1764725621055,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10280,"timestamp":53655803225,"id":3064,"parentId":3051,"tags":{},"startTime":1764725621046,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":52357,"timestamp":53655761161,"id":3051,"parentId":3048,"tags":{"name":"client"},"startTime":1764725621004,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2509,"timestamp":53655813527,"id":3079,"parentId":3048,"tags":{},"startTime":1764725621056,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":59202,"timestamp":53655757388,"id":3048,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764725621000,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24897,"timestamp":53655819346,"id":3084,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24904,"timestamp":53655819348,"id":3085,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24911,"timestamp":53655819350,"id":3086,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24911,"timestamp":53655819351,"id":3087,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":25220,"timestamp":53655819343,"id":3083,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":28676,"timestamp":53655819304,"id":3082,"parentId":3081,"tags":{"request":"next-app-loader?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764725621062,"traceId":"247574ce86dfd828"},{"name":"make","duration":32683,"timestamp":53655817907,"id":3081,"parentId":3080,"tags":{},"startTime":1764725621061,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1414,"timestamp":53655851957,"id":3106,"parentId":3105,"tags":{},"startTime":1764725621095,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":6,"timestamp":53655853389,"id":3108,"parentId":3105,"tags":{},"startTime":1764725621096,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1432,"timestamp":53655853462,"id":3109,"parentId":3105,"tags":{},"startTime":1764725621096,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":53655854907,"id":3110,"parentId":3105,"tags":{},"startTime":1764725621098,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":53655854922,"id":3111,"parentId":3105,"tags":{},"startTime":1764725621098,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1745,"timestamp":53655853384,"id":3107,"parentId":3105,"tags":{},"startTime":1764725621096,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":179,"timestamp":53655855580,"id":3112,"parentId":3105,"tags":{},"startTime":1764725621098,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":375,"timestamp":53655855762,"id":3113,"parentId":3105,"tags":{},"startTime":1764725621098,"traceId":"247574ce86dfd828"},{"name":"hash","duration":701,"timestamp":53655856590,"id":3114,"parentId":3105,"tags":{},"startTime":1764725621099,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":40,"timestamp":53655857290,"id":3115,"parentId":3105,"tags":{},"startTime":1764725621100,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":30,"timestamp":53655857328,"id":3116,"parentId":3105,"tags":{},"startTime":1764725621100,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":159,"timestamp":53655857360,"id":3117,"parentId":3105,"tags":{},"startTime":1764725621100,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7362,"timestamp":53655851718,"id":3105,"parentId":3080,"tags":{},"startTime":1764725621094,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":43099,"timestamp":53655817687,"id":3080,"parentId":3050,"tags":{"name":"server"},"startTime":1764725621060,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1238,"timestamp":53655860801,"id":3118,"parentId":3050,"tags":{},"startTime":1764725621104,"traceId":"247574ce86dfd828"},{"name":"compile-path","duration":104885,"timestamp":53655757496,"id":3049,"tags":{"trigger":"/_not-found","isTurbopack":false},"startTime":1764725621000,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":105038,"timestamp":53655757647,"id":3050,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764725621000,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":4,"timestamp":53656058165,"id":3119,"parentId":3,"tags":{},"startTime":1764725621301,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":6000,"timestamp":53656057569,"id":3120,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/suppressor","isPageHidden":false},"startTime":1764725621306,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":24701,"timestamp":53657326003,"id":3121,"tags":{"url":"/gunbuilder/suppressor","isTurbopack":false},"startTime":1764725622569,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":53657350750,"id":3122,"parentId":3121,"tags":{"url":"/gunbuilder/suppressor","memory.rss":"503431168","memory.heapUsed":"183106448","memory.heapTotal":"204668928"},"startTime":1764725622593,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":52,"timestamp":53657669947,"id":3124,"parentId":3,"tags":{},"startTime":1764725622913,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":19483,"timestamp":53675571187,"id":3125,"tags":{"url":"/gunbuilder/suppressor","isTurbopack":false},"startTime":1764725640814,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":53675590715,"id":3126,"parentId":3125,"tags":{"url":"/gunbuilder/suppressor","memory.rss":"502874112","memory.heapUsed":"187305000","memory.heapTotal":"204931072"},"startTime":1764725640833,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":53675784148,"id":3127,"parentId":3,"tags":{},"startTime":1764725641027,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":14,"timestamp":53675786754,"id":3128,"parentId":3,"tags":{},"startTime":1764725641029,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15298,"timestamp":54120340504,"id":3134,"parentId":3132,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726085582,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15300,"timestamp":54120340518,"id":3136,"parentId":3132,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726085582,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15303,"timestamp":54120340522,"id":3137,"parentId":3132,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726085582,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16333,"timestamp":54120340428,"id":3133,"parentId":3132,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726085582,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2525,"timestamp":54120355072,"id":3140,"parentId":3139,"tags":{},"startTime":1764726085596,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2705,"timestamp":54120354897,"id":3139,"parentId":3138,"tags":{},"startTime":1764726085596,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6192,"timestamp":54120354479,"id":3138,"parentId":3131,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764726085596,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":20665,"timestamp":54120340513,"id":3135,"parentId":3132,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726085582,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3240,"timestamp":54120364076,"id":3158,"parentId":3157,"tags":{},"startTime":1764726085605,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3379,"timestamp":54120363940,"id":3157,"parentId":3156,"tags":{},"startTime":1764726085605,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":11374,"timestamp":54120363829,"id":3156,"parentId":3131,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764726085605,"traceId":"247574ce86dfd828"},{"name":"make","duration":38732,"timestamp":54120337106,"id":3132,"parentId":3131,"tags":{},"startTime":1764726085579,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1432,"timestamp":54120400476,"id":3160,"parentId":3159,"tags":{},"startTime":1764726085642,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":4,"timestamp":54120401929,"id":3162,"parentId":3159,"tags":{},"startTime":1764726085643,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1315,"timestamp":54120401943,"id":3163,"parentId":3159,"tags":{},"startTime":1764726085643,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":6,"timestamp":54120403291,"id":3164,"parentId":3159,"tags":{},"startTime":1764726085645,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":54120403307,"id":3165,"parentId":3159,"tags":{},"startTime":1764726085645,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1759,"timestamp":54120401923,"id":3161,"parentId":3159,"tags":{},"startTime":1764726085643,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":223,"timestamp":54120404564,"id":3166,"parentId":3159,"tags":{},"startTime":1764726085646,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":732,"timestamp":54120404793,"id":3167,"parentId":3159,"tags":{},"startTime":1764726085646,"traceId":"247574ce86dfd828"},{"name":"hash","duration":476,"timestamp":54120405949,"id":3168,"parentId":3159,"tags":{},"startTime":1764726085647,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":40,"timestamp":54120406424,"id":3169,"parentId":3159,"tags":{},"startTime":1764726085648,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":36,"timestamp":54120406462,"id":3170,"parentId":3159,"tags":{},"startTime":1764726085648,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2771,"timestamp":54120406500,"id":3171,"parentId":3159,"tags":{},"startTime":1764726085648,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9879,"timestamp":54120400263,"id":3159,"parentId":3131,"tags":{},"startTime":1764726085642,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":75013,"timestamp":54120336639,"id":3131,"parentId":3129,"tags":{"name":"server"},"startTime":1764726085578,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1564,"timestamp":54120411669,"id":3172,"parentId":3129,"tags":{},"startTime":1764726085653,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":87059,"timestamp":54120326373,"id":3129,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726085568,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3668,"timestamp":54120419254,"id":3182,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3702,"timestamp":54120419263,"id":3184,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3969,"timestamp":54120419202,"id":3175,"parentId":3174,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4158,"timestamp":54120419256,"id":3183,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4426,"timestamp":54120419244,"id":3177,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5446,"timestamp":54120419249,"id":3179,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":672,"timestamp":54120424038,"id":3190,"parentId":3189,"tags":{},"startTime":1764726085665,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9122,"timestamp":54120419240,"id":3176,"parentId":3174,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9119,"timestamp":54120419251,"id":3180,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":6179,"timestamp":54120422358,"id":3188,"parentId":3187,"tags":{},"startTime":1764726085664,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":6273,"timestamp":54120422264,"id":3187,"parentId":3186,"tags":{},"startTime":1764726085664,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":13838,"timestamp":54120422182,"id":3186,"parentId":3173,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764726085664,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18978,"timestamp":54120419252,"id":3181,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":29198,"timestamp":54120424737,"id":3192,"parentId":3191,"tags":{},"startTime":1764726085666,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":29596,"timestamp":54120424729,"id":3191,"parentId":3189,"tags":{},"startTime":1764726085666,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3748,"timestamp":54120454365,"id":3193,"parentId":3189,"tags":{"astUsed":"true"},"startTime":1764726085696,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":34826,"timestamp":54120423895,"id":3189,"parentId":3185,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726085665,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":39937,"timestamp":54120421574,"id":3185,"parentId":3173,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726085663,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":36,"timestamp":54120461706,"id":3194,"parentId":3185,"tags":{},"startTime":1764726085703,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":42516,"timestamp":54120419247,"id":3178,"parentId":3174,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726085661,"traceId":"247574ce86dfd828"},{"name":"make","duration":46895,"timestamp":54120414878,"id":3174,"parentId":3173,"tags":{},"startTime":1764726085656,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":795,"timestamp":54120467643,"id":3196,"parentId":3195,"tags":{},"startTime":1764726085709,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54120468451,"id":3198,"parentId":3195,"tags":{},"startTime":1764726085710,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":25,"timestamp":54120468463,"id":3199,"parentId":3195,"tags":{},"startTime":1764726085710,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":5,"timestamp":54120468499,"id":3200,"parentId":3195,"tags":{},"startTime":1764726085710,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54120468515,"id":3201,"parentId":3195,"tags":{},"startTime":1764726085710,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":309,"timestamp":54120468446,"id":3197,"parentId":3195,"tags":{},"startTime":1764726085710,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":282,"timestamp":54120469239,"id":3202,"parentId":3195,"tags":{},"startTime":1764726085711,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1129,"timestamp":54120469525,"id":3203,"parentId":3195,"tags":{},"startTime":1764726085711,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1723,"timestamp":54120471294,"id":3204,"parentId":3195,"tags":{},"startTime":1764726085713,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":119,"timestamp":54120473016,"id":3205,"parentId":3195,"tags":{},"startTime":1764726085714,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":51,"timestamp":54120473123,"id":3206,"parentId":3195,"tags":{},"startTime":1764726085715,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3910,"timestamp":54120473177,"id":3207,"parentId":3195,"tags":{},"startTime":1764726085715,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":66,"timestamp":54120477639,"id":3209,"parentId":3173,"tags":{},"startTime":1764726085719,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":105,"timestamp":54120477604,"id":3208,"parentId":3173,"tags":{},"startTime":1764726085719,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11432,"timestamp":54120467362,"id":3195,"parentId":3173,"tags":{},"startTime":1764726085709,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":64451,"timestamp":54120414362,"id":3173,"parentId":3130,"tags":{"name":"client"},"startTime":1764726085656,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3744,"timestamp":54120478825,"id":3210,"parentId":3130,"tags":{},"startTime":1764726085720,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":156695,"timestamp":54120326568,"id":3130,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726085568,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":54120488049,"id":3211,"parentId":3,"tags":{},"startTime":1764726085729,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11451,"timestamp":54120489378,"id":3212,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","isTurbopack":false},"startTime":1764726085731,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":54120500846,"id":3213,"parentId":3212,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","memory.rss":"517554176","memory.heapUsed":"181362400","memory.heapTotal":"212549632"},"startTime":1764726085742,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":342000,"timestamp":54120327657,"id":3214,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","[project]/node_modules/next/dist/client/components/not-found-error.js","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726085911,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":16390,"timestamp":54129982675,"id":3215,"tags":{"url":"/gunbuilder?_rsc=hzxn6","isTurbopack":false},"startTime":1764726095224,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":54129999116,"id":3216,"parentId":3215,"tags":{"url":"/gunbuilder?_rsc=hzxn6","memory.rss":"517914624","memory.heapUsed":"183147360","memory.heapTotal":"212910080"},"startTime":1764726095241,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8863,"timestamp":54130005666,"id":3217,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764726095247,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":54130014579,"id":3218,"parentId":3217,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"517914624","memory.heapUsed":"183885680","memory.heapTotal":"212910080"},"startTime":1764726095256,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8822,"timestamp":54138098285,"id":3219,"tags":{"url":"/gunbuilder/suppressor?_rsc=1jn8g","isTurbopack":false},"startTime":1764726103340,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":54138107150,"id":3220,"parentId":3219,"tags":{"url":"/gunbuilder/suppressor?_rsc=1jn8g","memory.rss":"517914624","memory.heapUsed":"184916344","memory.heapTotal":"212910080"},"startTime":1764726103349,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9888,"timestamp":54349055588,"id":3232,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9998,"timestamp":54349055596,"id":3234,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11512,"timestamp":54349055476,"id":3225,"parentId":3224,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11999,"timestamp":54349055592,"id":3233,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12877,"timestamp":54349055567,"id":3227,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16173,"timestamp":54349055575,"id":3229,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16243,"timestamp":54349055580,"id":3230,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":2591,"timestamp":54349069249,"id":3240,"parentId":3239,"tags":{},"startTime":1764726314312,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":12879,"timestamp":54349063904,"id":3238,"parentId":3237,"tags":{},"startTime":1764726314307,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":13048,"timestamp":54349063743,"id":3237,"parentId":3236,"tags":{},"startTime":1764726314306,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":22720,"timestamp":54349063591,"id":3236,"parentId":3223,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764726314306,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":31276,"timestamp":54349055557,"id":3226,"parentId":3224,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32371,"timestamp":54349055584,"id":3231,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":29835,"timestamp":54349071900,"id":3242,"parentId":3241,"tags":{},"startTime":1764726314315,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":30276,"timestamp":54349071876,"id":3241,"parentId":3239,"tags":{},"startTime":1764726314315,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4007,"timestamp":54349102180,"id":3243,"parentId":3239,"tags":{"astUsed":"true"},"startTime":1764726314345,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":38267,"timestamp":54349069108,"id":3239,"parentId":3235,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726314312,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":45972,"timestamp":54349063211,"id":3235,"parentId":3223,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726314306,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":17,"timestamp":54349109279,"id":3244,"parentId":3235,"tags":{},"startTime":1764726314352,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":53750,"timestamp":54349055571,"id":3228,"parentId":3224,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"make","duration":54240,"timestamp":54349055092,"id":3224,"parentId":3223,"tags":{},"startTime":1764726314298,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":754,"timestamp":54349136672,"id":3246,"parentId":3245,"tags":{},"startTime":1764726314379,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":54349137443,"id":3248,"parentId":3245,"tags":{},"startTime":1764726314380,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":24,"timestamp":54349137456,"id":3249,"parentId":3245,"tags":{},"startTime":1764726314380,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54349137497,"id":3250,"parentId":3245,"tags":{},"startTime":1764726314380,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54349137512,"id":3251,"parentId":3245,"tags":{},"startTime":1764726314380,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":326,"timestamp":54349137435,"id":3247,"parentId":3245,"tags":{},"startTime":1764726314380,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":227,"timestamp":54349138274,"id":3252,"parentId":3245,"tags":{},"startTime":1764726314381,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":876,"timestamp":54349138506,"id":3253,"parentId":3245,"tags":{},"startTime":1764726314381,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2794,"timestamp":54349140103,"id":3254,"parentId":3245,"tags":{},"startTime":1764726314383,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":85,"timestamp":54349142897,"id":3255,"parentId":3245,"tags":{},"startTime":1764726314386,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":45,"timestamp":54349142976,"id":3256,"parentId":3245,"tags":{},"startTime":1764726314386,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2617,"timestamp":54349143024,"id":3257,"parentId":3245,"tags":{},"startTime":1764726314386,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":189,"timestamp":54349146347,"id":3259,"parentId":3223,"tags":{},"startTime":1764726314389,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":259,"timestamp":54349146279,"id":3258,"parentId":3223,"tags":{},"startTime":1764726314389,"traceId":"247574ce86dfd828"},{"name":"seal","duration":10886,"timestamp":54349136403,"id":3245,"parentId":3223,"tags":{},"startTime":1764726314379,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":93065,"timestamp":54349054242,"id":3223,"parentId":3221,"tags":{"name":"client"},"startTime":1764726314297,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2810,"timestamp":54349147319,"id":3260,"parentId":3221,"tags":{},"startTime":1764726314390,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":106790,"timestamp":54349043852,"id":3221,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726314287,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":2,"timestamp":54349153101,"id":3263,"parentId":3,"tags":{},"startTime":1764726314396,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3528,"timestamp":54349154748,"id":3266,"parentId":3262,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726314397,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3531,"timestamp":54349154750,"id":3267,"parentId":3262,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726314397,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3532,"timestamp":54349154752,"id":3268,"parentId":3262,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726314397,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1473,"timestamp":54349157944,"id":3271,"parentId":3270,"tags":{},"startTime":1764726314401,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1555,"timestamp":54349157864,"id":3270,"parentId":3269,"tags":{},"startTime":1764726314401,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2429,"timestamp":54349157706,"id":3269,"parentId":3261,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764726314400,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5436,"timestamp":54349154714,"id":3264,"parentId":3262,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726314397,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5859,"timestamp":54349154746,"id":3265,"parentId":3262,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726314397,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3187,"timestamp":54349161895,"id":3289,"parentId":3288,"tags":{},"startTime":1764726314405,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3239,"timestamp":54349161847,"id":3288,"parentId":3287,"tags":{},"startTime":1764726314405,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7778,"timestamp":54349161764,"id":3287,"parentId":3261,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764726314404,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":122000,"timestamp":54349045109,"id":3290,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726314414,"traceId":"247574ce86dfd828"},{"name":"make","duration":19446,"timestamp":54349151846,"id":3262,"parentId":3261,"tags":{},"startTime":1764726314395,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1430,"timestamp":54349175955,"id":3292,"parentId":3291,"tags":{},"startTime":1764726314419,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54349177398,"id":3294,"parentId":3291,"tags":{},"startTime":1764726314420,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1281,"timestamp":54349177410,"id":3295,"parentId":3291,"tags":{},"startTime":1764726314420,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":54349178706,"id":3296,"parentId":3291,"tags":{},"startTime":1764726314421,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":54349178718,"id":3297,"parentId":3291,"tags":{},"startTime":1764726314421,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1510,"timestamp":54349177394,"id":3293,"parentId":3291,"tags":{},"startTime":1764726314420,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":236,"timestamp":54349179419,"id":3298,"parentId":3291,"tags":{},"startTime":1764726314422,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":897,"timestamp":54349179660,"id":3299,"parentId":3291,"tags":{},"startTime":1764726314422,"traceId":"247574ce86dfd828"},{"name":"hash","duration":751,"timestamp":54349181006,"id":3300,"parentId":3291,"tags":{},"startTime":1764726314424,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":53,"timestamp":54349181757,"id":3301,"parentId":3291,"tags":{},"startTime":1764726314424,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":54349181805,"id":3302,"parentId":3291,"tags":{},"startTime":1764726314424,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2068,"timestamp":54349181832,"id":3303,"parentId":3291,"tags":{},"startTime":1764726314424,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9205,"timestamp":54349175759,"id":3291,"parentId":3261,"tags":{},"startTime":1764726314418,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":34934,"timestamp":54349151674,"id":3261,"parentId":3222,"tags":{"name":"server"},"startTime":1764726314394,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2036,"timestamp":54349186631,"id":3304,"parentId":3222,"tags":{},"startTime":1764726314429,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":144448,"timestamp":54349044595,"id":3222,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726314287,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":10374,"timestamp":54349199884,"id":3305,"tags":{"url":"/gunbuilder/suppressor?_rsc=g6kxx","isTurbopack":false},"startTime":1764726314443,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":54349210278,"id":3306,"parentId":3305,"tags":{"url":"/gunbuilder/suppressor?_rsc=g6kxx","memory.rss":"510672896","memory.heapUsed":"183953528","memory.heapTotal":"210632704"},"startTime":1764726314453,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13226,"timestamp":54419134157,"id":3318,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13328,"timestamp":54419134174,"id":3320,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15040,"timestamp":54419134051,"id":3311,"parentId":3310,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15398,"timestamp":54419134170,"id":3319,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16007,"timestamp":54419134135,"id":3313,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18817,"timestamp":54419134145,"id":3315,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18869,"timestamp":54419134150,"id":3316,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":2328,"timestamp":54419150705,"id":3326,"parentId":3325,"tags":{},"startTime":1764726384393,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":12245,"timestamp":54419145821,"id":3324,"parentId":3323,"tags":{},"startTime":1764726384388,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":12465,"timestamp":54419145606,"id":3323,"parentId":3322,"tags":{},"startTime":1764726384388,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":23155,"timestamp":54419145409,"id":3322,"parentId":3309,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764726384388,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":35931,"timestamp":54419134127,"id":3312,"parentId":3310,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":52783,"timestamp":54419153092,"id":3328,"parentId":3327,"tags":{},"startTime":1764726384396,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":53136,"timestamp":54419153070,"id":3327,"parentId":3325,"tags":{},"startTime":1764726384396,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4161,"timestamp":54419206253,"id":3329,"parentId":3325,"tags":{"astUsed":"true"},"startTime":1764726384449,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":62220,"timestamp":54419150557,"id":3325,"parentId":3321,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726384393,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":73901,"timestamp":54419145003,"id":3321,"parentId":3309,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726384387,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":51,"timestamp":54419219080,"id":3330,"parentId":3321,"tags":{},"startTime":1764726384462,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":85009,"timestamp":54419134138,"id":3314,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":89029,"timestamp":54419134154,"id":3317,"parentId":3310,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726384377,"traceId":"247574ce86dfd828"},{"name":"make","duration":89505,"timestamp":54419133692,"id":3310,"parentId":3309,"tags":{},"startTime":1764726384376,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":713,"timestamp":54419224114,"id":3332,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":54419224835,"id":3334,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":19,"timestamp":54419224844,"id":3335,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54419224872,"id":3336,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54419224880,"id":3337,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":307,"timestamp":54419224833,"id":3333,"parentId":3331,"tags":{},"startTime":1764726384467,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":202,"timestamp":54419225606,"id":3338,"parentId":3331,"tags":{},"startTime":1764726384468,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1819,"timestamp":54419225812,"id":3339,"parentId":3331,"tags":{},"startTime":1764726384468,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1574,"timestamp":54419228236,"id":3340,"parentId":3331,"tags":{},"startTime":1764726384471,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":74,"timestamp":54419229810,"id":3341,"parentId":3331,"tags":{},"startTime":1764726384472,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":27,"timestamp":54419229881,"id":3342,"parentId":3331,"tags":{},"startTime":1764726384472,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2656,"timestamp":54419229913,"id":3343,"parentId":3331,"tags":{},"startTime":1764726384472,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":50,"timestamp":54419232963,"id":3345,"parentId":3309,"tags":{},"startTime":1764726384475,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":90,"timestamp":54419232925,"id":3344,"parentId":3309,"tags":{},"startTime":1764726384475,"traceId":"247574ce86dfd828"},{"name":"seal","duration":16510,"timestamp":54419223873,"id":3331,"parentId":3309,"tags":{},"startTime":1764726384466,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":108885,"timestamp":54419131524,"id":3309,"parentId":3307,"tags":{"name":"client"},"startTime":1764726384374,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":118601,"timestamp":54419122815,"id":3307,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726384365,"traceId":"247574ce86dfd828"},{"name":"client-error","duration":0,"timestamp":54419243366,"id":3348,"parentId":3,"tags":{"errorCount":1},"startTime":1764726384486,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4312,"timestamp":54419244252,"id":3350,"parentId":3347,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726384487,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4316,"timestamp":54419244254,"id":3351,"parentId":3347,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726384487,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4320,"timestamp":54419244257,"id":3353,"parentId":3347,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726384487,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4653,"timestamp":54419244235,"id":3349,"parentId":3347,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726384487,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1191,"timestamp":54419248174,"id":3356,"parentId":3355,"tags":{},"startTime":1764726384491,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1292,"timestamp":54419248074,"id":3355,"parentId":3354,"tags":{},"startTime":1764726384491,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2265,"timestamp":54419247902,"id":3354,"parentId":3346,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764726384490,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6166,"timestamp":54419244256,"id":3352,"parentId":3347,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726384487,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2689,"timestamp":54419251776,"id":3374,"parentId":3373,"tags":{},"startTime":1764726384494,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2738,"timestamp":54419251729,"id":3373,"parentId":3372,"tags":{},"startTime":1764726384494,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7856,"timestamp":54419251653,"id":3372,"parentId":3346,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764726384494,"traceId":"247574ce86dfd828"},{"name":"make","duration":23908,"timestamp":54419242455,"id":3347,"parentId":3346,"tags":{},"startTime":1764726384485,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1411,"timestamp":54419267416,"id":3376,"parentId":3375,"tags":{},"startTime":1764726384510,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":54419268836,"id":3378,"parentId":3375,"tags":{},"startTime":1764726384511,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1431,"timestamp":54419268848,"id":3379,"parentId":3375,"tags":{},"startTime":1764726384511,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":54419270295,"id":3380,"parentId":3375,"tags":{},"startTime":1764726384513,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54419270308,"id":3381,"parentId":3375,"tags":{},"startTime":1764726384513,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1736,"timestamp":54419268832,"id":3377,"parentId":3375,"tags":{},"startTime":1764726384511,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":291,"timestamp":54419271089,"id":3382,"parentId":3375,"tags":{},"startTime":1764726384514,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1074,"timestamp":54419271386,"id":3383,"parentId":3375,"tags":{},"startTime":1764726384514,"traceId":"247574ce86dfd828"},{"name":"hash","duration":786,"timestamp":54419272966,"id":3384,"parentId":3375,"tags":{},"startTime":1764726384515,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":46,"timestamp":54419273752,"id":3385,"parentId":3375,"tags":{},"startTime":1764726384516,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":27,"timestamp":54419273792,"id":3386,"parentId":3375,"tags":{},"startTime":1764726384516,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2329,"timestamp":54419273822,"id":3387,"parentId":3375,"tags":{},"startTime":1764726384516,"traceId":"247574ce86dfd828"},{"name":"seal","duration":13088,"timestamp":54419267201,"id":3375,"parentId":3346,"tags":{},"startTime":1764726384510,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":40036,"timestamp":54419242304,"id":3346,"parentId":3308,"tags":{"name":"server"},"startTime":1764726384485,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":159793,"timestamp":54419123536,"id":3308,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726384366,"traceId":"247574ce86dfd828"}] +[{"name":"client-error","duration":7,"timestamp":54419296046,"id":3388,"parentId":3,"tags":{"errorCount":1},"startTime":1764726384539,"traceId":"247574ce86dfd828"},{"name":"client-error","duration":29,"timestamp":54451704634,"id":3391,"parentId":3,"tags":{"errorCount":1},"startTime":1764726416947,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12723,"timestamp":54451718372,"id":3395,"parentId":3393,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726416961,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12728,"timestamp":54451718382,"id":3396,"parentId":3393,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726416961,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12716,"timestamp":54451718399,"id":3397,"parentId":3393,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726416961,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12712,"timestamp":54451718409,"id":3398,"parentId":3393,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726416961,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14166,"timestamp":54451718280,"id":3394,"parentId":3393,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726416961,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":892,"timestamp":54451741156,"id":3416,"parentId":3415,"tags":{},"startTime":1764726416984,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1032,"timestamp":54451741021,"id":3415,"parentId":3414,"tags":{},"startTime":1764726416983,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2882,"timestamp":54451740825,"id":3414,"parentId":3392,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764726416983,"traceId":"247574ce86dfd828"},{"name":"make","duration":30081,"timestamp":54451713675,"id":3393,"parentId":3392,"tags":{},"startTime":1764726416956,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1876,"timestamp":54451744972,"id":3418,"parentId":3417,"tags":{},"startTime":1764726416987,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":54451746864,"id":3420,"parentId":3417,"tags":{},"startTime":1764726416989,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1260,"timestamp":54451746875,"id":3421,"parentId":3417,"tags":{},"startTime":1764726416989,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":54451748150,"id":3422,"parentId":3417,"tags":{},"startTime":1764726416991,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":54451748163,"id":3423,"parentId":3417,"tags":{},"startTime":1764726416991,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1532,"timestamp":54451746859,"id":3419,"parentId":3417,"tags":{},"startTime":1764726416989,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":201,"timestamp":54451748964,"id":3424,"parentId":3417,"tags":{},"startTime":1764726416991,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1543,"timestamp":54451749169,"id":3425,"parentId":3417,"tags":{},"startTime":1764726416992,"traceId":"247574ce86dfd828"},{"name":"hash","duration":721,"timestamp":54451751207,"id":3426,"parentId":3417,"tags":{},"startTime":1764726416994,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":73,"timestamp":54451751928,"id":3427,"parentId":3417,"tags":{},"startTime":1764726416994,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":42,"timestamp":54451751997,"id":3428,"parentId":3417,"tags":{},"startTime":1764726416994,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2893,"timestamp":54451752042,"id":3429,"parentId":3417,"tags":{},"startTime":1764726416994,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11300,"timestamp":54451744755,"id":3417,"parentId":3392,"tags":{},"startTime":1764726416987,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":44956,"timestamp":54451713137,"id":3392,"parentId":3389,"tags":{"name":"server"},"startTime":1764726416956,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2962,"timestamp":54451758125,"id":3430,"parentId":3389,"tags":{},"startTime":1764726417001,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":59740,"timestamp":54451701630,"id":3389,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726416944,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2340,"timestamp":54451767894,"id":3440,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2393,"timestamp":54451767898,"id":3442,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4794,"timestamp":54451767896,"id":3441,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4853,"timestamp":54451767844,"id":3433,"parentId":3432,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5231,"timestamp":54451767884,"id":3435,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5362,"timestamp":54451767887,"id":3436,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1305,"timestamp":54451773590,"id":3445,"parentId":3444,"tags":{},"startTime":1764726417016,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1371,"timestamp":54451773528,"id":3444,"parentId":3443,"tags":{},"startTime":1764726417016,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2930,"timestamp":54451773274,"id":3443,"parentId":3431,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764726417016,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8436,"timestamp":54451767893,"id":3439,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8455,"timestamp":54451767890,"id":3437,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8530,"timestamp":54451767881,"id":3434,"parentId":3432,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8522,"timestamp":54451767892,"id":3438,"parentId":3432,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726417010,"traceId":"247574ce86dfd828"},{"name":"make","duration":14191,"timestamp":54451762238,"id":3432,"parentId":3431,"tags":{},"startTime":1764726417005,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":698,"timestamp":54451777240,"id":3447,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":54451777945,"id":3449,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":13,"timestamp":54451777966,"id":3450,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":54451777985,"id":3451,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":54451777993,"id":3452,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":263,"timestamp":54451777943,"id":3448,"parentId":3446,"tags":{},"startTime":1764726417020,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":189,"timestamp":54451778730,"id":3453,"parentId":3446,"tags":{},"startTime":1764726417021,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":2020,"timestamp":54451778923,"id":3454,"parentId":3446,"tags":{},"startTime":1764726417021,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1697,"timestamp":54451781779,"id":3455,"parentId":3446,"tags":{},"startTime":1764726417024,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":71,"timestamp":54451783475,"id":3456,"parentId":3446,"tags":{},"startTime":1764726417026,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":54451783541,"id":3457,"parentId":3446,"tags":{},"startTime":1764726417026,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3027,"timestamp":54451783573,"id":3458,"parentId":3446,"tags":{},"startTime":1764726417026,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":62,"timestamp":54451787188,"id":3460,"parentId":3431,"tags":{},"startTime":1764726417030,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":105,"timestamp":54451787147,"id":3459,"parentId":3431,"tags":{},"startTime":1764726417030,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11342,"timestamp":54451777008,"id":3446,"parentId":3431,"tags":{},"startTime":1764726417019,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":26317,"timestamp":54451762051,"id":3431,"parentId":3390,"tags":{"name":"client"},"startTime":1764726417004,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3381,"timestamp":54451788381,"id":3461,"parentId":3390,"tags":{},"startTime":1764726417031,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":89523,"timestamp":54451702882,"id":3390,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726416945,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":18,"timestamp":54451795790,"id":3462,"parentId":3,"tags":{},"startTime":1764726417038,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25040,"timestamp":54451797141,"id":3463,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","isTurbopack":false},"startTime":1764726417040,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":54451822199,"id":3464,"parentId":3463,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","memory.rss":"497336320","memory.heapUsed":"174673592","memory.heapTotal":"201228288"},"startTime":1764726417065,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":129000,"timestamp":54451710087,"id":3465,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx","[project]/data/partRoleMappings.ts"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726417083,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13454,"timestamp":54453886353,"id":3477,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13670,"timestamp":54453886372,"id":3479,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15128,"timestamp":54453886156,"id":3470,"parentId":3469,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15812,"timestamp":54453886360,"id":3478,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16657,"timestamp":54453886306,"id":3472,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17043,"timestamp":54453886320,"id":3473,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2597,"timestamp":54453901122,"id":3482,"parentId":3481,"tags":{},"startTime":1764726419144,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2798,"timestamp":54453900925,"id":3481,"parentId":3480,"tags":{},"startTime":1764726419143,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":7299,"timestamp":54453900526,"id":3480,"parentId":3468,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764726419143,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22229,"timestamp":54453886346,"id":3476,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23178,"timestamp":54453886328,"id":3474,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23251,"timestamp":54453886338,"id":3475,"parentId":3469,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23617,"timestamp":54453886291,"id":3471,"parentId":3469,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726419129,"traceId":"247574ce86dfd828"},{"name":"make","duration":24507,"timestamp":54453885440,"id":3469,"parentId":3468,"tags":{},"startTime":1764726419128,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1561,"timestamp":54453911705,"id":3484,"parentId":3483,"tags":{},"startTime":1764726419154,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":10,"timestamp":54453913295,"id":3486,"parentId":3483,"tags":{},"startTime":1764726419156,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":45,"timestamp":54453913321,"id":3487,"parentId":3483,"tags":{},"startTime":1764726419156,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":10,"timestamp":54453913391,"id":3488,"parentId":3483,"tags":{},"startTime":1764726419156,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":54453913417,"id":3489,"parentId":3483,"tags":{},"startTime":1764726419156,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1178,"timestamp":54453913286,"id":3485,"parentId":3483,"tags":{},"startTime":1764726419156,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":750,"timestamp":54453915712,"id":3490,"parentId":3483,"tags":{},"startTime":1764726419158,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1209,"timestamp":54453916502,"id":3491,"parentId":3483,"tags":{},"startTime":1764726419159,"traceId":"247574ce86dfd828"},{"name":"hash","duration":3090,"timestamp":54453919389,"id":3492,"parentId":3483,"tags":{},"startTime":1764726419162,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":105,"timestamp":54453922478,"id":3493,"parentId":3483,"tags":{},"startTime":1764726419165,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":48,"timestamp":54453922573,"id":3494,"parentId":3483,"tags":{},"startTime":1764726419165,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1735,"timestamp":54453922625,"id":3495,"parentId":3483,"tags":{},"startTime":1764726419165,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":69,"timestamp":54453924589,"id":3497,"parentId":3468,"tags":{},"startTime":1764726419167,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":132,"timestamp":54453924530,"id":3496,"parentId":3468,"tags":{},"startTime":1764726419167,"traceId":"247574ce86dfd828"},{"name":"seal","duration":14418,"timestamp":54453911259,"id":3483,"parentId":3468,"tags":{},"startTime":1764726419154,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":41208,"timestamp":54453884487,"id":3468,"parentId":3466,"tags":{"name":"client"},"startTime":1764726419127,"traceId":"247574ce86dfd828"},{"name":"emit","duration":4726,"timestamp":54453925709,"id":3498,"parentId":3466,"tags":{},"startTime":1764726419168,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":54358,"timestamp":54453876577,"id":3466,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726419119,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":54453933267,"id":3501,"parentId":3,"tags":{},"startTime":1764726419176,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5070,"timestamp":54453934359,"id":3503,"parentId":3500,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726419177,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5077,"timestamp":54453934362,"id":3504,"parentId":3500,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726419177,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5078,"timestamp":54453934364,"id":3505,"parentId":3500,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726419177,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5079,"timestamp":54453934367,"id":3506,"parentId":3500,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726419177,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5482,"timestamp":54453934336,"id":3502,"parentId":3500,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726419177,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":977,"timestamp":54453942199,"id":3524,"parentId":3523,"tags":{},"startTime":1764726419185,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1055,"timestamp":54453942123,"id":3523,"parentId":3522,"tags":{},"startTime":1764726419185,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":1820,"timestamp":54453941968,"id":3522,"parentId":3499,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764726419184,"traceId":"247574ce86dfd828"},{"name":"make","duration":13245,"timestamp":54453932489,"id":3500,"parentId":3499,"tags":{},"startTime":1764726419175,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1660,"timestamp":54453946686,"id":3526,"parentId":3525,"tags":{},"startTime":1764726419189,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":54453948356,"id":3528,"parentId":3525,"tags":{},"startTime":1764726419191,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1523,"timestamp":54453948366,"id":3529,"parentId":3525,"tags":{},"startTime":1764726419191,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54453949899,"id":3530,"parentId":3525,"tags":{},"startTime":1764726419192,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54453949908,"id":3531,"parentId":3525,"tags":{},"startTime":1764726419192,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1782,"timestamp":54453948352,"id":3527,"parentId":3525,"tags":{},"startTime":1764726419191,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":173,"timestamp":54453950632,"id":3532,"parentId":3525,"tags":{},"startTime":1764726419193,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":423,"timestamp":54453950809,"id":3533,"parentId":3525,"tags":{},"startTime":1764726419193,"traceId":"247574ce86dfd828"},{"name":"hash","duration":759,"timestamp":54453951606,"id":3534,"parentId":3525,"tags":{},"startTime":1764726419194,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":36,"timestamp":54453952366,"id":3535,"parentId":3525,"tags":{},"startTime":1764726419195,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":23,"timestamp":54453952398,"id":3536,"parentId":3525,"tags":{},"startTime":1764726419195,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":58,"timestamp":54453952424,"id":3537,"parentId":3525,"tags":{},"startTime":1764726419195,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6812,"timestamp":54453946509,"id":3525,"parentId":3499,"tags":{},"startTime":1764726419189,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":23022,"timestamp":54453932203,"id":3499,"parentId":3467,"tags":{"name":"server"},"startTime":1764726419175,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1296,"timestamp":54453955237,"id":3538,"parentId":3467,"tags":{},"startTime":1764726419198,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":79880,"timestamp":54453876978,"id":3467,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726419119,"traceId":"247574ce86dfd828"}] +[{"name":"add-entry","duration":13938,"timestamp":54461375869,"id":3544,"parentId":3542,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726426618,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13956,"timestamp":54461375882,"id":3545,"parentId":3542,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726426618,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13964,"timestamp":54461375885,"id":3546,"parentId":3542,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726426618,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13970,"timestamp":54461375890,"id":3547,"parentId":3542,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726426618,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3876,"timestamp":54461388767,"id":3550,"parentId":3549,"tags":{},"startTime":1764726426631,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4086,"timestamp":54461388569,"id":3549,"parentId":3548,"tags":{},"startTime":1764726426631,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6831,"timestamp":54461388029,"id":3548,"parentId":3541,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764726426630,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":41266,"timestamp":54461375719,"id":3543,"parentId":3542,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726426618,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":4817,"timestamp":54461419640,"id":3568,"parentId":3567,"tags":{},"startTime":1764726426662,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4908,"timestamp":54461419553,"id":3567,"parentId":3566,"tags":{},"startTime":1764726426662,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":16297,"timestamp":54461419371,"id":3566,"parentId":3541,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764726426662,"traceId":"247574ce86dfd828"},{"name":"make","duration":71813,"timestamp":54461373031,"id":3542,"parentId":3541,"tags":{},"startTime":1764726426615,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1629,"timestamp":54461445901,"id":3570,"parentId":3569,"tags":{},"startTime":1764726426688,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54461447539,"id":3572,"parentId":3569,"tags":{},"startTime":1764726426690,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1169,"timestamp":54461447549,"id":3573,"parentId":3569,"tags":{},"startTime":1764726426690,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54461448726,"id":3574,"parentId":3569,"tags":{},"startTime":1764726426691,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":54461448738,"id":3575,"parentId":3569,"tags":{},"startTime":1764726426691,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1378,"timestamp":54461447536,"id":3571,"parentId":3569,"tags":{},"startTime":1764726426690,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":190,"timestamp":54461449327,"id":3576,"parentId":3569,"tags":{},"startTime":1764726426692,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":361,"timestamp":54461449521,"id":3577,"parentId":3569,"tags":{},"startTime":1764726426692,"traceId":"247574ce86dfd828"},{"name":"hash","duration":708,"timestamp":54461450285,"id":3578,"parentId":3569,"tags":{},"startTime":1764726426693,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":43,"timestamp":54461450993,"id":3579,"parentId":3569,"tags":{},"startTime":1764726426693,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":24,"timestamp":54461451032,"id":3580,"parentId":3569,"tags":{},"startTime":1764726426693,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":66,"timestamp":54461451059,"id":3581,"parentId":3569,"tags":{},"startTime":1764726426693,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6266,"timestamp":54461445721,"id":3569,"parentId":3541,"tags":{},"startTime":1764726426688,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":81125,"timestamp":54461372400,"id":3541,"parentId":3539,"tags":{"name":"server"},"startTime":1764726426615,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1312,"timestamp":54461453534,"id":3582,"parentId":3539,"tags":{},"startTime":1764726426696,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":92419,"timestamp":54461362645,"id":3539,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726426605,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2469,"timestamp":54461459673,"id":3592,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2514,"timestamp":54461459682,"id":3594,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2770,"timestamp":54461459642,"id":3585,"parentId":3584,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2999,"timestamp":54461459679,"id":3593,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3283,"timestamp":54461459666,"id":3587,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4288,"timestamp":54461459668,"id":3589,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":702,"timestamp":54461463266,"id":3600,"parentId":3599,"tags":{},"startTime":1764726426706,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7246,"timestamp":54461459663,"id":3586,"parentId":3584,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7240,"timestamp":54461459672,"id":3591,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5464,"timestamp":54461461571,"id":3598,"parentId":3597,"tags":{},"startTime":1764726426704,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5513,"timestamp":54461461522,"id":3597,"parentId":3596,"tags":{},"startTime":1764726426704,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":11625,"timestamp":54461461447,"id":3596,"parentId":3583,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764726426704,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":25952,"timestamp":54461463992,"id":3602,"parentId":3601,"tags":{},"startTime":1764726426706,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":26282,"timestamp":54461463985,"id":3601,"parentId":3599,"tags":{},"startTime":1764726426706,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3785,"timestamp":54461490283,"id":3603,"parentId":3599,"tags":{"astUsed":"true"},"startTime":1764726426733,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":32131,"timestamp":54461463139,"id":3599,"parentId":3595,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726426706,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":42900,"timestamp":54461460889,"id":3595,"parentId":3583,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726426703,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":45,"timestamp":54461506875,"id":3604,"parentId":3595,"tags":{},"startTime":1764726426749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":47786,"timestamp":54461459667,"id":3588,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":47977,"timestamp":54461459670,"id":3590,"parentId":3584,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726426702,"traceId":"247574ce86dfd828"},{"name":"make","duration":51877,"timestamp":54461455777,"id":3584,"parentId":3583,"tags":{},"startTime":1764726426698,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":646,"timestamp":54461508358,"id":3606,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54461509011,"id":3608,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":18,"timestamp":54461509018,"id":3609,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":54461509042,"id":3610,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":54461509051,"id":3611,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":319,"timestamp":54461509009,"id":3607,"parentId":3605,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":172,"timestamp":54461509709,"id":3612,"parentId":3605,"tags":{},"startTime":1764726426752,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":441,"timestamp":54461509885,"id":3613,"parentId":3605,"tags":{},"startTime":1764726426752,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1234,"timestamp":54461510807,"id":3614,"parentId":3605,"tags":{},"startTime":1764726426753,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":47,"timestamp":54461512040,"id":3615,"parentId":3605,"tags":{},"startTime":1764726426754,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":54461512085,"id":3616,"parentId":3605,"tags":{},"startTime":1764726426754,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":976,"timestamp":54461512111,"id":3617,"parentId":3605,"tags":{},"startTime":1764726426755,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":40,"timestamp":54461513375,"id":3619,"parentId":3583,"tags":{},"startTime":1764726426756,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":67,"timestamp":54461513349,"id":3618,"parentId":3583,"tags":{},"startTime":1764726426756,"traceId":"247574ce86dfd828"},{"name":"seal","duration":5860,"timestamp":54461508172,"id":3605,"parentId":3583,"tags":{},"startTime":1764726426751,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":58421,"timestamp":54461455625,"id":3583,"parentId":3540,"tags":{"name":"client"},"startTime":1764726426698,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2062,"timestamp":54461514053,"id":3620,"parentId":3540,"tags":{},"startTime":1764726426756,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":153682,"timestamp":54461362905,"id":3540,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726426605,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":3,"timestamp":54461519585,"id":3621,"parentId":3,"tags":{},"startTime":1764726426762,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":8244,"timestamp":54461521054,"id":3622,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","isTurbopack":false},"startTime":1764726426763,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":54461529316,"id":3623,"parentId":3622,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","memory.rss":"539475968","memory.heapUsed":"195070592","memory.heapTotal":"235470848"},"startTime":1764726426772,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":169000,"timestamp":54461363532,"id":3624,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726426776,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19085,"timestamp":54474346425,"id":3636,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19396,"timestamp":54474346434,"id":3638,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22293,"timestamp":54474346284,"id":3629,"parentId":3628,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23214,"timestamp":54474346428,"id":3637,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24387,"timestamp":54474346406,"id":3631,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":13526,"timestamp":54474362630,"id":3642,"parentId":3641,"tags":{},"startTime":1764726439605,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":13814,"timestamp":54474362350,"id":3641,"parentId":3640,"tags":{},"startTime":1764726439605,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":31846,"timestamp":54474362002,"id":3640,"parentId":3627,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764726439604,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":48036,"timestamp":54474346412,"id":3633,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":48245,"timestamp":54474346418,"id":3634,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":22784,"timestamp":54474371888,"id":3644,"parentId":3643,"tags":{},"startTime":1764726439614,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":52890,"timestamp":54474346391,"id":3630,"parentId":3628,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":23134,"timestamp":54474394701,"id":3646,"parentId":3645,"tags":{},"startTime":1764726439637,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":23509,"timestamp":54474394689,"id":3645,"parentId":3643,"tags":{},"startTime":1764726439637,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4076,"timestamp":54474418228,"id":3647,"parentId":3643,"tags":{"astUsed":"true"},"startTime":1764726439661,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":52083,"timestamp":54474371695,"id":3643,"parentId":3639,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726439614,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":64959,"timestamp":54474360950,"id":3639,"parentId":3627,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726439603,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":14,"timestamp":54474425985,"id":3648,"parentId":3639,"tags":{},"startTime":1764726439668,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":79604,"timestamp":54474346410,"id":3632,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":80283,"timestamp":54474346421,"id":3635,"parentId":3628,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726439589,"traceId":"247574ce86dfd828"},{"name":"make","duration":80997,"timestamp":54474345716,"id":3628,"parentId":3627,"tags":{},"startTime":1764726439588,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":678,"timestamp":54474427494,"id":3650,"parentId":3649,"tags":{},"startTime":1764726439670,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54474428179,"id":3652,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":19,"timestamp":54474428188,"id":3653,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54474428213,"id":3654,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54474428224,"id":3655,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":285,"timestamp":54474428177,"id":3651,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":638,"timestamp":54474428884,"id":3656,"parentId":3649,"tags":{},"startTime":1764726439671,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":419,"timestamp":54474429545,"id":3657,"parentId":3649,"tags":{},"startTime":1764726439672,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1392,"timestamp":54474430468,"id":3658,"parentId":3649,"tags":{},"startTime":1764726439673,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":55,"timestamp":54474431861,"id":3659,"parentId":3649,"tags":{},"startTime":1764726439674,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":54474431911,"id":3660,"parentId":3649,"tags":{},"startTime":1764726439674,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1067,"timestamp":54474431942,"id":3661,"parentId":3649,"tags":{},"startTime":1764726439674,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":47,"timestamp":54474433340,"id":3663,"parentId":3627,"tags":{},"startTime":1764726439676,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":78,"timestamp":54474433310,"id":3662,"parentId":3627,"tags":{},"startTime":1764726439676,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6823,"timestamp":54474427283,"id":3649,"parentId":3627,"tags":{},"startTime":1764726439670,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":91220,"timestamp":54474342899,"id":3627,"parentId":3625,"tags":{"name":"client"},"startTime":1764726439585,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2254,"timestamp":54474434130,"id":3664,"parentId":3625,"tags":{},"startTime":1764726439676,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":102639,"timestamp":54474334112,"id":3625,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726439576,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":0,"timestamp":54474438908,"id":3667,"parentId":3,"tags":{},"startTime":1764726439681,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3379,"timestamp":54474440436,"id":3669,"parentId":3666,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726439683,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3380,"timestamp":54474440440,"id":3671,"parentId":3666,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726439683,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3381,"timestamp":54474440441,"id":3672,"parentId":3666,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726439683,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1257,"timestamp":54474443486,"id":3675,"parentId":3674,"tags":{},"startTime":1764726439686,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1311,"timestamp":54474443434,"id":3674,"parentId":3673,"tags":{},"startTime":1764726439686,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2008,"timestamp":54474443295,"id":3673,"parentId":3665,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764726439686,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4897,"timestamp":54474440420,"id":3668,"parentId":3666,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726439683,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5151,"timestamp":54474440438,"id":3670,"parentId":3666,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726439683,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":112000,"timestamp":54474334284,"id":3694,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726439690,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2778,"timestamp":54474446784,"id":3693,"parentId":3692,"tags":{},"startTime":1764726439689,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2820,"timestamp":54474446744,"id":3692,"parentId":3691,"tags":{},"startTime":1764726439689,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":8327,"timestamp":54474446675,"id":3691,"parentId":3665,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764726439689,"traceId":"247574ce86dfd828"},{"name":"make","duration":18247,"timestamp":54474437919,"id":3666,"parentId":3665,"tags":{},"startTime":1764726439680,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1101,"timestamp":54474456896,"id":3696,"parentId":3695,"tags":{},"startTime":1764726439699,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":54474458003,"id":3698,"parentId":3695,"tags":{},"startTime":1764726439700,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":989,"timestamp":54474458010,"id":3699,"parentId":3695,"tags":{},"startTime":1764726439700,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":54474459004,"id":3700,"parentId":3695,"tags":{},"startTime":1764726439701,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":54474459011,"id":3701,"parentId":3695,"tags":{},"startTime":1764726439701,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1174,"timestamp":54474458001,"id":3697,"parentId":3695,"tags":{},"startTime":1764726439700,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":160,"timestamp":54474459551,"id":3702,"parentId":3695,"tags":{},"startTime":1764726439702,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":310,"timestamp":54474459714,"id":3703,"parentId":3695,"tags":{},"startTime":1764726439702,"traceId":"247574ce86dfd828"},{"name":"hash","duration":641,"timestamp":54474460395,"id":3704,"parentId":3695,"tags":{},"startTime":1764726439703,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":31,"timestamp":54474461036,"id":3705,"parentId":3695,"tags":{},"startTime":1764726439703,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":19,"timestamp":54474461064,"id":3706,"parentId":3695,"tags":{},"startTime":1764726439703,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":85,"timestamp":54474461085,"id":3707,"parentId":3695,"tags":{},"startTime":1764726439703,"traceId":"247574ce86dfd828"},{"name":"seal","duration":5471,"timestamp":54474456774,"id":3695,"parentId":3665,"tags":{},"startTime":1764726439699,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":25804,"timestamp":54474437758,"id":3665,"parentId":3626,"tags":{"name":"server"},"startTime":1764726439680,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1353,"timestamp":54474463571,"id":3708,"parentId":3626,"tags":{},"startTime":1764726439706,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":130615,"timestamp":54474334691,"id":3626,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764726439577,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":9361,"timestamp":54474470950,"id":3709,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","isTurbopack":false},"startTime":1764726439713,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":54474480339,"id":3710,"parentId":3709,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","memory.rss":"504823808","memory.heapUsed":"193023776","memory.heapTotal":"204963840"},"startTime":1764726439723,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16218,"timestamp":54615720083,"id":3722,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16390,"timestamp":54615720091,"id":3724,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19305,"timestamp":54615719953,"id":3715,"parentId":3714,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19994,"timestamp":54615720087,"id":3723,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":21014,"timestamp":54615720064,"id":3717,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":10683,"timestamp":54615734649,"id":3728,"parentId":3727,"tags":{},"startTime":1764726580977,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":10905,"timestamp":54615734437,"id":3727,"parentId":3726,"tags":{},"startTime":1764726580976,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":24802,"timestamp":54615734217,"id":3726,"parentId":3713,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764726580976,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":39628,"timestamp":54615720071,"id":3719,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":40187,"timestamp":54615720080,"id":3721,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":18333,"timestamp":54615741962,"id":3730,"parentId":3729,"tags":{},"startTime":1764726580984,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":46296,"timestamp":54615720056,"id":3716,"parentId":3714,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":43430,"timestamp":54615760336,"id":3732,"parentId":3731,"tags":{},"startTime":1764726581002,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":43734,"timestamp":54615760319,"id":3731,"parentId":3729,"tags":{},"startTime":1764726581002,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3825,"timestamp":54615804075,"id":3733,"parentId":3729,"tags":{"astUsed":"true"},"startTime":1764726581046,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":66972,"timestamp":54615741728,"id":3729,"parentId":3725,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726580984,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":80427,"timestamp":54615733555,"id":3725,"parentId":3713,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726580976,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":23,"timestamp":54615814105,"id":3734,"parentId":3725,"tags":{},"startTime":1764726581056,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":94102,"timestamp":54615720068,"id":3718,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":95115,"timestamp":54615720076,"id":3720,"parentId":3714,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726580962,"traceId":"247574ce86dfd828"},{"name":"make","duration":95758,"timestamp":54615719447,"id":3714,"parentId":3713,"tags":{},"startTime":1764726580961,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":606,"timestamp":54615816123,"id":3736,"parentId":3735,"tags":{},"startTime":1764726581058,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54615816735,"id":3738,"parentId":3735,"tags":{},"startTime":1764726581059,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":21,"timestamp":54615816742,"id":3739,"parentId":3735,"tags":{},"startTime":1764726581059,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":54615816769,"id":3740,"parentId":3735,"tags":{},"startTime":1764726581059,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54615816781,"id":3741,"parentId":3735,"tags":{},"startTime":1764726581059,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":298,"timestamp":54615816732,"id":3737,"parentId":3735,"tags":{},"startTime":1764726581059,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":178,"timestamp":54615817472,"id":3742,"parentId":3735,"tags":{},"startTime":1764726581060,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":894,"timestamp":54615817654,"id":3743,"parentId":3735,"tags":{},"startTime":1764726581060,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1248,"timestamp":54615819548,"id":3744,"parentId":3735,"tags":{},"startTime":1764726581062,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":78,"timestamp":54615820796,"id":3745,"parentId":3735,"tags":{},"startTime":1764726581063,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":35,"timestamp":54615820866,"id":3746,"parentId":3735,"tags":{},"startTime":1764726581063,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2565,"timestamp":54615820904,"id":3747,"parentId":3735,"tags":{},"startTime":1764726581063,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":66,"timestamp":54615823836,"id":3749,"parentId":3713,"tags":{},"startTime":1764726581066,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":116,"timestamp":54615823789,"id":3748,"parentId":3713,"tags":{},"startTime":1764726581066,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8758,"timestamp":54615815880,"id":3735,"parentId":3713,"tags":{},"startTime":1764726581058,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":106623,"timestamp":54615718030,"id":3713,"parentId":3711,"tags":{"name":"client"},"startTime":1764726580960,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3154,"timestamp":54615824663,"id":3750,"parentId":3711,"tags":{},"startTime":1764726581067,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":120814,"timestamp":54615707409,"id":3711,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726580949,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":54615829928,"id":3753,"parentId":3,"tags":{},"startTime":1764726581072,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4052,"timestamp":54615831450,"id":3756,"parentId":3752,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726581073,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4059,"timestamp":54615831452,"id":3757,"parentId":3752,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726581073,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4061,"timestamp":54615831453,"id":3758,"parentId":3752,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726581073,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4337,"timestamp":54615831425,"id":3754,"parentId":3752,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726581073,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1140,"timestamp":54615835175,"id":3761,"parentId":3760,"tags":{},"startTime":1764726581077,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1213,"timestamp":54615835104,"id":3760,"parentId":3759,"tags":{},"startTime":1764726581077,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":1775,"timestamp":54615834949,"id":3759,"parentId":3751,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764726581077,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5804,"timestamp":54615831448,"id":3755,"parentId":3752,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726581073,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2649,"timestamp":54615838652,"id":3779,"parentId":3778,"tags":{},"startTime":1764726581081,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2693,"timestamp":54615838610,"id":3778,"parentId":3777,"tags":{},"startTime":1764726581081,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6109,"timestamp":54615838547,"id":3777,"parentId":3751,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764726581081,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":141000,"timestamp":54615707790,"id":3780,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx","[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726581093,"traceId":"247574ce86dfd828"},{"name":"make","duration":21468,"timestamp":54615829366,"id":3752,"parentId":3751,"tags":{},"startTime":1764726581071,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1409,"timestamp":54615851891,"id":3782,"parentId":3781,"tags":{},"startTime":1764726581094,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54615853311,"id":3784,"parentId":3781,"tags":{},"startTime":1764726581095,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1303,"timestamp":54615853322,"id":3785,"parentId":3781,"tags":{},"startTime":1764726581095,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54615854638,"id":3786,"parentId":3781,"tags":{},"startTime":1764726581097,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54615854648,"id":3787,"parentId":3781,"tags":{},"startTime":1764726581097,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1531,"timestamp":54615853307,"id":3783,"parentId":3781,"tags":{},"startTime":1764726581095,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":347,"timestamp":54615855346,"id":3788,"parentId":3781,"tags":{},"startTime":1764726581097,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1019,"timestamp":54615855702,"id":3789,"parentId":3781,"tags":{},"startTime":1764726581098,"traceId":"247574ce86dfd828"},{"name":"hash","duration":589,"timestamp":54615857230,"id":3790,"parentId":3781,"tags":{},"startTime":1764726581099,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":71,"timestamp":54615857818,"id":3791,"parentId":3781,"tags":{},"startTime":1764726581100,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":42,"timestamp":54615857880,"id":3792,"parentId":3781,"tags":{},"startTime":1764726581100,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2070,"timestamp":54615857925,"id":3793,"parentId":3781,"tags":{},"startTime":1764726581100,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9513,"timestamp":54615851699,"id":3781,"parentId":3751,"tags":{},"startTime":1764726581094,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":33703,"timestamp":54615829210,"id":3751,"parentId":3712,"tags":{"name":"server"},"startTime":1764726581071,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1972,"timestamp":54615862933,"id":3794,"parentId":3712,"tags":{},"startTime":1764726581105,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":157341,"timestamp":54615708028,"id":3712,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726580950,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":11644,"timestamp":54615878259,"id":3795,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","isTurbopack":false},"startTime":1764726581120,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":54615889924,"id":3796,"parentId":3795,"tags":{"url":"/gunbuilder/suppressor?_rsc=5vhh5","memory.rss":"515227648","memory.heapUsed":"184860080","memory.heapTotal":"213614592"},"startTime":1764726581132,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13481,"timestamp":54678137643,"id":3807,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13545,"timestamp":54678137655,"id":3808,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13621,"timestamp":54678137692,"id":3810,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15071,"timestamp":54678137479,"id":3801,"parentId":3800,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726643379,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15619,"timestamp":54678137681,"id":3809,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16295,"timestamp":54678137612,"id":3803,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643379,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16620,"timestamp":54678137620,"id":3804,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2277,"timestamp":54678152413,"id":3813,"parentId":3812,"tags":{},"startTime":1764726643394,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2486,"timestamp":54678152209,"id":3812,"parentId":3811,"tags":{},"startTime":1764726643394,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":6494,"timestamp":54678151808,"id":3811,"parentId":3799,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764726643394,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22142,"timestamp":54678137627,"id":3805,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22185,"timestamp":54678137636,"id":3806,"parentId":3800,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726643380,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22461,"timestamp":54678137598,"id":3802,"parentId":3800,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726643379,"traceId":"247574ce86dfd828"},{"name":"make","duration":23164,"timestamp":54678136915,"id":3800,"parentId":3799,"tags":{},"startTime":1764726643379,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":613,"timestamp":54678192209,"id":3815,"parentId":3814,"tags":{},"startTime":1764726643434,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54678192833,"id":3817,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":20,"timestamp":54678192841,"id":3818,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54678192872,"id":3819,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":54678192882,"id":3820,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":239,"timestamp":54678192830,"id":3816,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":224,"timestamp":54678193495,"id":3821,"parentId":3814,"tags":{},"startTime":1764726643435,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":459,"timestamp":54678193723,"id":3822,"parentId":3814,"tags":{},"startTime":1764726643436,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1423,"timestamp":54678194824,"id":3823,"parentId":3814,"tags":{},"startTime":1764726643437,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":204,"timestamp":54678196247,"id":3824,"parentId":3814,"tags":{},"startTime":1764726643438,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":71,"timestamp":54678196434,"id":3825,"parentId":3814,"tags":{},"startTime":1764726643438,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1747,"timestamp":54678196508,"id":3826,"parentId":3814,"tags":{},"startTime":1764726643438,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":58,"timestamp":54678198805,"id":3828,"parentId":3799,"tags":{},"startTime":1764726643441,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":97,"timestamp":54678198769,"id":3827,"parentId":3799,"tags":{},"startTime":1764726643441,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7665,"timestamp":54678191981,"id":3814,"parentId":3799,"tags":{},"startTime":1764726643434,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":63594,"timestamp":54678136064,"id":3799,"parentId":3797,"tags":{"name":"client"},"startTime":1764726643378,"traceId":"247574ce86dfd828"},{"name":"emit","duration":4675,"timestamp":54678199670,"id":3829,"parentId":3797,"tags":{},"startTime":1764726643442,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":76723,"timestamp":54678128084,"id":3797,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726643370,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":54678206710,"id":3832,"parentId":3,"tags":{},"startTime":1764726643449,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3827,"timestamp":54678208216,"id":3834,"parentId":3831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726643450,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3830,"timestamp":54678208219,"id":3835,"parentId":3831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726643450,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3832,"timestamp":54678208220,"id":3836,"parentId":3831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726643450,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3833,"timestamp":54678208222,"id":3837,"parentId":3831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726643450,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4131,"timestamp":54678208178,"id":3833,"parentId":3831,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726643450,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1601,"timestamp":54678214040,"id":3855,"parentId":3854,"tags":{},"startTime":1764726643456,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1679,"timestamp":54678213965,"id":3854,"parentId":3853,"tags":{},"startTime":1764726643456,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2714,"timestamp":54678213822,"id":3853,"parentId":3830,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764726643456,"traceId":"247574ce86dfd828"},{"name":"make","duration":11799,"timestamp":54678206122,"id":3831,"parentId":3830,"tags":{},"startTime":1764726643448,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1579,"timestamp":54678223028,"id":3857,"parentId":3856,"tags":{},"startTime":1764726643465,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":54678224622,"id":3859,"parentId":3856,"tags":{},"startTime":1764726643467,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1492,"timestamp":54678224633,"id":3860,"parentId":3856,"tags":{},"startTime":1764726643467,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":54678226141,"id":3861,"parentId":3856,"tags":{},"startTime":1764726643468,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":54678226152,"id":3862,"parentId":3856,"tags":{},"startTime":1764726643468,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1743,"timestamp":54678224617,"id":3858,"parentId":3856,"tags":{},"startTime":1764726643466,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":229,"timestamp":54678226842,"id":3863,"parentId":3856,"tags":{},"startTime":1764726643469,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":722,"timestamp":54678227076,"id":3864,"parentId":3856,"tags":{},"startTime":1764726643469,"traceId":"247574ce86dfd828"},{"name":"hash","duration":796,"timestamp":54678228364,"id":3865,"parentId":3856,"tags":{},"startTime":1764726643470,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":57,"timestamp":54678229160,"id":3866,"parentId":3856,"tags":{},"startTime":1764726643471,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":54678229213,"id":3867,"parentId":3856,"tags":{},"startTime":1764726643471,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":563,"timestamp":54678229244,"id":3868,"parentId":3856,"tags":{},"startTime":1764726643471,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":99000,"timestamp":54678128504,"id":3869,"parentId":3,"tags":{"updatedModules":["[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/page.tsx","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/suppressor","isPageHidden":true},"startTime":1764726643472,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8265,"timestamp":54678222833,"id":3856,"parentId":3830,"tags":{},"startTime":1764726643465,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":26826,"timestamp":54678205923,"id":3830,"parentId":3798,"tags":{"name":"server"},"startTime":1764726643448,"traceId":"247574ce86dfd828"},{"name":"emit","duration":13905,"timestamp":54678232768,"id":3870,"parentId":3798,"tags":{},"startTime":1764726643475,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":118718,"timestamp":54678128403,"id":3798,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764726643370,"traceId":"247574ce86dfd828"}] +[{"name":"add-entry","duration":15185,"timestamp":55025419018,"id":3877,"parentId":3874,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726990660,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15203,"timestamp":55025419022,"id":3878,"parentId":3874,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726990660,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15208,"timestamp":55025419027,"id":3879,"parentId":3874,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726990660,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16916,"timestamp":55025418941,"id":3875,"parentId":3874,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726990660,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3777,"timestamp":55025433205,"id":3882,"parentId":3881,"tags":{},"startTime":1764726990674,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3948,"timestamp":55025433038,"id":3881,"parentId":3880,"tags":{},"startTime":1764726990674,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7577,"timestamp":55025432593,"id":3880,"parentId":3873,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764726990674,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":21812,"timestamp":55025419012,"id":3876,"parentId":3874,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764726990660,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":5287,"timestamp":55025444763,"id":3900,"parentId":3899,"tags":{},"startTime":1764726990686,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5377,"timestamp":55025444681,"id":3899,"parentId":3898,"tags":{},"startTime":1764726990686,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":18040,"timestamp":55025444550,"id":3898,"parentId":3873,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764726990686,"traceId":"247574ce86dfd828"},{"name":"make","duration":50023,"timestamp":55025415531,"id":3874,"parentId":3873,"tags":{},"startTime":1764726990657,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1480,"timestamp":55025491315,"id":3902,"parentId":3901,"tags":{},"startTime":1764726990732,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55025492812,"id":3904,"parentId":3901,"tags":{},"startTime":1764726990734,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1491,"timestamp":55025492828,"id":3905,"parentId":3901,"tags":{},"startTime":1764726990734,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":8,"timestamp":55025494363,"id":3906,"parentId":3901,"tags":{},"startTime":1764726990735,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55025494387,"id":3907,"parentId":3901,"tags":{},"startTime":1764726990735,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1892,"timestamp":55025492806,"id":3903,"parentId":3901,"tags":{},"startTime":1764726990734,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":304,"timestamp":55025495248,"id":3908,"parentId":3901,"tags":{},"startTime":1764726990736,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":405,"timestamp":55025495557,"id":3909,"parentId":3901,"tags":{},"startTime":1764726990737,"traceId":"247574ce86dfd828"},{"name":"hash","duration":736,"timestamp":55025496402,"id":3910,"parentId":3901,"tags":{},"startTime":1764726990737,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":49,"timestamp":55025497137,"id":3911,"parentId":3901,"tags":{},"startTime":1764726990738,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":55025497183,"id":3912,"parentId":3901,"tags":{},"startTime":1764726990738,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":59,"timestamp":55025497213,"id":3913,"parentId":3901,"tags":{},"startTime":1764726990738,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7473,"timestamp":55025491098,"id":3901,"parentId":3873,"tags":{},"startTime":1764726990732,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":84975,"timestamp":55025415242,"id":3873,"parentId":3871,"tags":{"name":"server"},"startTime":1764726990656,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1254,"timestamp":55025500233,"id":3914,"parentId":3871,"tags":{},"startTime":1764726990741,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":94965,"timestamp":55025406772,"id":3871,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726990648,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2984,"timestamp":55025507988,"id":3924,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3016,"timestamp":55025508004,"id":3926,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4327,"timestamp":55025507935,"id":3917,"parentId":3916,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4502,"timestamp":55025507989,"id":3925,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4742,"timestamp":55025507978,"id":3919,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5621,"timestamp":55025507985,"id":3921,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3344,"timestamp":55025510382,"id":3930,"parentId":3929,"tags":{},"startTime":1764726990751,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3424,"timestamp":55025510302,"id":3929,"parentId":3928,"tags":{},"startTime":1764726990751,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":10179,"timestamp":55025510227,"id":3928,"parentId":3915,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764726990751,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":7394,"timestamp":55025513028,"id":3932,"parentId":3931,"tags":{},"startTime":1764726990754,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16505,"timestamp":55025507975,"id":3918,"parentId":3916,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16500,"timestamp":55025507987,"id":3923,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":19968,"timestamp":55025520449,"id":3934,"parentId":3933,"tags":{},"startTime":1764726990762,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":20278,"timestamp":55025520442,"id":3933,"parentId":3931,"tags":{},"startTime":1764726990762,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3351,"timestamp":55025540755,"id":3935,"parentId":3931,"tags":{"astUsed":"true"},"startTime":1764726990782,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":32398,"timestamp":55025512895,"id":3931,"parentId":3927,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764726990754,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":37345,"timestamp":55025507986,"id":3922,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":38023,"timestamp":55025509601,"id":3927,"parentId":3915,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764726990751,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":35,"timestamp":55025547730,"id":3936,"parentId":3927,"tags":{},"startTime":1764726990789,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":39804,"timestamp":55025507980,"id":3920,"parentId":3916,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764726990749,"traceId":"247574ce86dfd828"},{"name":"make","duration":45099,"timestamp":55025502691,"id":3916,"parentId":3915,"tags":{},"startTime":1764726990744,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":720,"timestamp":55025553030,"id":3938,"parentId":3937,"tags":{},"startTime":1764726990794,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":9,"timestamp":55025553761,"id":3940,"parentId":3937,"tags":{},"startTime":1764726990795,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":23,"timestamp":55025553780,"id":3941,"parentId":3937,"tags":{},"startTime":1764726990795,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":55025553813,"id":3942,"parentId":3937,"tags":{},"startTime":1764726990795,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55025553830,"id":3943,"parentId":3937,"tags":{},"startTime":1764726990795,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":409,"timestamp":55025553757,"id":3939,"parentId":3937,"tags":{},"startTime":1764726990795,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":266,"timestamp":55025554663,"id":3944,"parentId":3937,"tags":{},"startTime":1764726990796,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":617,"timestamp":55025554935,"id":3945,"parentId":3937,"tags":{},"startTime":1764726990796,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1861,"timestamp":55025556190,"id":3946,"parentId":3937,"tags":{},"startTime":1764726990797,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":77,"timestamp":55025558050,"id":3947,"parentId":3937,"tags":{},"startTime":1764726990799,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":39,"timestamp":55025558122,"id":3948,"parentId":3937,"tags":{},"startTime":1764726990799,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1523,"timestamp":55025558165,"id":3949,"parentId":3937,"tags":{},"startTime":1764726990799,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":70,"timestamp":55025560143,"id":3951,"parentId":3915,"tags":{},"startTime":1764726990801,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":108,"timestamp":55025560106,"id":3950,"parentId":3915,"tags":{},"startTime":1764726990801,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8469,"timestamp":55025552769,"id":3937,"parentId":3915,"tags":{},"startTime":1764726990794,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":58784,"timestamp":55025502471,"id":3915,"parentId":3872,"tags":{"name":"client"},"startTime":1764726990744,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2676,"timestamp":55025561277,"id":3952,"parentId":3872,"tags":{},"startTime":1764726990802,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":157677,"timestamp":55025406850,"id":3872,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764726990648,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":11,"timestamp":55025566235,"id":3953,"parentId":3,"tags":{},"startTime":1764726990807,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":17644,"timestamp":55025576296,"id":3954,"tags":{"url":"/gunbuilder?_rsc=9gfev","isTurbopack":false},"startTime":1764726990817,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55025593960,"id":3955,"parentId":3954,"tags":{"url":"/gunbuilder?_rsc=9gfev","memory.rss":"536461312","memory.heapUsed":"182191592","memory.heapTotal":"217956352"},"startTime":1764726990835,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":194000,"timestamp":55025406823,"id":3956,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764726990842,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":55693,"timestamp":55107579297,"id":3957,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764727072820,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55107635013,"id":3958,"parentId":3957,"tags":{"url":"/gunbuilder","memory.rss":"530710528","memory.heapUsed":"172542696","memory.heapTotal":"184090624"},"startTime":1764727072876,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32213,"timestamp":55107662655,"id":3971,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32258,"timestamp":55107662657,"id":3972,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32328,"timestamp":55107662661,"id":3974,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32940,"timestamp":55107662589,"id":3965,"parentId":3964,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727072903,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33297,"timestamp":55107662659,"id":3973,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33769,"timestamp":55107662642,"id":3967,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33921,"timestamp":55107662647,"id":3968,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":38155,"timestamp":55107662649,"id":3969,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":38368,"timestamp":55107662653,"id":3970,"parentId":3964,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":38760,"timestamp":55107662637,"id":3966,"parentId":3964,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":39519,"timestamp":55107662667,"id":3975,"parentId":3964,"tags":{"request":"next-client-pages-loader?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!"},"startTime":1764727072904,"traceId":"247574ce86dfd828"},{"name":"make","duration":42612,"timestamp":55107659647,"id":3964,"parentId":3963,"tags":{},"startTime":1764727072901,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":719,"timestamp":55107716776,"id":3977,"parentId":3976,"tags":{},"startTime":1764727072958,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55107717508,"id":3979,"parentId":3976,"tags":{},"startTime":1764727072958,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":31,"timestamp":55107717582,"id":3980,"parentId":3976,"tags":{},"startTime":1764727072958,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":55107717647,"id":3981,"parentId":3976,"tags":{},"startTime":1764727072959,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55107717673,"id":3982,"parentId":3976,"tags":{},"startTime":1764727072959,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":438,"timestamp":55107717505,"id":3978,"parentId":3976,"tags":{},"startTime":1764727072958,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":173,"timestamp":55107718457,"id":3983,"parentId":3976,"tags":{},"startTime":1764727072959,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":390,"timestamp":55107718636,"id":3984,"parentId":3976,"tags":{},"startTime":1764727072960,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1403,"timestamp":55107719738,"id":3985,"parentId":3976,"tags":{},"startTime":1764727072961,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":61,"timestamp":55107721141,"id":3986,"parentId":3976,"tags":{},"startTime":1764727072962,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":55107721199,"id":3987,"parentId":3976,"tags":{},"startTime":1764727072962,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":768,"timestamp":55107721229,"id":3988,"parentId":3976,"tags":{},"startTime":1764727072962,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":72,"timestamp":55107722484,"id":3990,"parentId":3963,"tags":{},"startTime":1764727072963,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":102,"timestamp":55107722454,"id":3989,"parentId":3963,"tags":{},"startTime":1764727072963,"traceId":"247574ce86dfd828"},{"name":"seal","duration":20320,"timestamp":55107702966,"id":3976,"parentId":3963,"tags":{},"startTime":1764727072944,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":63849,"timestamp":55107659451,"id":3963,"parentId":3960,"tags":{"name":"client"},"startTime":1764727072900,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3584,"timestamp":55107723311,"id":3991,"parentId":3960,"tags":{},"startTime":1764727072964,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":68842,"timestamp":55107658400,"id":3960,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764727072899,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23839,"timestamp":55107729709,"id":3996,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23851,"timestamp":55107729711,"id":3997,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23854,"timestamp":55107729712,"id":3998,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23861,"timestamp":55107729714,"id":3999,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":24452,"timestamp":55107729707,"id":3995,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32478,"timestamp":55107729690,"id":3994,"parentId":3993,"tags":{"request":"next-app-loader?name=app%2F_not-found%2Fpage&page=%2F_not-found%2Fpage&appPaths=&pagePath=node_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727072971,"traceId":"247574ce86dfd828"},{"name":"make","duration":37612,"timestamp":55107728190,"id":3993,"parentId":3992,"tags":{},"startTime":1764727072969,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1869,"timestamp":55107767250,"id":4018,"parentId":4017,"tags":{},"startTime":1764727073008,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":4,"timestamp":55107769155,"id":4020,"parentId":4017,"tags":{},"startTime":1764727073010,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1800,"timestamp":55107769232,"id":4021,"parentId":4017,"tags":{},"startTime":1764727073010,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":7,"timestamp":55107771050,"id":4022,"parentId":4017,"tags":{},"startTime":1764727073012,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":55107771072,"id":4023,"parentId":4017,"tags":{},"startTime":1764727073012,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2150,"timestamp":55107769149,"id":4019,"parentId":4017,"tags":{},"startTime":1764727073010,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":239,"timestamp":55107771781,"id":4024,"parentId":4017,"tags":{},"startTime":1764727073013,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":460,"timestamp":55107772026,"id":4025,"parentId":4017,"tags":{},"startTime":1764727073013,"traceId":"247574ce86dfd828"},{"name":"hash","duration":619,"timestamp":55107773069,"id":4026,"parentId":4017,"tags":{},"startTime":1764727073014,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":57,"timestamp":55107773687,"id":4027,"parentId":4017,"tags":{},"startTime":1764727073015,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":55107773741,"id":4028,"parentId":4017,"tags":{},"startTime":1764727073015,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":215,"timestamp":55107773774,"id":4029,"parentId":4017,"tags":{},"startTime":1764727073015,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8363,"timestamp":55107767045,"id":4017,"parentId":3992,"tags":{},"startTime":1764727073008,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":49473,"timestamp":55107728052,"id":3992,"parentId":3962,"tags":{"name":"server"},"startTime":1764727072969,"traceId":"247574ce86dfd828"},{"name":"emit","duration":8044,"timestamp":55107777549,"id":4030,"parentId":3962,"tags":{},"startTime":1764727073018,"traceId":"247574ce86dfd828"},{"name":"compile-path","duration":127561,"timestamp":55107658504,"id":3961,"tags":{"trigger":"/_not-found","isTurbopack":false},"startTime":1764727072899,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":127716,"timestamp":55107658526,"id":3962,"parentId":3,"tags":{"trigger":"manual"},"startTime":1764727072899,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":5,"timestamp":55108061031,"id":4031,"parentId":3,"tags":{},"startTime":1764727073302,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":28014,"timestamp":55153579714,"id":4032,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764727118820,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55153607774,"id":4033,"parentId":4032,"tags":{"url":"/gunbuilder","memory.rss":"530415616","memory.heapUsed":"194140928","memory.heapTotal":"215908352"},"startTime":1764727118849,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":55153832660,"id":4034,"parentId":3,"tags":{},"startTime":1764727119073,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":21813,"timestamp":55154196104,"id":4035,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764727119437,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55154217966,"id":4036,"parentId":4035,"tags":{"url":"/gunbuilder","memory.rss":"530464768","memory.heapUsed":"197014536","memory.heapTotal":"219054080"},"startTime":1764727119459,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":55154448874,"id":4037,"parentId":3,"tags":{},"startTime":1764727119690,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":25543,"timestamp":55154906142,"id":4038,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764727120147,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55154931725,"id":4039,"parentId":4038,"tags":{"url":"/gunbuilder","memory.rss":"528973824","memory.heapUsed":"186440672","memory.heapTotal":"199983104"},"startTime":1764727120172,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":55155150175,"id":4040,"parentId":3,"tags":{},"startTime":1764727120391,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":22447,"timestamp":55169203156,"id":4041,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764727134444,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55169225678,"id":4042,"parentId":4041,"tags":{"url":"/gunbuilder","memory.rss":"530808832","memory.heapUsed":"171289616","memory.heapTotal":"190218240"},"startTime":1764727134466,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":3,"timestamp":55169419441,"id":4043,"parentId":3,"tags":{},"startTime":1764727134660,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":15095,"timestamp":55187655054,"id":4044,"tags":{"url":"/gunbuilder/optic?_rsc=1acsq","isTurbopack":false},"startTime":1764727152896,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55187670198,"id":4045,"parentId":4044,"tags":{"url":"/gunbuilder/optic?_rsc=1acsq","memory.rss":"524517376","memory.heapUsed":"174282160","memory.heapTotal":"192593920"},"startTime":1764727152911,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":6015,"timestamp":55187677298,"id":4046,"tags":{"url":"/gunbuilder/optic?_rsc=l6cyw","isTurbopack":false},"startTime":1764727152918,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55187683339,"id":4047,"parentId":4046,"tags":{"url":"/gunbuilder/optic?_rsc=l6cyw","memory.rss":"524517376","memory.heapUsed":"175228520","memory.heapTotal":"193380352"},"startTime":1764727152924,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15158,"timestamp":55281523979,"id":4053,"parentId":4051,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727246764,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15175,"timestamp":55281523988,"id":4054,"parentId":4051,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727246764,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15183,"timestamp":55281523992,"id":4055,"parentId":4051,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727246764,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15190,"timestamp":55281523995,"id":4056,"parentId":4051,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727246764,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16494,"timestamp":55281523907,"id":4052,"parentId":4051,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727246764,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2002,"timestamp":55281546634,"id":4074,"parentId":4073,"tags":{},"startTime":1764727246787,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2305,"timestamp":55281546337,"id":4073,"parentId":4072,"tags":{},"startTime":1764727246787,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":6264,"timestamp":55281545885,"id":4072,"parentId":4050,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764727246786,"traceId":"247574ce86dfd828"},{"name":"make","duration":33759,"timestamp":55281518973,"id":4051,"parentId":4050,"tags":{},"startTime":1764727246759,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1438,"timestamp":55281587805,"id":4076,"parentId":4075,"tags":{},"startTime":1764727246828,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":55281589262,"id":4078,"parentId":4075,"tags":{},"startTime":1764727246830,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1362,"timestamp":55281589275,"id":4079,"parentId":4075,"tags":{},"startTime":1764727246830,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":6,"timestamp":55281590703,"id":4080,"parentId":4075,"tags":{},"startTime":1764727246831,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":55281590745,"id":4081,"parentId":4075,"tags":{},"startTime":1764727246831,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1769,"timestamp":55281589258,"id":4077,"parentId":4075,"tags":{},"startTime":1764727246830,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":212,"timestamp":55281591506,"id":4082,"parentId":4075,"tags":{},"startTime":1764727246832,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":435,"timestamp":55281591722,"id":4083,"parentId":4075,"tags":{},"startTime":1764727246832,"traceId":"247574ce86dfd828"},{"name":"hash","duration":529,"timestamp":55281592612,"id":4084,"parentId":4075,"tags":{},"startTime":1764727246833,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":46,"timestamp":55281593141,"id":4085,"parentId":4075,"tags":{},"startTime":1764727246834,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":37,"timestamp":55281593184,"id":4086,"parentId":4075,"tags":{},"startTime":1764727246834,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":663,"timestamp":55281593223,"id":4087,"parentId":4075,"tags":{},"startTime":1764727246834,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7828,"timestamp":55281587514,"id":4075,"parentId":4050,"tags":{},"startTime":1764727246828,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":78151,"timestamp":55281518578,"id":4050,"parentId":4048,"tags":{"name":"server"},"startTime":1764727246759,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1711,"timestamp":55281596741,"id":4088,"parentId":4048,"tags":{},"startTime":1764727246837,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":90607,"timestamp":55281508079,"id":4048,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727246749,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2182,"timestamp":55281605305,"id":4097,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2212,"timestamp":55281605306,"id":4098,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2249,"timestamp":55281605312,"id":4100,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3706,"timestamp":55281605307,"id":4099,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3778,"timestamp":55281605241,"id":4091,"parentId":4090,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1274,"timestamp":55281607908,"id":4103,"parentId":4102,"tags":{},"startTime":1764727246848,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1354,"timestamp":55281607829,"id":4102,"parentId":4101,"tags":{},"startTime":1764727246848,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":3051,"timestamp":55281607689,"id":4101,"parentId":4089,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764727246848,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5597,"timestamp":55281605298,"id":4093,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5697,"timestamp":55281605302,"id":4094,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6372,"timestamp":55281605303,"id":4095,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6405,"timestamp":55281605294,"id":4092,"parentId":4090,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6396,"timestamp":55281605304,"id":4096,"parentId":4090,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727246846,"traceId":"247574ce86dfd828"},{"name":"make","duration":12208,"timestamp":55281599502,"id":4090,"parentId":4089,"tags":{},"startTime":1764727246840,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":700,"timestamp":55281633577,"id":4105,"parentId":4104,"tags":{},"startTime":1764727246874,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55281634288,"id":4107,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":16,"timestamp":55281634334,"id":4108,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":55281634360,"id":4109,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":55281634369,"id":4110,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":264,"timestamp":55281634285,"id":4106,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":185,"timestamp":55281634870,"id":4111,"parentId":4104,"tags":{},"startTime":1764727246875,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":364,"timestamp":55281635059,"id":4112,"parentId":4104,"tags":{},"startTime":1764727246876,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1161,"timestamp":55281636043,"id":4113,"parentId":4104,"tags":{},"startTime":1764727246876,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":47,"timestamp":55281637204,"id":4114,"parentId":4104,"tags":{},"startTime":1764727246878,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":28,"timestamp":55281637248,"id":4115,"parentId":4104,"tags":{},"startTime":1764727246878,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1132,"timestamp":55281637278,"id":4116,"parentId":4104,"tags":{},"startTime":1764727246878,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":65,"timestamp":55281638908,"id":4118,"parentId":4089,"tags":{},"startTime":1764727246879,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":92,"timestamp":55281638883,"id":4117,"parentId":4089,"tags":{},"startTime":1764727246879,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6302,"timestamp":55281633354,"id":4104,"parentId":4089,"tags":{},"startTime":1764727246874,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":40340,"timestamp":55281599329,"id":4089,"parentId":4049,"tags":{"name":"client"},"startTime":1764727246840,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2983,"timestamp":55281639675,"id":4119,"parentId":4049,"tags":{},"startTime":1764727246880,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":134903,"timestamp":55281508252,"id":4049,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727246749,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":1,"timestamp":55281643685,"id":4120,"parentId":3,"tags":{},"startTime":1764727246884,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":147000,"timestamp":55281508775,"id":4121,"parentId":3,"tags":{"updatedModules":["[project]/node_modules/next/dist/build/webpack/loaders/next-client-pages-loader.js?absolutePagePath=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-error.js&page=%2F_not-found%2Fpage!","[project]/node_modules/next/dist/client/components/not-found-error.js","[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/page.tsx","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727246896,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11203,"timestamp":55356127520,"id":4127,"parentId":4125,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727321368,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11218,"timestamp":55356127527,"id":4128,"parentId":4125,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727321368,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11222,"timestamp":55356127531,"id":4129,"parentId":4125,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727321368,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11223,"timestamp":55356127537,"id":4130,"parentId":4125,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727321368,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12282,"timestamp":55356127434,"id":4126,"parentId":4125,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727321368,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1796,"timestamp":55356143894,"id":4148,"parentId":4147,"tags":{},"startTime":1764727321384,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1973,"timestamp":55356143723,"id":4147,"parentId":4146,"tags":{},"startTime":1764727321384,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":4589,"timestamp":55356143450,"id":4146,"parentId":4124,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764727321384,"traceId":"247574ce86dfd828"},{"name":"make","duration":27214,"timestamp":55356122000,"id":4125,"parentId":4124,"tags":{},"startTime":1764727321362,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2517,"timestamp":55356157302,"id":4150,"parentId":4149,"tags":{},"startTime":1764727321398,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":5,"timestamp":55356159842,"id":4152,"parentId":4149,"tags":{},"startTime":1764727321400,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1913,"timestamp":55356159865,"id":4153,"parentId":4149,"tags":{},"startTime":1764727321400,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":9,"timestamp":55356161802,"id":4154,"parentId":4149,"tags":{},"startTime":1764727321402,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":55356161823,"id":4155,"parentId":4149,"tags":{},"startTime":1764727321402,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2341,"timestamp":55356159836,"id":4151,"parentId":4149,"tags":{},"startTime":1764727321400,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":438,"timestamp":55356162992,"id":4156,"parentId":4149,"tags":{},"startTime":1764727321403,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":794,"timestamp":55356163440,"id":4157,"parentId":4149,"tags":{},"startTime":1764727321404,"traceId":"247574ce86dfd828"},{"name":"hash","duration":949,"timestamp":55356165126,"id":4158,"parentId":4149,"tags":{},"startTime":1764727321405,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":90,"timestamp":55356166074,"id":4159,"parentId":4149,"tags":{},"startTime":1764727321406,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":42,"timestamp":55356166157,"id":4160,"parentId":4149,"tags":{},"startTime":1764727321406,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":919,"timestamp":55356166204,"id":4161,"parentId":4149,"tags":{},"startTime":1764727321406,"traceId":"247574ce86dfd828"},{"name":"seal","duration":11652,"timestamp":55356156942,"id":4149,"parentId":4124,"tags":{},"startTime":1764727321397,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":49444,"timestamp":55356121629,"id":4124,"parentId":4122,"tags":{"name":"server"},"startTime":1764727321362,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2828,"timestamp":55356171095,"id":4162,"parentId":4122,"tags":{},"startTime":1764727321411,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":60853,"timestamp":55356113419,"id":4122,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727321354,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7533,"timestamp":55356184255,"id":4171,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7605,"timestamp":55356184257,"id":4172,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":7664,"timestamp":55356184264,"id":4174,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8265,"timestamp":55356184260,"id":4173,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8331,"timestamp":55356184196,"id":4165,"parentId":4164,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727321424,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8458,"timestamp":55356184237,"id":4167,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8566,"timestamp":55356184242,"id":4168,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1103,"timestamp":55356192253,"id":4177,"parentId":4176,"tags":{},"startTime":1764727321433,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1161,"timestamp":55356192196,"id":4176,"parentId":4175,"tags":{},"startTime":1764727321432,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2538,"timestamp":55356192069,"id":4175,"parentId":4163,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764727321432,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10435,"timestamp":55356184250,"id":4169,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10559,"timestamp":55356184233,"id":4166,"parentId":4164,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10550,"timestamp":55356184253,"id":4170,"parentId":4164,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727321425,"traceId":"247574ce86dfd828"},{"name":"make","duration":19302,"timestamp":55356175521,"id":4164,"parentId":4163,"tags":{},"startTime":1764727321416,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":732,"timestamp":55356199725,"id":4179,"parentId":4178,"tags":{},"startTime":1764727321440,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55356200467,"id":4181,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":14,"timestamp":55356200477,"id":4182,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":55356200500,"id":4183,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55356200508,"id":4184,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":240,"timestamp":55356200464,"id":4180,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":235,"timestamp":55356201186,"id":4185,"parentId":4178,"tags":{},"startTime":1764727321441,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":472,"timestamp":55356201425,"id":4186,"parentId":4178,"tags":{},"startTime":1764727321442,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1168,"timestamp":55356202563,"id":4187,"parentId":4178,"tags":{},"startTime":1764727321443,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":55356203731,"id":4188,"parentId":4178,"tags":{},"startTime":1764727321444,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":55356203786,"id":4189,"parentId":4178,"tags":{},"startTime":1764727321444,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1288,"timestamp":55356203813,"id":4190,"parentId":4178,"tags":{},"startTime":1764727321444,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":48,"timestamp":55356205822,"id":4192,"parentId":4163,"tags":{},"startTime":1764727321446,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":102,"timestamp":55356205773,"id":4191,"parentId":4163,"tags":{},"startTime":1764727321446,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7582,"timestamp":55356199500,"id":4178,"parentId":4163,"tags":{},"startTime":1764727321440,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":31845,"timestamp":55356175262,"id":4163,"parentId":4123,"tags":{"name":"client"},"startTime":1764727321416,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2937,"timestamp":55356207118,"id":4193,"parentId":4123,"tags":{},"startTime":1764727321447,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":97014,"timestamp":55356113533,"id":4123,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727321354,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":55356211358,"id":4194,"parentId":3,"tags":{},"startTime":1764727321452,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":120000,"timestamp":55356113516,"id":4195,"parentId":3,"tags":{"updatedModules":["[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/page.tsx","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727321475,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12333,"timestamp":55359888819,"id":4206,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12450,"timestamp":55359888826,"id":4207,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12617,"timestamp":55359888842,"id":4209,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14287,"timestamp":55359888595,"id":4200,"parentId":4199,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15086,"timestamp":55359888834,"id":4208,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16053,"timestamp":55359888785,"id":4202,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16495,"timestamp":55359888794,"id":4203,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3017,"timestamp":55359902676,"id":4212,"parentId":4211,"tags":{},"startTime":1764727325143,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3244,"timestamp":55359902453,"id":4211,"parentId":4210,"tags":{},"startTime":1764727325143,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":7696,"timestamp":55359901939,"id":4210,"parentId":4198,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764727325142,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23142,"timestamp":55359888801,"id":4204,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23213,"timestamp":55359888811,"id":4205,"parentId":4199,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":23530,"timestamp":55359888768,"id":4201,"parentId":4199,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727325129,"traceId":"247574ce86dfd828"},{"name":"make","duration":24525,"timestamp":55359887809,"id":4199,"parentId":4198,"tags":{},"startTime":1764727325128,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2031,"timestamp":55359914814,"id":4214,"parentId":4213,"tags":{},"startTime":1764727325155,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":9,"timestamp":55359916881,"id":4216,"parentId":4213,"tags":{},"startTime":1764727325157,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":49,"timestamp":55359916912,"id":4217,"parentId":4213,"tags":{},"startTime":1764727325157,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":11,"timestamp":55359916990,"id":4218,"parentId":4213,"tags":{},"startTime":1764727325157,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":103,"timestamp":55359917020,"id":4219,"parentId":4213,"tags":{},"startTime":1764727325157,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":868,"timestamp":55359916870,"id":4215,"parentId":4213,"tags":{},"startTime":1764727325157,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":538,"timestamp":55359918704,"id":4220,"parentId":4213,"tags":{},"startTime":1764727325159,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1009,"timestamp":55359919253,"id":4221,"parentId":4213,"tags":{},"startTime":1764727325160,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2306,"timestamp":55359921572,"id":4222,"parentId":4213,"tags":{},"startTime":1764727325162,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":107,"timestamp":55359923878,"id":4223,"parentId":4213,"tags":{},"startTime":1764727325164,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":58,"timestamp":55359923976,"id":4224,"parentId":4213,"tags":{},"startTime":1764727325164,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2205,"timestamp":55359924038,"id":4225,"parentId":4213,"tags":{},"startTime":1764727325164,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":43,"timestamp":55359926774,"id":4227,"parentId":4198,"tags":{},"startTime":1764727325167,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":92,"timestamp":55359926728,"id":4226,"parentId":4198,"tags":{},"startTime":1764727325167,"traceId":"247574ce86dfd828"},{"name":"seal","duration":13659,"timestamp":55359914193,"id":4213,"parentId":4198,"tags":{},"startTime":1764727325154,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":40773,"timestamp":55359887099,"id":4198,"parentId":4196,"tags":{"name":"client"},"startTime":1764727325127,"traceId":"247574ce86dfd828"},{"name":"emit","duration":4669,"timestamp":55359927883,"id":4228,"parentId":4196,"tags":{},"startTime":1764727325168,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":54923,"timestamp":55359878097,"id":4196,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727325118,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":55359935220,"id":4231,"parentId":3,"tags":{},"startTime":1764727325175,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4949,"timestamp":55359937285,"id":4233,"parentId":4230,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727325178,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4953,"timestamp":55359937289,"id":4234,"parentId":4230,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727325178,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4953,"timestamp":55359937292,"id":4235,"parentId":4230,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727325178,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4954,"timestamp":55359937295,"id":4236,"parentId":4230,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727325178,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5764,"timestamp":55359937261,"id":4232,"parentId":4230,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727325178,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1870,"timestamp":55359945637,"id":4254,"parentId":4253,"tags":{},"startTime":1764727325186,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1946,"timestamp":55359945565,"id":4253,"parentId":4252,"tags":{},"startTime":1764727325186,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2804,"timestamp":55359945392,"id":4252,"parentId":4229,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764727325186,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":69000,"timestamp":55359878515,"id":4255,"parentId":3,"tags":{"updatedModules":["[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/page.tsx","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727325189,"traceId":"247574ce86dfd828"},{"name":"make","duration":14717,"timestamp":55359934577,"id":4230,"parentId":4229,"tags":{},"startTime":1764727325175,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1499,"timestamp":55359950241,"id":4257,"parentId":4256,"tags":{},"startTime":1764727325191,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":55359951748,"id":4259,"parentId":4256,"tags":{},"startTime":1764727325192,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1457,"timestamp":55359951757,"id":4260,"parentId":4256,"tags":{},"startTime":1764727325192,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":55359953222,"id":4261,"parentId":4256,"tags":{},"startTime":1764727325193,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55359953230,"id":4262,"parentId":4256,"tags":{},"startTime":1764727325193,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1685,"timestamp":55359951745,"id":4258,"parentId":4256,"tags":{},"startTime":1764727325192,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":194,"timestamp":55359953848,"id":4263,"parentId":4256,"tags":{},"startTime":1764727325194,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":396,"timestamp":55359954046,"id":4264,"parentId":4256,"tags":{},"startTime":1764727325194,"traceId":"247574ce86dfd828"},{"name":"hash","duration":579,"timestamp":55359954869,"id":4265,"parentId":4256,"tags":{},"startTime":1764727325195,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":43,"timestamp":55359955448,"id":4266,"parentId":4256,"tags":{},"startTime":1764727325196,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":22,"timestamp":55359955487,"id":4267,"parentId":4256,"tags":{},"startTime":1764727325196,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":574,"timestamp":55359955512,"id":4268,"parentId":4256,"tags":{},"startTime":1764727325196,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6929,"timestamp":55359950072,"id":4256,"parentId":4229,"tags":{},"startTime":1764727325190,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":24593,"timestamp":55359934371,"id":4229,"parentId":4197,"tags":{"name":"server"},"startTime":1764727325175,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1400,"timestamp":55359958976,"id":4269,"parentId":4197,"tags":{},"startTime":1764727325199,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":82016,"timestamp":55359878684,"id":4197,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727325119,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":68553,"timestamp":55363021064,"id":4270,"tags":{"url":"/gunbuilder/optic","isTurbopack":false},"startTime":1764727328261,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55363089645,"id":4271,"parentId":4270,"tags":{"url":"/gunbuilder/optic","memory.rss":"550977536","memory.heapUsed":"192609896","memory.heapTotal":"242581504"},"startTime":1764727328330,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":55363282606,"id":4272,"parentId":3,"tags":{},"startTime":1764727328523,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13068,"timestamp":55403630552,"id":4278,"parentId":4276,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727368871,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13080,"timestamp":55403630557,"id":4279,"parentId":4276,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727368871,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13083,"timestamp":55403630562,"id":4280,"parentId":4276,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727368871,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13085,"timestamp":55403630567,"id":4281,"parentId":4276,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727368871,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14073,"timestamp":55403630477,"id":4277,"parentId":4276,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727368871,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1734,"timestamp":55403648857,"id":4299,"parentId":4298,"tags":{},"startTime":1764727368889,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1902,"timestamp":55403648695,"id":4298,"parentId":4297,"tags":{},"startTime":1764727368889,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":4900,"timestamp":55403648386,"id":4297,"parentId":4275,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764727368889,"traceId":"247574ce86dfd828"},{"name":"make","duration":28423,"timestamp":55403625331,"id":4276,"parentId":4275,"tags":{},"startTime":1764727368865,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1332,"timestamp":55403654702,"id":4301,"parentId":4300,"tags":{},"startTime":1764727368895,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":55403656046,"id":4303,"parentId":4300,"tags":{},"startTime":1764727368896,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1750,"timestamp":55403656056,"id":4304,"parentId":4300,"tags":{},"startTime":1764727368896,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":9,"timestamp":55403657821,"id":4305,"parentId":4300,"tags":{},"startTime":1764727368898,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55403657837,"id":4306,"parentId":4300,"tags":{},"startTime":1764727368898,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2014,"timestamp":55403656041,"id":4302,"parentId":4300,"tags":{},"startTime":1764727368896,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":223,"timestamp":55403658434,"id":4307,"parentId":4300,"tags":{},"startTime":1764727368899,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":488,"timestamp":55403658664,"id":4308,"parentId":4300,"tags":{},"startTime":1764727368899,"traceId":"247574ce86dfd828"},{"name":"hash","duration":737,"timestamp":55403659620,"id":4309,"parentId":4300,"tags":{},"startTime":1764727368900,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":47,"timestamp":55403660357,"id":4310,"parentId":4300,"tags":{},"startTime":1764727368901,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":30,"timestamp":55403660400,"id":4311,"parentId":4300,"tags":{},"startTime":1764727368901,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":683,"timestamp":55403660432,"id":4312,"parentId":4300,"tags":{},"startTime":1764727368901,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7812,"timestamp":55403654519,"id":4300,"parentId":4275,"tags":{},"startTime":1764727368895,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":38856,"timestamp":55403624863,"id":4275,"parentId":4273,"tags":{"name":"server"},"startTime":1764727368865,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1578,"timestamp":55403663733,"id":4313,"parentId":4273,"tags":{},"startTime":1764727368904,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":49892,"timestamp":55403615648,"id":4273,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727368856,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1703,"timestamp":55403671279,"id":4322,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1727,"timestamp":55403671281,"id":4323,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1777,"timestamp":55403671283,"id":4325,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2425,"timestamp":55403671282,"id":4324,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2467,"timestamp":55403671245,"id":4316,"parentId":4315,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2713,"timestamp":55403671268,"id":4318,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2834,"timestamp":55403671274,"id":4319,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1345,"timestamp":55403673355,"id":4328,"parentId":4327,"tags":{},"startTime":1764727368914,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1411,"timestamp":55403673291,"id":4327,"parentId":4326,"tags":{},"startTime":1764727368913,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2838,"timestamp":55403673167,"id":4326,"parentId":4314,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764727368913,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5913,"timestamp":55403671277,"id":4320,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5966,"timestamp":55403671265,"id":4317,"parentId":4315,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5954,"timestamp":55403671278,"id":4321,"parentId":4315,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727368911,"traceId":"247574ce86dfd828"},{"name":"make","duration":10971,"timestamp":55403666272,"id":4315,"parentId":4314,"tags":{},"startTime":1764727368906,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":601,"timestamp":55403677992,"id":4330,"parentId":4329,"tags":{},"startTime":1764727368918,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":55403678600,"id":4332,"parentId":4329,"tags":{},"startTime":1764727368919,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":17,"timestamp":55403678607,"id":4333,"parentId":4329,"tags":{},"startTime":1764727368919,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":55403678634,"id":4334,"parentId":4329,"tags":{},"startTime":1764727368919,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":55403678640,"id":4335,"parentId":4329,"tags":{},"startTime":1764727368919,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":312,"timestamp":55403678598,"id":4331,"parentId":4329,"tags":{},"startTime":1764727368919,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":229,"timestamp":55403679350,"id":4336,"parentId":4329,"tags":{},"startTime":1764727368920,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":494,"timestamp":55403679583,"id":4337,"parentId":4329,"tags":{},"startTime":1764727368920,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1451,"timestamp":55403680634,"id":4338,"parentId":4329,"tags":{},"startTime":1764727368921,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":55403682084,"id":4339,"parentId":4329,"tags":{},"startTime":1764727368922,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":23,"timestamp":55403682140,"id":4340,"parentId":4329,"tags":{},"startTime":1764727368922,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1819,"timestamp":55403682165,"id":4341,"parentId":4329,"tags":{},"startTime":1764727368922,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":32,"timestamp":55403684334,"id":4343,"parentId":4314,"tags":{},"startTime":1764727368925,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":61,"timestamp":55403684307,"id":4342,"parentId":4314,"tags":{},"startTime":1764727368924,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7273,"timestamp":55403677804,"id":4329,"parentId":4314,"tags":{},"startTime":1764727368918,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":18970,"timestamp":55403666119,"id":4314,"parentId":4274,"tags":{"name":"client"},"startTime":1764727368906,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3133,"timestamp":55403685097,"id":4344,"parentId":4274,"tags":{},"startTime":1764727368925,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":72942,"timestamp":55403615794,"id":4274,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727368856,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":55403689679,"id":4345,"parentId":3,"tags":{},"startTime":1764727368930,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":180000,"timestamp":55403615735,"id":4346,"parentId":3,"tags":{"updatedModules":["[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727369037,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14173,"timestamp":55429738841,"id":4352,"parentId":4350,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727394979,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14195,"timestamp":55429738851,"id":4353,"parentId":4350,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727394979,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14206,"timestamp":55429738857,"id":4354,"parentId":4350,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727394979,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14207,"timestamp":55429738863,"id":4355,"parentId":4350,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727394979,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15513,"timestamp":55429738698,"id":4351,"parentId":4350,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727394979,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3118,"timestamp":55429759869,"id":4373,"parentId":4372,"tags":{},"startTime":1764727395000,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3306,"timestamp":55429759691,"id":4372,"parentId":4371,"tags":{},"startTime":1764727395000,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":5742,"timestamp":55429759250,"id":4371,"parentId":4349,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"ssr"},"startTime":1764727394999,"traceId":"247574ce86dfd828"},{"name":"make","duration":32375,"timestamp":55429734035,"id":4350,"parentId":4349,"tags":{},"startTime":1764727394974,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2781,"timestamp":55429768523,"id":4375,"parentId":4374,"tags":{},"startTime":1764727395009,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":5,"timestamp":55429771327,"id":4377,"parentId":4374,"tags":{},"startTime":1764727395011,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":2673,"timestamp":55429771347,"id":4378,"parentId":4374,"tags":{},"startTime":1764727395011,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":7,"timestamp":55429774039,"id":4379,"parentId":4374,"tags":{},"startTime":1764727395014,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":5,"timestamp":55429774057,"id":4380,"parentId":4374,"tags":{},"startTime":1764727395014,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":3229,"timestamp":55429771319,"id":4376,"parentId":4374,"tags":{},"startTime":1764727395011,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":347,"timestamp":55429775358,"id":4381,"parentId":4374,"tags":{},"startTime":1764727395015,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":663,"timestamp":55429775714,"id":4382,"parentId":4374,"tags":{},"startTime":1764727395016,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1171,"timestamp":55429777130,"id":4383,"parentId":4374,"tags":{},"startTime":1764727395017,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":59,"timestamp":55429778301,"id":4384,"parentId":4374,"tags":{},"startTime":1764727395018,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":31,"timestamp":55429778354,"id":4385,"parentId":4374,"tags":{},"startTime":1764727395018,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1310,"timestamp":55429778388,"id":4386,"parentId":4374,"tags":{},"startTime":1764727395018,"traceId":"247574ce86dfd828"},{"name":"seal","duration":13032,"timestamp":55429768135,"id":4374,"parentId":4349,"tags":{},"startTime":1764727395008,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":50334,"timestamp":55429733484,"id":4349,"parentId":4347,"tags":{"name":"server"},"startTime":1764727394974,"traceId":"247574ce86dfd828"},{"name":"emit","duration":3310,"timestamp":55429783843,"id":4387,"parentId":4347,"tags":{},"startTime":1764727395024,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":63720,"timestamp":55429723652,"id":4347,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727394964,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1854,"timestamp":55429793801,"id":4396,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1887,"timestamp":55429793802,"id":4397,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":1941,"timestamp":55429793806,"id":4399,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2609,"timestamp":55429793804,"id":4398,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2654,"timestamp":55429793764,"id":4390,"parentId":4389,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2890,"timestamp":55429793792,"id":4392,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3018,"timestamp":55429793795,"id":4393,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":948,"timestamp":55429796050,"id":4402,"parentId":4401,"tags":{},"startTime":1764727395036,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1013,"timestamp":55429795986,"id":4401,"parentId":4400,"tags":{},"startTime":1764727395036,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":2586,"timestamp":55429795853,"id":4400,"parentId":4388,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/partRoleMappings.ts","layer":"app-pages-browser"},"startTime":1764727395036,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5325,"timestamp":55429793797,"id":4394,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5365,"timestamp":55429793788,"id":4391,"parentId":4389,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5356,"timestamp":55429793799,"id":4395,"parentId":4389,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727395034,"traceId":"247574ce86dfd828"},{"name":"make","duration":10865,"timestamp":55429788298,"id":4389,"parentId":4388,"tags":{},"startTime":1764727395028,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":659,"timestamp":55429799853,"id":4404,"parentId":4403,"tags":{},"startTime":1764727395040,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":55429800518,"id":4406,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":14,"timestamp":55429800526,"id":4407,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":55429800547,"id":4408,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":55429800554,"id":4409,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":271,"timestamp":55429800516,"id":4405,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":221,"timestamp":55429801234,"id":4410,"parentId":4403,"tags":{},"startTime":1764727395041,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":388,"timestamp":55429801459,"id":4411,"parentId":4403,"tags":{},"startTime":1764727395042,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1528,"timestamp":55429803325,"id":4412,"parentId":4403,"tags":{},"startTime":1764727395043,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":58,"timestamp":55429804852,"id":4413,"parentId":4403,"tags":{},"startTime":1764727395045,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":55429804907,"id":4414,"parentId":4403,"tags":{},"startTime":1764727395045,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":814,"timestamp":55429804935,"id":4415,"parentId":4403,"tags":{},"startTime":1764727395045,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":36,"timestamp":55429805869,"id":4417,"parentId":4388,"tags":{},"startTime":1764727395046,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":66,"timestamp":55429805841,"id":4416,"parentId":4388,"tags":{},"startTime":1764727395046,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6798,"timestamp":55429799663,"id":4403,"parentId":4388,"tags":{},"startTime":1764727395040,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":18376,"timestamp":55429788097,"id":4388,"parentId":4348,"tags":{"name":"client"},"startTime":1764727395028,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1661,"timestamp":55429806482,"id":4418,"parentId":4348,"tags":{},"startTime":1764727395047,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":84705,"timestamp":55429723817,"id":4348,"parentId":3,"tags":{"trigger":"data/partRoleMappings.ts"},"startTime":1764727394964,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":1,"timestamp":55429809024,"id":4419,"parentId":3,"tags":{},"startTime":1764727395049,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":22557,"timestamp":55433325474,"id":4420,"tags":{"url":"/gunbuilder?_rsc=buioe","isTurbopack":false},"startTime":1764727398566,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55433348080,"id":4421,"parentId":4420,"tags":{"url":"/gunbuilder?_rsc=buioe","memory.rss":"509804544","memory.heapUsed":"193006128","memory.heapTotal":"208437248"},"startTime":1764727398588,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":21353,"timestamp":55433354812,"id":4422,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764727398595,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55433376229,"id":4423,"parentId":4422,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"509198336","memory.heapUsed":"186480976","memory.heapTotal":"210436096"},"startTime":1764727398616,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":31386,"timestamp":55437038300,"id":4424,"tags":{"url":"/gunbuilder/optic?_rsc=6b90i","isTurbopack":false},"startTime":1764727402278,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55437069735,"id":4425,"parentId":4424,"tags":{"url":"/gunbuilder/optic?_rsc=6b90i","memory.rss":"509673472","memory.heapUsed":"188300264","memory.heapTotal":"211025920"},"startTime":1764727402310,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12957,"timestamp":55512037890,"id":4431,"parentId":4429,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727477278,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12969,"timestamp":55512037901,"id":4432,"parentId":4429,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727477278,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12968,"timestamp":55512037911,"id":4433,"parentId":4429,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727477278,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12968,"timestamp":55512037919,"id":4434,"parentId":4429,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727477278,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14667,"timestamp":55512037770,"id":4430,"parentId":4429,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727477278,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3136,"timestamp":55512061013,"id":4452,"parentId":4451,"tags":{},"startTime":1764727477301,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3295,"timestamp":55512060862,"id":4451,"parentId":4450,"tags":{},"startTime":1764727477301,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":5750,"timestamp":55512060599,"id":4450,"parentId":4428,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"ssr"},"startTime":1764727477301,"traceId":"247574ce86dfd828"},{"name":"make","duration":36184,"timestamp":55512032966,"id":4429,"parentId":4428,"tags":{},"startTime":1764727477273,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":2513,"timestamp":55512080043,"id":4454,"parentId":4453,"tags":{},"startTime":1764727477320,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":4,"timestamp":55512082588,"id":4456,"parentId":4453,"tags":{},"startTime":1764727477322,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":2347,"timestamp":55512082613,"id":4457,"parentId":4453,"tags":{},"startTime":1764727477323,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":17,"timestamp":55512084996,"id":4458,"parentId":4453,"tags":{},"startTime":1764727477325,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":4,"timestamp":55512085027,"id":4459,"parentId":4453,"tags":{},"startTime":1764727477325,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":2788,"timestamp":55512082582,"id":4455,"parentId":4453,"tags":{},"startTime":1764727477322,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":463,"timestamp":55512086268,"id":4460,"parentId":4453,"tags":{},"startTime":1764727477326,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":20246,"timestamp":55512086740,"id":4461,"parentId":4453,"tags":{},"startTime":1764727477327,"traceId":"247574ce86dfd828"},{"name":"hash","duration":745,"timestamp":55512107510,"id":4462,"parentId":4453,"tags":{},"startTime":1764727477347,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":56,"timestamp":55512108255,"id":4463,"parentId":4453,"tags":{},"startTime":1764727477348,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":44,"timestamp":55512108305,"id":4464,"parentId":4453,"tags":{},"startTime":1764727477348,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":4502,"timestamp":55512108351,"id":4465,"parentId":4453,"tags":{},"startTime":1764727477348,"traceId":"247574ce86dfd828"},{"name":"seal","duration":34010,"timestamp":55512079718,"id":4453,"parentId":4428,"tags":{},"startTime":1764727477320,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":82785,"timestamp":55512032297,"id":4428,"parentId":4426,"tags":{"name":"server"},"startTime":1764727477272,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2407,"timestamp":55512115098,"id":4466,"parentId":4426,"tags":{},"startTime":1764727477355,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":96361,"timestamp":55512021360,"id":4426,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764727477261,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2366,"timestamp":55512122135,"id":4475,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2391,"timestamp":55512122136,"id":4476,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2430,"timestamp":55512122139,"id":4478,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2989,"timestamp":55512122137,"id":4477,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3038,"timestamp":55512122093,"id":4469,"parentId":4468,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3206,"timestamp":55512122129,"id":4471,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3323,"timestamp":55512122131,"id":4472,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1922,"timestamp":55512124840,"id":4481,"parentId":4480,"tags":{},"startTime":1764727477365,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1988,"timestamp":55512124776,"id":4480,"parentId":4479,"tags":{},"startTime":1764727477365,"traceId":"247574ce86dfd828"},{"name":"build-module-ts","duration":3677,"timestamp":55512124665,"id":4479,"parentId":4467,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/data/gunbuilderParts.ts","layer":"app-pages-browser"},"startTime":1764727477365,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6472,"timestamp":55512122133,"id":4473,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6505,"timestamp":55512122127,"id":4470,"parentId":4468,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6499,"timestamp":55512122134,"id":4474,"parentId":4468,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727477362,"traceId":"247574ce86dfd828"},{"name":"make","duration":10182,"timestamp":55512118462,"id":4468,"parentId":4467,"tags":{},"startTime":1764727477358,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":711,"timestamp":55512133741,"id":4483,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55512134461,"id":4485,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":16,"timestamp":55512134471,"id":4486,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":55512134494,"id":4487,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":55512134503,"id":4488,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":272,"timestamp":55512134458,"id":4484,"parentId":4482,"tags":{},"startTime":1764727477374,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":288,"timestamp":55512135185,"id":4489,"parentId":4482,"tags":{},"startTime":1764727477375,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":2344,"timestamp":55512135477,"id":4490,"parentId":4482,"tags":{},"startTime":1764727477375,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1847,"timestamp":55512138448,"id":4491,"parentId":4482,"tags":{},"startTime":1764727477378,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":66,"timestamp":55512140295,"id":4492,"parentId":4482,"tags":{},"startTime":1764727477380,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":55512140357,"id":4493,"parentId":4482,"tags":{},"startTime":1764727477380,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":7615,"timestamp":55512140384,"id":4494,"parentId":4482,"tags":{},"startTime":1764727477380,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":43,"timestamp":55512148516,"id":4496,"parentId":4467,"tags":{},"startTime":1764727477388,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":75,"timestamp":55512148487,"id":4495,"parentId":4467,"tags":{},"startTime":1764727477388,"traceId":"247574ce86dfd828"},{"name":"seal","duration":16024,"timestamp":55512133510,"id":4482,"parentId":4467,"tags":{},"startTime":1764727477373,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":31234,"timestamp":55512118313,"id":4467,"parentId":4427,"tags":{"name":"client"},"startTime":1764727477358,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7245,"timestamp":55512149555,"id":4497,"parentId":4427,"tags":{},"startTime":1764727477389,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":135741,"timestamp":55512021497,"id":4427,"parentId":3,"tags":{"trigger":"data/gunbuilderParts.ts"},"startTime":1764727477261,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":55512157915,"id":4498,"parentId":3,"tags":{},"startTime":1764727477398,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":148000,"timestamp":55512022102,"id":4499,"parentId":3,"tags":{"updatedModules":["[project]/data/gunbuilderParts.ts","[project]/app/gunbuilder/[categoryId]/page.tsx","[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727477410,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18953,"timestamp":55637954790,"id":4505,"parentId":4503,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727603197,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18985,"timestamp":55637954799,"id":4507,"parentId":4503,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727603197,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18995,"timestamp":55637954803,"id":4508,"parentId":4503,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727603197,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":4786,"timestamp":55637972556,"id":4511,"parentId":4510,"tags":{},"startTime":1764727603214,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":5028,"timestamp":55637972323,"id":4510,"parentId":4509,"tags":{},"startTime":1764727603214,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":9891,"timestamp":55637971679,"id":4509,"parentId":4502,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764727603213,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":28669,"timestamp":55637954681,"id":4504,"parentId":4503,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727603196,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":66407,"timestamp":55637954796,"id":4506,"parentId":4503,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727603197,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3080,"timestamp":55638023214,"id":4529,"parentId":4528,"tags":{},"startTime":1764727603265,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3257,"timestamp":55638023042,"id":4528,"parentId":4527,"tags":{},"startTime":1764727603265,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":13579,"timestamp":55638022903,"id":4527,"parentId":4502,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764727603265,"traceId":"247574ce86dfd828"},{"name":"make","duration":92654,"timestamp":55637950888,"id":4503,"parentId":4502,"tags":{},"startTime":1764727603193,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1103,"timestamp":55638044686,"id":4531,"parentId":4530,"tags":{},"startTime":1764727603286,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55638045798,"id":4533,"parentId":4530,"tags":{},"startTime":1764727603288,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":979,"timestamp":55638045832,"id":4534,"parentId":4530,"tags":{},"startTime":1764727603288,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":55638046831,"id":4535,"parentId":4530,"tags":{},"startTime":1764727603289,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55638046855,"id":4536,"parentId":4530,"tags":{},"startTime":1764727603289,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1232,"timestamp":55638045796,"id":4532,"parentId":4530,"tags":{},"startTime":1764727603288,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":165,"timestamp":55638047376,"id":4537,"parentId":4530,"tags":{},"startTime":1764727603289,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":715,"timestamp":55638047544,"id":4538,"parentId":4530,"tags":{},"startTime":1764727603289,"traceId":"247574ce86dfd828"},{"name":"hash","duration":665,"timestamp":55638048674,"id":4539,"parentId":4530,"tags":{},"startTime":1764727603290,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":47,"timestamp":55638049339,"id":4540,"parentId":4530,"tags":{},"startTime":1764727603291,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":22,"timestamp":55638049382,"id":4541,"parentId":4530,"tags":{},"startTime":1764727603291,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1791,"timestamp":55638049407,"id":4542,"parentId":4530,"tags":{},"startTime":1764727603291,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7937,"timestamp":55638044516,"id":4530,"parentId":4502,"tags":{},"startTime":1764727603286,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":104083,"timestamp":55637950122,"id":4502,"parentId":4500,"tags":{"name":"server"},"startTime":1764727603192,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2121,"timestamp":55638054234,"id":4543,"parentId":4500,"tags":{},"startTime":1764727603296,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":119380,"timestamp":55637937307,"id":4500,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764727603179,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2597,"timestamp":55638063536,"id":4553,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2642,"timestamp":55638063541,"id":4555,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2865,"timestamp":55638063494,"id":4546,"parentId":4545,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3080,"timestamp":55638063537,"id":4554,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3580,"timestamp":55638063527,"id":4548,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4849,"timestamp":55638063532,"id":4550,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4887,"timestamp":55638063524,"id":4547,"parentId":4545,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4882,"timestamp":55638063534,"id":4551,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":6507,"timestamp":55638065573,"id":4559,"parentId":4558,"tags":{},"startTime":1764727603307,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":6564,"timestamp":55638065519,"id":4558,"parentId":4557,"tags":{},"startTime":1764727603307,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":14058,"timestamp":55638065447,"id":4557,"parentId":4544,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764727603307,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33725,"timestamp":55638063535,"id":4552,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":283,"timestamp":55638098932,"id":4561,"parentId":4560,"tags":{},"startTime":1764727603341,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":21352,"timestamp":55638099249,"id":4563,"parentId":4562,"tags":{},"startTime":1764727603341,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":21728,"timestamp":55638099241,"id":4562,"parentId":4560,"tags":{},"startTime":1764727603341,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4348,"timestamp":55638121001,"id":4564,"parentId":4560,"tags":{"astUsed":"true"},"startTime":1764727603363,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":27339,"timestamp":55638098744,"id":4560,"parentId":4556,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727603340,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":68327,"timestamp":55638064838,"id":4556,"parentId":4544,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727603307,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":34,"timestamp":55638133269,"id":4565,"parentId":4556,"tags":{},"startTime":1764727603375,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":69785,"timestamp":55638063529,"id":4549,"parentId":4545,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727603305,"traceId":"247574ce86dfd828"},{"name":"make","duration":75777,"timestamp":55638057546,"id":4545,"parentId":4544,"tags":{},"startTime":1764727603299,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":658,"timestamp":55638134187,"id":4567,"parentId":4566,"tags":{},"startTime":1764727603376,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":55638134852,"id":4569,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":21,"timestamp":55638134890,"id":4570,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":55638134918,"id":4571,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":55638134929,"id":4572,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":323,"timestamp":55638134850,"id":4568,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":185,"timestamp":55638135545,"id":4573,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1000,"timestamp":55638135734,"id":4574,"parentId":4566,"tags":{},"startTime":1764727603377,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1353,"timestamp":55638137151,"id":4575,"parentId":4566,"tags":{},"startTime":1764727603379,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":52,"timestamp":55638138504,"id":4576,"parentId":4566,"tags":{},"startTime":1764727603380,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":23,"timestamp":55638138554,"id":4577,"parentId":4566,"tags":{},"startTime":1764727603380,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2757,"timestamp":55638138579,"id":4578,"parentId":4566,"tags":{},"startTime":1764727603380,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":57,"timestamp":55638141881,"id":4580,"parentId":4544,"tags":{},"startTime":1764727603384,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":121,"timestamp":55638141820,"id":4579,"parentId":4544,"tags":{},"startTime":1764727603384,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8699,"timestamp":55638133968,"id":4566,"parentId":4544,"tags":{},"startTime":1764727603376,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":85291,"timestamp":55638057388,"id":4544,"parentId":4501,"tags":{"name":"client"},"startTime":1764727603299,"traceId":"247574ce86dfd828"},{"name":"emit","duration":4105,"timestamp":55638142686,"id":4581,"parentId":4501,"tags":{},"startTime":1764727603384,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":209604,"timestamp":55637937871,"id":4501,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764727603180,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":1,"timestamp":55638151174,"id":4582,"parentId":3,"tags":{},"startTime":1764727603393,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":17495,"timestamp":55638152520,"id":4583,"tags":{"url":"/gunbuilder/optic?_rsc=jr437","isTurbopack":false},"startTime":1764727603394,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55638170032,"id":4584,"parentId":4583,"tags":{"url":"/gunbuilder/optic?_rsc=jr437","memory.rss":"542769152","memory.heapUsed":"198943432","memory.heapTotal":"223576064"},"startTime":1764727603412,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":238000,"timestamp":55637939446,"id":4585,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727603419,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16247,"timestamp":55806950286,"id":4597,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":16345,"timestamp":55806950332,"id":4599,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18087,"timestamp":55806950112,"id":4590,"parentId":4589,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":18622,"timestamp":55806950294,"id":4598,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19418,"timestamp":55806950246,"id":4592,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":9461,"timestamp":55806964991,"id":4603,"parentId":4602,"tags":{},"startTime":1764727772207,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":9763,"timestamp":55806964695,"id":4602,"parentId":4601,"tags":{},"startTime":1764727772206,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":28956,"timestamp":55806964474,"id":4601,"parentId":4588,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"app-pages-browser"},"startTime":1764727772206,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":43754,"timestamp":55806950262,"id":4594,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":44202,"timestamp":55806950272,"id":4595,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":23914,"timestamp":55806970589,"id":4605,"parentId":4604,"tags":{},"startTime":1764727772212,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":52208,"timestamp":55806950232,"id":4591,"parentId":4589,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":48589,"timestamp":55806994565,"id":4607,"parentId":4606,"tags":{},"startTime":1764727772236,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":48915,"timestamp":55806994547,"id":4606,"parentId":4604,"tags":{},"startTime":1764727772236,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3643,"timestamp":55807043500,"id":4608,"parentId":4604,"tags":{"astUsed":"true"},"startTime":1764727772285,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":78659,"timestamp":55806970282,"id":4604,"parentId":4600,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727772212,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":92561,"timestamp":55806962708,"id":4600,"parentId":4588,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727772204,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":41,"timestamp":55807055703,"id":4609,"parentId":4600,"tags":{},"startTime":1764727772297,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":105526,"timestamp":55806950255,"id":4593,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":110382,"timestamp":55806950279,"id":4596,"parentId":4589,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727772192,"traceId":"247574ce86dfd828"},{"name":"make","duration":111132,"timestamp":55806949544,"id":4589,"parentId":4588,"tags":{},"startTime":1764727772191,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":864,"timestamp":55807061828,"id":4611,"parentId":4610,"tags":{},"startTime":1764727772304,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":8,"timestamp":55807062702,"id":4613,"parentId":4610,"tags":{},"startTime":1764727772304,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":35,"timestamp":55807062741,"id":4614,"parentId":4610,"tags":{},"startTime":1764727772304,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":55807062796,"id":4615,"parentId":4610,"tags":{},"startTime":1764727772305,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":55807062822,"id":4616,"parentId":4610,"tags":{},"startTime":1764727772305,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":429,"timestamp":55807062698,"id":4612,"parentId":4610,"tags":{},"startTime":1764727772304,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":284,"timestamp":55807063704,"id":4617,"parentId":4610,"tags":{},"startTime":1764727772305,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":1241,"timestamp":55807064001,"id":4618,"parentId":4610,"tags":{},"startTime":1764727772306,"traceId":"247574ce86dfd828"},{"name":"hash","duration":2164,"timestamp":55807065869,"id":4619,"parentId":4610,"tags":{},"startTime":1764727772308,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":93,"timestamp":55807068033,"id":4620,"parentId":4610,"tags":{},"startTime":1764727772310,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":35,"timestamp":55807068117,"id":4621,"parentId":4610,"tags":{},"startTime":1764727772310,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":3636,"timestamp":55807068156,"id":4622,"parentId":4610,"tags":{},"startTime":1764727772310,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":93,"timestamp":55807072531,"id":4624,"parentId":4588,"tags":{},"startTime":1764727772314,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":129,"timestamp":55807072500,"id":4623,"parentId":4588,"tags":{},"startTime":1764727772314,"traceId":"247574ce86dfd828"},{"name":"seal","duration":12220,"timestamp":55807061522,"id":4610,"parentId":4588,"tags":{},"startTime":1764727772303,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":124785,"timestamp":55806948972,"id":4588,"parentId":4586,"tags":{"name":"client"},"startTime":1764727772191,"traceId":"247574ce86dfd828"},{"name":"emit","duration":7788,"timestamp":55807073766,"id":4625,"parentId":4586,"tags":{},"startTime":1764727772316,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":141725,"timestamp":55806940279,"id":4586,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764727772182,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":55807083471,"id":4628,"parentId":3,"tags":{},"startTime":1764727772325,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3872,"timestamp":55807084947,"id":4631,"parentId":4627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727772327,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3880,"timestamp":55807084949,"id":4632,"parentId":4627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727772327,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3881,"timestamp":55807084950,"id":4633,"parentId":4627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727772327,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4525,"timestamp":55807084916,"id":4629,"parentId":4627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727772327,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1420,"timestamp":55807088336,"id":4636,"parentId":4635,"tags":{},"startTime":1764727772330,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1511,"timestamp":55807088247,"id":4635,"parentId":4634,"tags":{},"startTime":1764727772330,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2729,"timestamp":55807088070,"id":4634,"parentId":4626,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"rsc"},"startTime":1764727772330,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":6158,"timestamp":55807084945,"id":4630,"parentId":4627,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727772327,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3378,"timestamp":55807092681,"id":4654,"parentId":4653,"tags":{},"startTime":1764727772334,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3431,"timestamp":55807092630,"id":4653,"parentId":4652,"tags":{},"startTime":1764727772334,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":9040,"timestamp":55807092543,"id":4652,"parentId":4626,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/[categoryId]/page.tsx","layer":"ssr"},"startTime":1764727772334,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":157000,"timestamp":55806940057,"id":4655,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/[categoryId]/page.tsx","[project]/data/partRoleMappings.ts","[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder/optic","isPageHidden":true},"startTime":1764727772344,"traceId":"247574ce86dfd828"},{"name":"make","duration":42705,"timestamp":55807082914,"id":4627,"parentId":4626,"tags":{},"startTime":1764727772325,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1274,"timestamp":55807126684,"id":4657,"parentId":4656,"tags":{},"startTime":1764727772368,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55807127973,"id":4659,"parentId":4656,"tags":{},"startTime":1764727772370,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1240,"timestamp":55807128023,"id":4660,"parentId":4656,"tags":{},"startTime":1764727772370,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":55807129274,"id":4661,"parentId":4656,"tags":{},"startTime":1764727772371,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55807129286,"id":4662,"parentId":4656,"tags":{},"startTime":1764727772371,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1489,"timestamp":55807127970,"id":4658,"parentId":4656,"tags":{},"startTime":1764727772370,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":183,"timestamp":55807129813,"id":4663,"parentId":4656,"tags":{},"startTime":1764727772372,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":674,"timestamp":55807130001,"id":4664,"parentId":4656,"tags":{},"startTime":1764727772372,"traceId":"247574ce86dfd828"},{"name":"hash","duration":620,"timestamp":55807131086,"id":4665,"parentId":4656,"tags":{},"startTime":1764727772373,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":34,"timestamp":55807131707,"id":4666,"parentId":4656,"tags":{},"startTime":1764727772373,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":18,"timestamp":55807131738,"id":4667,"parentId":4656,"tags":{},"startTime":1764727772373,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1705,"timestamp":55807131757,"id":4668,"parentId":4656,"tags":{},"startTime":1764727772374,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7725,"timestamp":55807126515,"id":4656,"parentId":4626,"tags":{},"startTime":1764727772368,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":52770,"timestamp":55807082779,"id":4626,"parentId":4587,"tags":{"name":"server"},"startTime":1764727772325,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1842,"timestamp":55807135561,"id":4669,"parentId":4587,"tags":{},"startTime":1764727772377,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":197337,"timestamp":55806940500,"id":4587,"parentId":3,"tags":{"trigger":"app/gunbuilder/[categoryId]/page.tsx"},"startTime":1764727772182,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":16599,"timestamp":55807143405,"id":4670,"tags":{"url":"/gunbuilder/optic?_rsc=1v7kh","isTurbopack":false},"startTime":1764727772385,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55807160025,"id":4671,"parentId":4670,"tags":{"url":"/gunbuilder/optic?_rsc=1v7kh","memory.rss":"532234240","memory.heapUsed":"189700200","memory.heapTotal":"213106688"},"startTime":1764727772402,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":59343,"timestamp":55814190907,"id":4672,"tags":{"url":"/gunbuilder/optic","isTurbopack":false},"startTime":1764727779433,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55814250280,"id":4673,"parentId":4672,"tags":{"url":"/gunbuilder/optic","memory.rss":"531890176","memory.heapUsed":"187228336","memory.heapTotal":"212746240"},"startTime":1764727779492,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":4,"timestamp":55814448615,"id":4674,"parentId":3,"tags":{},"startTime":1764727779690,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":22376,"timestamp":55817078114,"id":4675,"tags":{"url":"/gunbuilder?_rsc=buioe","isTurbopack":false},"startTime":1764727782320,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55817100579,"id":4676,"parentId":4675,"tags":{"url":"/gunbuilder?_rsc=buioe","memory.rss":"523452416","memory.heapUsed":"189756368","memory.heapTotal":"213090304"},"startTime":1764727782342,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11951,"timestamp":55817107779,"id":4677,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764727782350,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55817119960,"id":4678,"parentId":4677,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"523452416","memory.heapUsed":"190482560","memory.heapTotal":"213090304"},"startTime":1764727782362,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":12576,"timestamp":55818335745,"id":4679,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1jn8g","isTurbopack":false},"startTime":1764727783577,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55818348395,"id":4680,"parentId":4679,"tags":{"url":"/gunbuilder/lowerParts?_rsc=1jn8g","memory.rss":"523452416","memory.heapUsed":"191493280","memory.heapTotal":"213090304"},"startTime":1764727783590,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9892,"timestamp":55818351971,"id":4681,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","isTurbopack":false},"startTime":1764727783594,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55818361992,"id":4682,"parentId":4681,"tags":{"url":"/gunbuilder/lowerParts?_rsc=7ylfy","memory.rss":"523468800","memory.heapUsed":"192426120","memory.heapTotal":"213090304"},"startTime":1764727783604,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13246,"timestamp":55827733999,"id":4683,"tags":{"url":"/gunbuilder/lower?_rsc=1jn8g","isTurbopack":false},"startTime":1764727792976,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55827747324,"id":4684,"parentId":4683,"tags":{"url":"/gunbuilder/lower?_rsc=1jn8g","memory.rss":"514965504","memory.heapUsed":"193359560","memory.heapTotal":"214138880"},"startTime":1764727792989,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":9067,"timestamp":55827750657,"id":4685,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","isTurbopack":false},"startTime":1764727792992,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55827759836,"id":4686,"parentId":4685,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","memory.rss":"515866624","memory.heapUsed":"194272600","memory.heapTotal":"214925312"},"startTime":1764727793002,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13660,"timestamp":55831628397,"id":4687,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","isTurbopack":false},"startTime":1764727796870,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":55831642133,"id":4688,"parentId":4687,"tags":{"url":"/gunbuilder/buffer?_rsc=1jn8g","memory.rss":"516751360","memory.heapUsed":"195181384","memory.heapTotal":"215973888"},"startTime":1764727796884,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10398,"timestamp":55831646701,"id":4689,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","isTurbopack":false},"startTime":1764727796888,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55831657164,"id":4690,"parentId":4689,"tags":{"url":"/gunbuilder/buffer?_rsc=11sjy","memory.rss":"517652480","memory.heapUsed":"196097600","memory.heapTotal":"216760320"},"startTime":1764727796899,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":11597,"timestamp":55836203921,"id":4691,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","isTurbopack":false},"startTime":1764727801446,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55836215609,"id":4692,"parentId":4691,"tags":{"url":"/gunbuilder/upper?_rsc=1jn8g","memory.rss":"518569984","memory.heapUsed":"196995064","memory.heapTotal":"217546752"},"startTime":1764727801457,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10959,"timestamp":55836220241,"id":4693,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","isTurbopack":false},"startTime":1764727801462,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55836231268,"id":4694,"parentId":4693,"tags":{"url":"/gunbuilder/upper?_rsc=17gjd","memory.rss":"519503872","memory.heapUsed":"197916432","memory.heapTotal":"218595328"},"startTime":1764727801473,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":20383,"timestamp":55843646528,"id":4695,"tags":{"url":"/gunbuilder/sights?_rsc=1jn8g","isTurbopack":false},"startTime":1764727808888,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":2,"timestamp":55843667031,"id":4696,"parentId":4695,"tags":{"url":"/gunbuilder/sights?_rsc=1jn8g","memory.rss":"520421376","memory.heapUsed":"198826408","memory.heapTotal":"219381760"},"startTime":1764727808909,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":10696,"timestamp":55843671903,"id":4697,"tags":{"url":"/gunbuilder/sights?_rsc=1eh78","isTurbopack":false},"startTime":1764727808914,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":1,"timestamp":55843682633,"id":4698,"parentId":4697,"tags":{"url":"/gunbuilder/sights?_rsc=1eh78","memory.rss":"521388032","memory.heapUsed":"199826696","memory.heapTotal":"220692480"},"startTime":1764727808924,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":13889,"timestamp":55847810015,"id":4699,"tags":{"url":"/gunbuilder/optic?_rsc=6b90i","isTurbopack":false},"startTime":1764727813052,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":3,"timestamp":55847823988,"id":4700,"parentId":4699,"tags":{"url":"/gunbuilder/optic?_rsc=6b90i","memory.rss":"522469376","memory.heapUsed":"200833728","memory.heapTotal":"221741056"},"startTime":1764727813066,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":31683,"timestamp":55853677698,"id":4701,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764727818919,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55853709410,"id":4702,"parentId":4701,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"522928128","memory.heapUsed":"187366304","memory.heapTotal":"196313088"},"startTime":1764727818951,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13230,"timestamp":55979029448,"id":4709,"parentId":4706,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727944271,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13243,"timestamp":55979029455,"id":4710,"parentId":4706,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727944271,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13246,"timestamp":55979029462,"id":4711,"parentId":4706,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727944271,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":14377,"timestamp":55979029337,"id":4707,"parentId":4706,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727944271,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2668,"timestamp":55979041183,"id":4714,"parentId":4713,"tags":{},"startTime":1764727944283,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":2886,"timestamp":55979040969,"id":4713,"parentId":4712,"tags":{},"startTime":1764727944282,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":6949,"timestamp":55979040503,"id":4712,"parentId":4705,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764727944282,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":58846,"timestamp":55979029440,"id":4708,"parentId":4706,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727944271,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":2986,"timestamp":55979090030,"id":4732,"parentId":4731,"tags":{},"startTime":1764727944331,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3128,"timestamp":55979089897,"id":4731,"parentId":4730,"tags":{},"startTime":1764727944331,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":10087,"timestamp":55979089772,"id":4730,"parentId":4705,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764727944331,"traceId":"247574ce86dfd828"},{"name":"make","duration":81539,"timestamp":55979022799,"id":4706,"parentId":4705,"tags":{},"startTime":1764727944264,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1484,"timestamp":55979105649,"id":4734,"parentId":4733,"tags":{},"startTime":1764727944347,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":55979107145,"id":4736,"parentId":4733,"tags":{},"startTime":1764727944349,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1357,"timestamp":55979107190,"id":4737,"parentId":4733,"tags":{},"startTime":1764727944349,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":55979108572,"id":4738,"parentId":4733,"tags":{},"startTime":1764727944350,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":3,"timestamp":55979108599,"id":4739,"parentId":4733,"tags":{},"startTime":1764727944350,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1672,"timestamp":55979107141,"id":4735,"parentId":4733,"tags":{},"startTime":1764727944349,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":277,"timestamp":55979109288,"id":4740,"parentId":4733,"tags":{},"startTime":1764727944351,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":398,"timestamp":55979109569,"id":4741,"parentId":4733,"tags":{},"startTime":1764727944351,"traceId":"247574ce86dfd828"},{"name":"hash","duration":832,"timestamp":55979110506,"id":4742,"parentId":4733,"tags":{},"startTime":1764727944352,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":56,"timestamp":55979111338,"id":4743,"parentId":4733,"tags":{},"startTime":1764727944353,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":26,"timestamp":55979111390,"id":4744,"parentId":4733,"tags":{},"startTime":1764727944353,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":109,"timestamp":55979111419,"id":4745,"parentId":4733,"tags":{},"startTime":1764727944353,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7207,"timestamp":55979105425,"id":4733,"parentId":4705,"tags":{},"startTime":1764727944347,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":91942,"timestamp":55979022316,"id":4705,"parentId":4703,"tags":{"name":"server"},"startTime":1764727944264,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1559,"timestamp":55979114275,"id":4746,"parentId":4703,"tags":{},"startTime":1764727944356,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":104185,"timestamp":55979012044,"id":4703,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764727944254,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2781,"timestamp":55979129404,"id":4756,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":2824,"timestamp":55979129410,"id":4758,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3105,"timestamp":55979129351,"id":4749,"parentId":4748,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3299,"timestamp":55979129406,"id":4757,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3571,"timestamp":55979129393,"id":4751,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5428,"timestamp":55979129400,"id":4753,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":1626,"timestamp":55979133222,"id":4764,"parentId":4763,"tags":{},"startTime":1764727944375,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8560,"timestamp":55979129389,"id":4750,"parentId":4748,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8548,"timestamp":55979129403,"id":4755,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":6444,"timestamp":55979131615,"id":4762,"parentId":4761,"tags":{},"startTime":1764727944373,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":6509,"timestamp":55979131550,"id":4761,"parentId":4760,"tags":{},"startTime":1764727944373,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":12205,"timestamp":55979131488,"id":4760,"parentId":4747,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764727944373,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":25856,"timestamp":55979134876,"id":4766,"parentId":4765,"tags":{},"startTime":1764727944376,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":26195,"timestamp":55979134867,"id":4765,"parentId":4763,"tags":{},"startTime":1764727944376,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4010,"timestamp":55979161091,"id":4767,"parentId":4763,"tags":{"astUsed":"true"},"startTime":1764727944403,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":33137,"timestamp":55979133115,"id":4763,"parentId":4759,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727944375,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":41717,"timestamp":55979130880,"id":4759,"parentId":4747,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727944372,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":34,"timestamp":55979175410,"id":4768,"parentId":4759,"tags":{},"startTime":1764727944417,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":46409,"timestamp":55979129395,"id":4752,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":51903,"timestamp":55979129402,"id":4754,"parentId":4748,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727944371,"traceId":"247574ce86dfd828"},{"name":"make","duration":64147,"timestamp":55979117167,"id":4748,"parentId":4747,"tags":{},"startTime":1764727944359,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":757,"timestamp":55979182244,"id":4770,"parentId":4769,"tags":{},"startTime":1764727944424,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":55979183010,"id":4772,"parentId":4769,"tags":{},"startTime":1764727944424,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":19,"timestamp":55979183043,"id":4773,"parentId":4769,"tags":{},"startTime":1764727944424,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":55979183069,"id":4774,"parentId":4769,"tags":{},"startTime":1764727944425,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":55979183081,"id":4775,"parentId":4769,"tags":{},"startTime":1764727944425,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":297,"timestamp":55979183007,"id":4771,"parentId":4769,"tags":{},"startTime":1764727944424,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":239,"timestamp":55979183756,"id":4776,"parentId":4769,"tags":{},"startTime":1764727944425,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":551,"timestamp":55979184000,"id":4777,"parentId":4769,"tags":{},"startTime":1764727944425,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1631,"timestamp":55979185098,"id":4778,"parentId":4769,"tags":{},"startTime":1764727944427,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":67,"timestamp":55979186729,"id":4779,"parentId":4769,"tags":{},"startTime":1764727944428,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":33,"timestamp":55979186792,"id":4780,"parentId":4769,"tags":{},"startTime":1764727944428,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1466,"timestamp":55979186828,"id":4781,"parentId":4769,"tags":{},"startTime":1764727944428,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":66,"timestamp":55979188918,"id":4783,"parentId":4747,"tags":{},"startTime":1764727944430,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":98,"timestamp":55979188888,"id":4782,"parentId":4747,"tags":{},"startTime":1764727944430,"traceId":"247574ce86dfd828"},{"name":"seal","duration":18219,"timestamp":55979182000,"id":4769,"parentId":4747,"tags":{},"startTime":1764727944423,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":83262,"timestamp":55979116985,"id":4747,"parentId":4704,"tags":{"name":"client"},"startTime":1764727944358,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2582,"timestamp":55979200259,"id":4784,"parentId":4704,"tags":{},"startTime":1764727944442,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":190940,"timestamp":55979012481,"id":4704,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764727944254,"traceId":"247574ce86dfd828"}] +[{"name":"client-success","duration":2,"timestamp":55979206589,"id":4785,"parentId":3,"tags":{},"startTime":1764727944448,"traceId":"247574ce86dfd828"},{"name":"handle-request","duration":16665,"timestamp":55979206740,"id":4786,"tags":{"url":"/gunbuilder?_rsc=9gfev","isTurbopack":false},"startTime":1764727944448,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":55979223422,"id":4787,"parentId":4786,"tags":{"url":"/gunbuilder?_rsc=9gfev","memory.rss":"536264704","memory.heapUsed":"192220696","memory.heapTotal":"219955200"},"startTime":1764727944465,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":220000,"timestamp":55979013782,"id":4788,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764727944476,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9955,"timestamp":56008629064,"id":4799,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10098,"timestamp":56008629071,"id":4800,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10239,"timestamp":56008629086,"id":4802,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11419,"timestamp":56008628936,"id":4793,"parentId":4792,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11999,"timestamp":56008629078,"id":4801,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":12880,"timestamp":56008629032,"id":4795,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3508,"timestamp":56008640179,"id":4806,"parentId":4805,"tags":{},"startTime":1764727973882,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":3687,"timestamp":56008640004,"id":4805,"parentId":4804,"tags":{},"startTime":1764727973881,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7789,"timestamp":56008639713,"id":4804,"parentId":4791,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"app-pages-browser"},"startTime":1764727973881,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":19522,"timestamp":56008629047,"id":4797,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":6891,"timestamp":56008642592,"id":4808,"parentId":4807,"tags":{},"startTime":1764727973884,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":25108,"timestamp":56008629057,"id":4798,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":25385,"timestamp":56008629018,"id":4794,"parentId":4792,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":20004,"timestamp":56008649532,"id":4810,"parentId":4809,"tags":{},"startTime":1764727973891,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":20543,"timestamp":56008649512,"id":4809,"parentId":4807,"tags":{},"startTime":1764727973891,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4676,"timestamp":56008670081,"id":4811,"parentId":4807,"tags":{"astUsed":"true"},"startTime":1764727973911,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":33156,"timestamp":56008642453,"id":4807,"parentId":4803,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727973884,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":40959,"timestamp":56008636686,"id":4803,"parentId":4791,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727973878,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":20,"timestamp":56008677748,"id":4812,"parentId":4803,"tags":{},"startTime":1764727973919,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":48753,"timestamp":56008629040,"id":4796,"parentId":4792,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"make","duration":49366,"timestamp":56008628438,"id":4792,"parentId":4791,"tags":{},"startTime":1764727973870,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1034,"timestamp":56008679030,"id":4814,"parentId":4813,"tags":{},"startTime":1764727973920,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":56008680073,"id":4816,"parentId":4813,"tags":{},"startTime":1764727973921,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":24,"timestamp":56008680084,"id":4817,"parentId":4813,"tags":{},"startTime":1764727973921,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":56008680116,"id":4818,"parentId":4813,"tags":{},"startTime":1764727973922,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":56008680129,"id":4819,"parentId":4813,"tags":{},"startTime":1764727973922,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":245,"timestamp":56008680070,"id":4815,"parentId":4813,"tags":{},"startTime":1764727973921,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":299,"timestamp":56008680891,"id":4820,"parentId":4813,"tags":{},"startTime":1764727973922,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":806,"timestamp":56008681196,"id":4821,"parentId":4813,"tags":{},"startTime":1764727973923,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1668,"timestamp":56008682656,"id":4822,"parentId":4813,"tags":{},"startTime":1764727973924,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":101,"timestamp":56008684320,"id":4823,"parentId":4813,"tags":{},"startTime":1764727973926,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":28,"timestamp":56008684416,"id":4824,"parentId":4813,"tags":{},"startTime":1764727973926,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2035,"timestamp":56008684447,"id":4825,"parentId":4813,"tags":{},"startTime":1764727973926,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":33,"timestamp":56008686948,"id":4827,"parentId":4791,"tags":{},"startTime":1764727973928,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":72,"timestamp":56008686911,"id":4826,"parentId":4791,"tags":{},"startTime":1764727973928,"traceId":"247574ce86dfd828"},{"name":"seal","duration":9211,"timestamp":56008678642,"id":4813,"parentId":4791,"tags":{},"startTime":1764727973920,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":60054,"timestamp":56008627825,"id":4791,"parentId":4789,"tags":{"name":"client"},"startTime":1764727973869,"traceId":"247574ce86dfd828"},{"name":"emit","duration":5303,"timestamp":56008687890,"id":4828,"parentId":4789,"tags":{},"startTime":1764727973929,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":74546,"timestamp":56008619030,"id":4789,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727973860,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":56008695478,"id":4831,"parentId":3,"tags":{},"startTime":1764727973937,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4530,"timestamp":56008696374,"id":4833,"parentId":4830,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727973938,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4535,"timestamp":56008696376,"id":4834,"parentId":4830,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727973938,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4536,"timestamp":56008696378,"id":4835,"parentId":4830,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727973938,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4537,"timestamp":56008696379,"id":4836,"parentId":4830,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727973938,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":5029,"timestamp":56008696353,"id":4832,"parentId":4830,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727973938,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1113,"timestamp":56008703554,"id":4854,"parentId":4853,"tags":{},"startTime":1764727973945,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1174,"timestamp":56008703495,"id":4853,"parentId":4852,"tags":{},"startTime":1764727973945,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2344,"timestamp":56008703361,"id":4852,"parentId":4829,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"ssr"},"startTime":1764727973945,"traceId":"247574ce86dfd828"},{"name":"make","duration":11602,"timestamp":56008694865,"id":4830,"parentId":4829,"tags":{},"startTime":1764727973936,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1354,"timestamp":56008707383,"id":4856,"parentId":4855,"tags":{},"startTime":1764727973949,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":56008708746,"id":4858,"parentId":4855,"tags":{},"startTime":1764727973950,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1344,"timestamp":56008708755,"id":4859,"parentId":4855,"tags":{},"startTime":1764727973950,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":4,"timestamp":56008710105,"id":4860,"parentId":4855,"tags":{},"startTime":1764727973952,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":56008710114,"id":4861,"parentId":4855,"tags":{},"startTime":1764727973952,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1556,"timestamp":56008708743,"id":4857,"parentId":4855,"tags":{},"startTime":1764727973950,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":177,"timestamp":56008710694,"id":4862,"parentId":4855,"tags":{},"startTime":1764727973952,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":479,"timestamp":56008710875,"id":4863,"parentId":4855,"tags":{},"startTime":1764727973952,"traceId":"247574ce86dfd828"},{"name":"hash","duration":440,"timestamp":56008711709,"id":4864,"parentId":4855,"tags":{},"startTime":1764727973953,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":50,"timestamp":56008712149,"id":4865,"parentId":4855,"tags":{},"startTime":1764727973954,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":16,"timestamp":56008712197,"id":4866,"parentId":4855,"tags":{},"startTime":1764727973954,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":515,"timestamp":56008712216,"id":4867,"parentId":4855,"tags":{},"startTime":1764727973954,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":90000,"timestamp":56008619995,"id":4868,"parentId":3,"tags":{"updatedModules":["[project]/components/CategoryColumn.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764727973954,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6320,"timestamp":56008707203,"id":4855,"parentId":4829,"tags":{},"startTime":1764727973949,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":20471,"timestamp":56008694684,"id":4829,"parentId":4790,"tags":{"name":"server"},"startTime":1764727973936,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1347,"timestamp":56008715164,"id":4869,"parentId":4790,"tags":{},"startTime":1764727973957,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":97437,"timestamp":56008619397,"id":4790,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727973861,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":8605,"timestamp":56008723603,"id":4870,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764727973965,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":56008732224,"id":4871,"parentId":4870,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"568737792","memory.heapUsed":"203063320","memory.heapTotal":"262504448"},"startTime":1764727973974,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8540,"timestamp":56011165505,"id":4882,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8651,"timestamp":56011165510,"id":4883,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":8819,"timestamp":56011165520,"id":4885,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":9982,"timestamp":56011165404,"id":4876,"parentId":4875,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":10815,"timestamp":56011165514,"id":4884,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":11662,"timestamp":56011165482,"id":4878,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":3944,"timestamp":56011175163,"id":4889,"parentId":4888,"tags":{},"startTime":1764727976417,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4099,"timestamp":56011175012,"id":4888,"parentId":4887,"tags":{},"startTime":1764727976416,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":7594,"timestamp":56011174727,"id":4887,"parentId":4874,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"app-pages-browser"},"startTime":1764727976416,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17835,"timestamp":56011165493,"id":4880,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":6290,"timestamp":56011177826,"id":4891,"parentId":4890,"tags":{},"startTime":1764727976419,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":21858,"timestamp":56011165499,"id":4881,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":22117,"timestamp":56011165468,"id":4877,"parentId":4875,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":20607,"timestamp":56011184157,"id":4893,"parentId":4892,"tags":{},"startTime":1764727976426,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":20803,"timestamp":56011184141,"id":4892,"parentId":4890,"tags":{},"startTime":1764727976426,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":4581,"timestamp":56011204967,"id":4894,"parentId":4890,"tags":{"astUsed":"true"},"startTime":1764727976446,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":32740,"timestamp":56011177681,"id":4890,"parentId":4886,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727976419,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":40489,"timestamp":56011171780,"id":4886,"parentId":4874,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727976413,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":22,"timestamp":56011212422,"id":4895,"parentId":4886,"tags":{},"startTime":1764727976454,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":46984,"timestamp":56011165488,"id":4879,"parentId":4875,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976407,"traceId":"247574ce86dfd828"},{"name":"make","duration":47447,"timestamp":56011165036,"id":4875,"parentId":4874,"tags":{},"startTime":1764727976406,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1013,"timestamp":56011213584,"id":4897,"parentId":4896,"tags":{},"startTime":1764727976455,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":2,"timestamp":56011214606,"id":4899,"parentId":4896,"tags":{},"startTime":1764727976456,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":27,"timestamp":56011214616,"id":4900,"parentId":4896,"tags":{},"startTime":1764727976456,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":56011214651,"id":4901,"parentId":4896,"tags":{},"startTime":1764727976456,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":56011214665,"id":4902,"parentId":4896,"tags":{},"startTime":1764727976456,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":252,"timestamp":56011214603,"id":4898,"parentId":4896,"tags":{},"startTime":1764727976456,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":272,"timestamp":56011215342,"id":4903,"parentId":4896,"tags":{},"startTime":1764727976457,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":681,"timestamp":56011215619,"id":4904,"parentId":4896,"tags":{},"startTime":1764727976457,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1620,"timestamp":56011216808,"id":4905,"parentId":4896,"tags":{},"startTime":1764727976458,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":78,"timestamp":56011218427,"id":4906,"parentId":4896,"tags":{},"startTime":1764727976460,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":29,"timestamp":56011218498,"id":4907,"parentId":4896,"tags":{},"startTime":1764727976460,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":2032,"timestamp":56011218530,"id":4908,"parentId":4896,"tags":{},"startTime":1764727976460,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":33,"timestamp":56011220970,"id":4910,"parentId":4874,"tags":{},"startTime":1764727976462,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":72,"timestamp":56011220933,"id":4909,"parentId":4874,"tags":{},"startTime":1764727976462,"traceId":"247574ce86dfd828"},{"name":"seal","duration":8554,"timestamp":56011213290,"id":4896,"parentId":4874,"tags":{},"startTime":1764727976455,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":57407,"timestamp":56011164452,"id":4874,"parentId":4872,"tags":{"name":"client"},"startTime":1764727976406,"traceId":"247574ce86dfd828"},{"name":"emit","duration":6136,"timestamp":56011221870,"id":4911,"parentId":4872,"tags":{},"startTime":1764727976463,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":72052,"timestamp":56011156260,"id":4872,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727976398,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":1,"timestamp":56011229952,"id":4914,"parentId":3,"tags":{},"startTime":1764727976471,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3285,"timestamp":56011231192,"id":4916,"parentId":4913,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727976473,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3288,"timestamp":56011231195,"id":4917,"parentId":4913,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727976473,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3290,"timestamp":56011231196,"id":4918,"parentId":4913,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727976473,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3291,"timestamp":56011231198,"id":4919,"parentId":4913,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727976473,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3787,"timestamp":56011231175,"id":4915,"parentId":4913,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727976473,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1163,"timestamp":56011236703,"id":4937,"parentId":4936,"tags":{},"startTime":1764727976478,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1213,"timestamp":56011236655,"id":4936,"parentId":4935,"tags":{},"startTime":1764727976478,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2254,"timestamp":56011236561,"id":4935,"parentId":4912,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"ssr"},"startTime":1764727976478,"traceId":"247574ce86dfd828"},{"name":"make","duration":9887,"timestamp":56011229442,"id":4913,"parentId":4912,"tags":{},"startTime":1764727976471,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":1284,"timestamp":56011240188,"id":4939,"parentId":4938,"tags":{},"startTime":1764727976482,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":1,"timestamp":56011241480,"id":4941,"parentId":4938,"tags":{},"startTime":1764727976483,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1369,"timestamp":56011241487,"id":4942,"parentId":4938,"tags":{},"startTime":1764727976483,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":56011242871,"id":4943,"parentId":4938,"tags":{},"startTime":1764727976484,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":56011242882,"id":4944,"parentId":4938,"tags":{},"startTime":1764727976484,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1540,"timestamp":56011241477,"id":4940,"parentId":4938,"tags":{},"startTime":1764727976483,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":170,"timestamp":56011243355,"id":4945,"parentId":4938,"tags":{},"startTime":1764727976485,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":461,"timestamp":56011243529,"id":4946,"parentId":4938,"tags":{},"startTime":1764727976485,"traceId":"247574ce86dfd828"},{"name":"hash","duration":430,"timestamp":56011244301,"id":4947,"parentId":4938,"tags":{},"startTime":1764727976486,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":35,"timestamp":56011244731,"id":4948,"parentId":4938,"tags":{},"startTime":1764727976486,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":21,"timestamp":56011244762,"id":4949,"parentId":4938,"tags":{},"startTime":1764727976486,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":504,"timestamp":56011244786,"id":4950,"parentId":4938,"tags":{},"startTime":1764727976486,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":88000,"timestamp":56011156573,"id":4951,"parentId":3,"tags":{"updatedModules":["[project]/components/CategoryColumn.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764727976487,"traceId":"247574ce86dfd828"},{"name":"seal","duration":6056,"timestamp":56011240043,"id":4938,"parentId":4912,"tags":{},"startTime":1764727976481,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":18411,"timestamp":56011229288,"id":4912,"parentId":4873,"tags":{"name":"server"},"startTime":1764727976471,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1214,"timestamp":56011247709,"id":4952,"parentId":4873,"tags":{},"startTime":1764727976489,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":92665,"timestamp":56011156548,"id":4873,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727976398,"traceId":"247574ce86dfd828"}] +[{"name":"handle-request","duration":8681,"timestamp":56011255562,"id":4953,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764727976497,"traceId":"247574ce86dfd828"},{"name":"memory-usage","duration":0,"timestamp":56011264274,"id":4954,"parentId":4953,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"581566464","memory.heapUsed":"214929968","memory.heapTotal":"275955712"},"startTime":1764727976506,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13220,"timestamp":56011691322,"id":4965,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13376,"timestamp":56011691332,"id":4966,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fbuild%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":13570,"timestamp":56011691340,"id":4968,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15189,"timestamp":56011691051,"id":4959,"parentId":4958,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764727976932,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":15934,"timestamp":56011691336,"id":4967,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":17076,"timestamp":56011691228,"id":4961,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":4722,"timestamp":56011705971,"id":4972,"parentId":4971,"tags":{},"startTime":1764727976947,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":4988,"timestamp":56011705711,"id":4971,"parentId":4970,"tags":{},"startTime":1764727976947,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":9961,"timestamp":56011705420,"id":4970,"parentId":4957,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"app-pages-browser"},"startTime":1764727976947,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":25472,"timestamp":56011691239,"id":4963,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fapp-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fclient-page.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Ferror-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Flayout-router.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Fnot-found-boundary.js%22%2C%22ids%22%3A%5B%5D%7D&modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fnode_modules%2Fnext%2Fdist%2Fclient%2Fcomponents%2Frender-from-template-context.js%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"read-resource","duration":8515,"timestamp":56011709120,"id":4974,"parentId":4973,"tags":{},"startTime":1764727976951,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":32849,"timestamp":56011691251,"id":4964,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fgunbuilder%2Fpage.tsx%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":33626,"timestamp":56011691212,"id":4960,"parentId":4958,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"postcss-process","duration":22795,"timestamp":56011717698,"id":4976,"parentId":4975,"tags":{},"startTime":1764727976959,"traceId":"247574ce86dfd828"},{"name":"postcss-loader","duration":23265,"timestamp":56011717670,"id":4975,"parentId":4973,"tags":{},"startTime":1764727976959,"traceId":"247574ce86dfd828"},{"name":"css-loader","duration":3485,"timestamp":56011740955,"id":4977,"parentId":4973,"tags":{"astUsed":"true"},"startTime":1764727976982,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":36219,"timestamp":56011708947,"id":4973,"parentId":4969,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css.webpack[javascript/auto]!=!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/css-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[2]!/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/build/webpack/loaders/postcss-loader/src/index.js??ruleSet[1].rules[13].oneOf[12].use[3]!/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":null},"startTime":1764727976950,"traceId":"247574ce86dfd828"},{"name":"build-module-css","duration":44894,"timestamp":56011701906,"id":4969,"parentId":4957,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764727976943,"traceId":"247574ce86dfd828"},{"name":"build-module","duration":17,"timestamp":56011746887,"id":4978,"parentId":4969,"tags":{},"startTime":1764727976988,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":55692,"timestamp":56011691234,"id":4962,"parentId":4958,"tags":{"request":"next-flight-client-entry-loader?modules=%7B%22request%22%3A%22%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp%2Fglobals.css%22%2C%22ids%22%3A%5B%5D%7D&server=false!"},"startTime":1764727976933,"traceId":"247574ce86dfd828"},{"name":"make","duration":56571,"timestamp":56011690364,"id":4958,"parentId":4957,"tags":{},"startTime":1764727976932,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":944,"timestamp":56011747840,"id":4980,"parentId":4979,"tags":{},"startTime":1764727976989,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":3,"timestamp":56011748792,"id":4982,"parentId":4979,"tags":{},"startTime":1764727976990,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":25,"timestamp":56011748802,"id":4983,"parentId":4979,"tags":{},"startTime":1764727976990,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":3,"timestamp":56011748835,"id":4984,"parentId":4979,"tags":{},"startTime":1764727976990,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":2,"timestamp":56011748847,"id":4985,"parentId":4979,"tags":{},"startTime":1764727976990,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":334,"timestamp":56011748789,"id":4981,"parentId":4979,"tags":{},"startTime":1764727976990,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":249,"timestamp":56011749639,"id":4986,"parentId":4979,"tags":{},"startTime":1764727976991,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":522,"timestamp":56011749893,"id":4987,"parentId":4979,"tags":{},"startTime":1764727976991,"traceId":"247574ce86dfd828"},{"name":"hash","duration":1399,"timestamp":56011750955,"id":4988,"parentId":4979,"tags":{},"startTime":1764727976992,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":66,"timestamp":56011752354,"id":4989,"parentId":4979,"tags":{},"startTime":1764727976994,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":25,"timestamp":56011752416,"id":4990,"parentId":4979,"tags":{},"startTime":1764727976994,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":1235,"timestamp":56011752444,"id":4991,"parentId":4979,"tags":{},"startTime":1764727976994,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-generateClientManifest","duration":30,"timestamp":56011754048,"id":4993,"parentId":4957,"tags":{},"startTime":1764727976995,"traceId":"247574ce86dfd828"},{"name":"NextJsBuildManifest-createassets","duration":64,"timestamp":56011754016,"id":4992,"parentId":4957,"tags":{},"startTime":1764727976995,"traceId":"247574ce86dfd828"},{"name":"seal","duration":7342,"timestamp":56011747580,"id":4979,"parentId":4957,"tags":{},"startTime":1764727976989,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":65306,"timestamp":56011689630,"id":4957,"parentId":4955,"tags":{"name":"client"},"startTime":1764727976931,"traceId":"247574ce86dfd828"},{"name":"emit","duration":2930,"timestamp":56011754946,"id":4994,"parentId":4955,"tags":{},"startTime":1764727976996,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-client","duration":78320,"timestamp":56011679966,"id":4955,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727976921,"traceId":"247574ce86dfd828"},{"name":"client-success","duration":5,"timestamp":56011760082,"id":4997,"parentId":3,"tags":{},"startTime":1764727977001,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3748,"timestamp":56011761416,"id":4999,"parentId":4996,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fpage&page=%2Fgunbuilder%2Fpage&appPaths=%2Fgunbuilder%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727977003,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3752,"timestamp":56011761418,"id":5000,"parentId":4996,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727977003,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3753,"timestamp":56011761420,"id":5001,"parentId":4996,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fcategory-mappings%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727977003,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":3753,"timestamp":56011761422,"id":5002,"parentId":4996,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&page=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&appPaths=%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2F%5BcategoryId%5D%2F%5BpartId%5D%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727977003,"traceId":"247574ce86dfd828"},{"name":"add-entry","duration":4111,"timestamp":56011761397,"id":4998,"parentId":4996,"tags":{"request":"next-app-loader?name=app%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&page=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&appPaths=%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage&pagePath=private-next-app-dir%2Fgunbuilder%2Fadmin%2Fmerchants%2Fpage.tsx&appDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fsean%2FDev%2Fgunbuilder-prototype&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!"},"startTime":1764727977003,"traceId":"247574ce86dfd828"},{"name":"client-hmr-latency","duration":85000,"timestamp":56011681386,"id":5021,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764727977009,"traceId":"247574ce86dfd828"},{"name":"next-swc-transform","duration":1218,"timestamp":56011767301,"id":5020,"parentId":5019,"tags":{},"startTime":1764727977009,"traceId":"247574ce86dfd828"},{"name":"next-swc-loader","duration":1278,"timestamp":56011767243,"id":5019,"parentId":5018,"tags":{},"startTime":1764727977009,"traceId":"247574ce86dfd828"},{"name":"build-module-tsx","duration":2335,"timestamp":56011767122,"id":5018,"parentId":4995,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/components/CategoryColumn.tsx","layer":"ssr"},"startTime":1764727977009,"traceId":"247574ce86dfd828"},{"name":"make","duration":10456,"timestamp":56011759436,"id":4996,"parentId":4995,"tags":{},"startTime":1764727977001,"traceId":"247574ce86dfd828"},{"name":"chunk-graph","duration":940,"timestamp":56011770866,"id":5023,"parentId":5022,"tags":{},"startTime":1764727977012,"traceId":"247574ce86dfd828"},{"name":"optimize-modules","duration":13,"timestamp":56011771813,"id":5025,"parentId":5022,"tags":{},"startTime":1764727977013,"traceId":"247574ce86dfd828"},{"name":"optimize-chunks","duration":1367,"timestamp":56011771834,"id":5026,"parentId":5022,"tags":{},"startTime":1764727977013,"traceId":"247574ce86dfd828"},{"name":"optimize-tree","duration":2,"timestamp":56011773209,"id":5027,"parentId":5022,"tags":{},"startTime":1764727977015,"traceId":"247574ce86dfd828"},{"name":"optimize-chunk-modules","duration":1,"timestamp":56011773217,"id":5028,"parentId":5022,"tags":{},"startTime":1764727977015,"traceId":"247574ce86dfd828"},{"name":"optimize","duration":1604,"timestamp":56011771811,"id":5024,"parentId":5022,"tags":{},"startTime":1764727977013,"traceId":"247574ce86dfd828"},{"name":"module-hash","duration":186,"timestamp":56011773861,"id":5029,"parentId":5022,"tags":{},"startTime":1764727977015,"traceId":"247574ce86dfd828"},{"name":"code-generation","duration":387,"timestamp":56011774051,"id":5030,"parentId":5022,"tags":{},"startTime":1764727977015,"traceId":"247574ce86dfd828"},{"name":"hash","duration":500,"timestamp":56011774792,"id":5031,"parentId":5022,"tags":{},"startTime":1764727977016,"traceId":"247574ce86dfd828"},{"name":"code-generation-jobs","duration":36,"timestamp":56011775292,"id":5032,"parentId":5022,"tags":{},"startTime":1764727977017,"traceId":"247574ce86dfd828"},{"name":"module-assets","duration":18,"timestamp":56011775324,"id":5033,"parentId":5022,"tags":{},"startTime":1764727977017,"traceId":"247574ce86dfd828"},{"name":"create-chunk-assets","duration":58,"timestamp":56011775344,"id":5034,"parentId":5022,"tags":{},"startTime":1764727977017,"traceId":"247574ce86dfd828"},{"name":"seal","duration":5501,"timestamp":56011770668,"id":5022,"parentId":4995,"tags":{},"startTime":1764727977012,"traceId":"247574ce86dfd828"},{"name":"webpack-compilation","duration":18678,"timestamp":56011759279,"id":4995,"parentId":4956,"tags":{"name":"server"},"startTime":1764727977001,"traceId":"247574ce86dfd828"},{"name":"emit","duration":1131,"timestamp":56011777968,"id":5035,"parentId":4956,"tags":{},"startTime":1764727977019,"traceId":"247574ce86dfd828"},{"name":"webpack-invalidated-server","duration":98956,"timestamp":56011680550,"id":4956,"parentId":3,"tags":{"trigger":"components/CategoryColumn.tsx"},"startTime":1764727976922,"traceId":"247574ce86dfd828"}] diff --git a/app/gunbuilder/[categoryId]/page.tsx b/app/gunbuilder/[categoryId]/page.tsx index fb60f0f..db44bb7 100644 --- a/app/gunbuilder/[categoryId]/page.tsx +++ b/app/gunbuilder/[categoryId]/page.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo, useState } from "react"; import Link from "next/link"; import { useParams, useRouter } from "next/navigation"; import { CATEGORIES } from "@/data/gunbuilderParts"; +import { CATEGORY_TO_PART_ROLES } from "@/data/partRoleMappings"; import type { CategoryId, Part } from "@/types/gunbuilder"; type ViewMode = "card" | "list"; @@ -22,18 +23,6 @@ type GunbuilderProductFromApi = { const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080"; -const CATEGORY_TO_PART_ROLES: Record = { - upper: ["upper-receiver"], - barrel: ["barrel"], - handguard: ["handguard"], - chargingHandle: ["charging-handle"], - buffer: ["buffer-kit"], - lowerParts: ["lower-parts-kit"], - sights: ["sight"], - lower: ["lower-receiver"], - optic: ["optic"], - stock: ["stock"], -}; // sort options type SortOption = "relevance" | "price-asc" | "price-desc" | "brand-asc"; @@ -80,10 +69,11 @@ export default function CategoryPage() { async function fetchCategoryParts() { try { - setLoading(true); + setLoading(true); setError(null); - const roles = CATEGORY_TO_PART_ROLES[categoryId] ?? []; + // FIX: determine which backend partRoles map to this category + const roles = CATEGORY_TO_PART_ROLES[categoryId] ?? []; const search = new URLSearchParams(); search.set("platform", "AR-15"); diff --git a/app/gunbuilder/admin/category-mappings/page.tsx b/app/gunbuilder/admin/category-mappings/page.tsx index b58e020..29d0d1c 100644 --- a/app/gunbuilder/admin/category-mappings/page.tsx +++ b/app/gunbuilder/admin/category-mappings/page.tsx @@ -27,16 +27,27 @@ type UpsertRequest = { // Keep this in sync with your backend `partRole` values const PART_ROLE_OPTIONS = [ { value: "", label: "— Unmapped —" }, + // Lower / fire control + { value: "lower-receiver", label: "Lower Receiver" }, + { value: "lower-parts-kit", label: "Lower Parts Kit" }, + { value: "trigger", label: "Trigger / Trigger Kit" }, + { value: "pistol-grip", label: "Pistol Grip" }, + { value: "safety-selector", label: "Safety Selector" }, + + // Upper { value: "upper-receiver", label: "Upper Receiver" }, { value: "barrel", label: "Barrel" }, { value: "handguard", label: "Handguard" }, - { value: "charging-handle", label: "Charging Handle" }, - { value: "buffer-kit", label: "Buffer Kit" }, - { value: "lower-parts-kit", label: "Lower Parts Kit" }, - { value: "sight", label: "Sight / Optic" }, - { value: "lower-receiver", label: "Lower Receiver" }, - { value: "optic", label: "Optic" }, + { value: "gas-system", label: "Gas System / Gas Block" }, + { value: "muzzle-device", label: "Muzzle Device" }, + { value: "suppressor", label: "Suppressor" }, + + // Furniture / sights / optics { value: "stock", label: "Stock" }, + { value: "buffer-kit", label: "Buffer Kit" }, + { value: "charging-handle", label: "Charging Handle" }, + { value: "sight", label: "Iron / Backup Sight" }, + { value: "optic", label: "Optic" }, { value: "other", label: "Other / Ignore" }, ]; diff --git a/app/gunbuilder/page.tsx b/app/gunbuilder/page.tsx index b8583c7..2ba7c2a 100644 --- a/app/gunbuilder/page.tsx +++ b/app/gunbuilder/page.tsx @@ -6,6 +6,7 @@ import { useSearchParams, useRouter } from "next/navigation"; import { CATEGORIES } from "@/data/gunbuilderParts"; import type { CategoryId, Part } from "@/types/gunbuilder"; import { CategoryColumn } from "@/components/CategoryColumn"; +import { PART_ROLE_TO_CATEGORY } from "@/data/partRoleMappings"; type GunbuilderProductFromApi = { id: number; // backend numeric id @@ -21,19 +22,6 @@ type GunbuilderProductFromApi = { const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080"; -// Map backend partRole to your existing CategoryId values. -const PART_ROLE_TO_CATEGORY: Record = { - "upper-receiver": "upper" as CategoryId, - barrel: "barrel" as CategoryId, - handguard: "handguard" as CategoryId, - "charging-handle": "chargingHandle" as CategoryId, - "buffer-kit": "buffer" as CategoryId, - "lower-parts-kit": "lowerParts" as CategoryId, - sight: "sights" as CategoryId, - "lower-receiver": "lower" as CategoryId, - optic: "optic" as CategoryId, - stock: "stock" as CategoryId, -}; type BuildState = Partial>; // categoryId -> partId @@ -54,22 +42,37 @@ const CATEGORY_GROUPS: { id: "lower-group", label: "Lower Receiver Parts", description: - "Everything from the serialized lower to small parts and core controls.", - categoryIds: ["lower", "lowerParts", "stock", "buffer"] as CategoryId[], + "Everything from the serialized lower to small parts, fire control, and core controls.", + categoryIds: [ + "lower", + "completeLower", + "lowerParts", + "trigger", + "grip", + "safety", + "buffer", + "stock", + ], }, { id: "upper-group", label: "Upper Receiver Parts", description: - "Barrel, upper, handguard, and the parts that keep the rifle cycling.", + "Barrel, upper, gas system, and the parts that keep the rifle cycling.", categoryIds: [ "upper", + "completeUpper", + "bcg", "barrel", + "gasBlock", + "gasTube", + "muzzleDevice", + "suppressor", "handguard", "chargingHandle", "sights", "optic", - ] as CategoryId[], + ], }, ]; @@ -92,6 +95,7 @@ export default function GunbuilderPage() { } return {}; }); + const [layoutMode, setLayoutMode] = useState<"cards" | "list">("cards"); useEffect(() => { const controller = new AbortController(); @@ -266,6 +270,35 @@ export default function GunbuilderPage() {
{/* Categories/parts */}
+
+

+ Choose one part per category. Switch layouts to browse by cards or a tighter list view. +

+
+ + +
+
{loading && (

Loading parts from backend… @@ -303,23 +336,43 @@ export default function GunbuilderPage() {

-
- {groupCategories.map((category) => ( -
- - handleSelectPart(category.id, partId) - } - /> -
- ))} -
+ {layoutMode === "cards" ? ( +
+ {groupCategories.map((category) => ( +
+ + handleSelectPart(category.id, partId) + } + /> +
+ ))} +
+ ) : ( +
+ {groupCategories.map((category) => ( +
+ + handleSelectPart(category.id, partId) + } + /> +
+ ))} +
+ )} ); })} diff --git a/components/CategoryColumn.tsx b/components/CategoryColumn.tsx index 0da2945..02a11d2 100644 --- a/components/CategoryColumn.tsx +++ b/components/CategoryColumn.tsx @@ -31,11 +31,15 @@ export function CategoryColumn({
{parts.length === 0 && ( -

No parts yet for this category.

+

No parts available yet.

)} {!displayedPart && parts.length > 0 && ( -
-

+

+

No part selected

+ Choose a Part -

+
)} {displayedPart && ( @@ -62,7 +66,7 @@ export function CategoryColumn({ /> )}
- {parts.length > 1 && ( + {parts.length >= 1 && ( partRoles +export const CATEGORY_TO_PART_ROLES: Record = { + // CORE / EXISTING + upper: ["upper-receiver"], + barrel: ["barrel"], + handguard: ["handguard"], + chargingHandle: ["charging-handle"], + buffer: ["buffer-kit"], + lowerParts: ["lower-parts-kit"], + sights: ["sight"], + lower: ["lower-receiver"], + optic: ["optic"], + stock: ["stock"], + + // NEW LOWER PARTS + trigger: ["trigger", "trigger-kit"], + grip: ["pistol-grip", "grip"], + safety: ["safety", "safety-selector"], + completeLower: ["complete-lower"], + + // NEW UPPER PARTS + completeUpper: ["complete-upper"], + bcg: ["bcg", "bolt-carrier-group"], + gasBlock: ["gas-block"], + gasTube: ["gas-tube"], + muzzleDevice: ["muzzle-device", "compensator", "brake"], + suppressor: ["suppressor"], +}; + +// Invert to get partRole -> CategoryId +export const PART_ROLE_TO_CATEGORY: Record = Object + .entries(CATEGORY_TO_PART_ROLES) + .reduce((acc, [categoryId, roles]) => { + for (const role of roles) { + acc[role] = categoryId as CategoryId; + } + return acc; + }, {} as Record); \ No newline at end of file diff --git a/types/gunbuilder.ts b/types/gunbuilder.ts index 1b87404..e4fe3e5 100644 --- a/types/gunbuilder.ts +++ b/types/gunbuilder.ts @@ -1,12 +1,22 @@ export type CategoryId = | "upper" + | "completeUpper" | "barrel" + | "gasBlock" + | "gasTube" + | "muzzleDevice" + | "suppressor" | "handguard" | "chargingHandle" + | "bcg" | "buffer" - | "lowerParts" - | "sights" | "lower" + | "completeLower" + | "lowerParts" + | "trigger" + | "grip" + | "safety" + | "sights" | "optic" | "stock";