diff --git a/.next/cache/webpack/client-development/2.pack.gz b/.next/cache/webpack/client-development/2.pack.gz index 88792ec..0da4eae 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 47b9f61..c90193e 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/index.pack.gz b/.next/cache/webpack/client-development/index.pack.gz index c873ab5..0c5a4c8 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 c6aee52..ed90a02 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 d1c6a0a..a5ed840 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 312d291..abef83d 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/2.pack.gz b/.next/cache/webpack/server-development/2.pack.gz index cdd4b21..5363e6b 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/4.pack.gz b/.next/cache/webpack/server-development/4.pack.gz index c7b7aef..d9a4653 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/index.pack.gz b/.next/cache/webpack/server-development/index.pack.gz index 5ec37ab..786d0a1 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 cbb2e59..7967561 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 41c8329..4647013 100644 --- a/.next/server/app-paths-manifest.json +++ b/.next/server/app-paths-manifest.json @@ -2,6 +2,6 @@ "/gunbuilder/page": "app/gunbuilder/page.js", "/gunbuilder/[categoryId]/page": "app/gunbuilder/[categoryId]/page.js", "/gunbuilder/[categoryId]/[partId]/page": "app/gunbuilder/[categoryId]/[partId]/page.js", - "/gunbuilder/build/page": "app/gunbuilder/build/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/build/page": "app/gunbuilder/build/page.js" } \ No newline at end of file diff --git a/.next/server/app/gunbuilder/admin/category-mappings/page.js b/.next/server/app/gunbuilder/admin/category-mappings/page.js index e789c3c..623dc4e 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 // 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: 172,\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: 175,\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: 178,\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: 171,\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: 186,\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: 198,\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: 200,\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: 189,\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: 185,\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: 170,\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: 210,\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: 215,\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: 221,\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: 226,\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: 225,\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: 229,\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 text-xs text-zinc-500\",\n children: [\n \"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: 236,\n columnNumber: 30\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: 235,\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: 245,\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: 246,\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: 244,\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: 243,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: mappings.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: 255,\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: 270,\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: 259,\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: 258,\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: 251,\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: 249,\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: 242,\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: 241,\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: 283,\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: 282,\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: 208,\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: 169,\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: 168,\n columnNumber: 5\n }, this);\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFNEM7QUFFNUMsTUFBTUUsZUFDSkMsUUFBUUMsR0FBRyxDQUFDQyx3QkFBd0IsSUFBSTtBQXFCMUMsd0RBQXdEO0FBQ3hELE1BQU1DLG9CQUFvQjtJQUN4QjtRQUFFQyxPQUFPO1FBQUlDLE9BQU87SUFBZTtJQUNuQztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBVUMsT0FBTztJQUFTO0lBQ25DO1FBQUVELE9BQU87UUFBYUMsT0FBTztJQUFZO0lBQ3pDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQWE7SUFDM0M7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBZ0I7SUFDekM7UUFBRUQsT0FBTztRQUFrQkMsT0FBTztJQUFpQjtJQUNuRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBaUI7Q0FDM0M7QUFFYyxTQUFTQztJQUN0QixNQUFNLENBQUNDLFdBQVdDLGFBQWEsR0FBR1YsK0NBQVFBLENBQWEsRUFBRTtJQUN6RCxNQUFNLENBQUNXLG9CQUFvQkMsc0JBQXNCLEdBQUdaLCtDQUFRQSxDQUMxRDtJQUVGLE1BQU0sQ0FBQ2EsVUFBVUMsWUFBWSxHQUFHZCwrQ0FBUUEsQ0FBWSxFQUFFO0lBQ3RELE1BQU0sQ0FBQ2UsaUJBQWlCQyxtQkFBbUIsR0FBR2hCLCtDQUFRQSxDQUFDO0lBQ3ZELE1BQU0sQ0FBQ2lCLFFBQVFDLFVBQVUsR0FBR2xCLCtDQUFRQSxDQUFDO0lBQ3JDLE1BQU0sQ0FBQ21CLE9BQU9DLFNBQVMsR0FBR3BCLCtDQUFR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QkFDRUssRUFBRUosV0FBVyxFQUNiK0IsRUFBRUMsTUFBTSxDQUFDdEUsS0FBSzs4RUFJakJELGtCQUFrQjBDLEdBQUcsQ0FBQyxDQUFDd0Msb0JBQ3RCLDhEQUFDVDs0RUFBdUJ4RSxPQUFPaUYsSUFBSWpGLEtBQUs7c0ZBQ3JDaUYsSUFBSWhGLEtBQUs7MkVBRENnRixJQUFJakYsS0FBSzs7Ozs7Ozs7Ozs7Ozs7Ozt1REFsQnZCMEMsRUFBRUosV0FBVzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzhDQThCNUIsOERBQUN5QjtvQ0FBSUQsV0FBVTs4Q0FDYiw0RUFBQ29CO3dDQUNDQyxNQUFLO3dDQUNMQyxTQUFTeEM7d0NBQ1R5QyxVQUFVMUU7d0NBQ1ZtRCxXQUFVO2tEQUVUbkQsU0FBUyxZQUFZOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTeEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9ndW5idWlsZGVyLXByb3RvdHlwZS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4PzYzMWIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbnR5cGUgTWVyY2hhbnQgPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgTWFwcGluZyA9IHtcbiAgaWQ6IG51bWJlciB8IG51bGw7ICAgICAgICAgICAvLyBtaWdodCBiZSBudWxsIGlmIGp1c3QgY3JlYXRlZCBjbGllbnQtc2lkZVxuICBtZXJjaGFudElkOiBudW1iZXI7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICByYXdDYXRlZ29yeTogc3RyaW5nO1xuICBtYXBwZWRQYXJ0Um9sZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgVXBzZXJ0UmVxdWVzdCA9IHtcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICByYXdDYXRlZ29yeTogc3RyaW5nO1xuICBtYXBwZWRQYXJ0Um9sZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbi8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggeW91ciBiYWNrZW5kIGBwYXJ0Um9sZWAgdmFsdWVzXG5jb25zdCBQQVJUX1JPTEVfT1BUSU9OUyA9IFtcbiAgeyB2YWx1ZTogXCJcIiwgbGFiZWw6IFwi4oCUIFVubWFwcGVkIOKAlFwiIH0sXG4gIHsgdmFsdWU6IFwidXBwZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcImJhcnJlbFwiLCBsYWJlbDogXCJCYXJyZWxcIiB9LFxuICB7IHZhbHVlOiBcImhhbmRndWFyZFwiLCBsYWJlbDogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IHZhbHVlOiBcImNoYXJnaW5nLWhhbmRsZVwiLCBsYWJlbDogXCJDaGFyZ2luZyBIYW5kbGVcIiB9LFxuICB7IHZhbHVlOiBcImJ1ZmZlci1raXRcIiwgbGFiZWw6IFwiQnVmZmVyIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwibG93ZXItcGFydHMta2l0XCIsIGxhYmVsOiBcIkxvd2VyIFBhcnRzIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwic2lnaHRcIiwgbGFiZWw6IFwiU2lnaHQgLyBPcHRpY1wiIH0sXG4gIHsgdmFsdWU6IFwibG93ZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcIm9wdGljXCIsIGxhYmVsOiBcIk9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJzdG9ja1wiLCBsYWJlbDogXCJTdG9ja1wiIH0sXG4gIHsgdmFsdWU6IFwib3RoZXJcIiwgbGFiZWw6IFwiT3RoZXIgLyBJZ25vcmVcIiB9LFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UoKSB7XG4gIGNvbnN0IFttZXJjaGFudHMsIHNldE1lcmNoYW50c10gPSB1c2VTdGF0ZTxNZXJjaGFudFtdPihbXSk7XG4gIGNvbnN0IFtzZWxlY3RlZE1lcmNoYW50SWQsIHNldFNlbGVjdGVkTWVyY2hhbnRJZF0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihcbiAgICBudWxsLFxuICApO1xuICBjb25zdCBbbWFwcGluZ3MsIHNldE1hcHBpbmdzXSA9IHVzZVN0YXRlPE1hcHBpbmdbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZ01hcHBpbmdzLCBzZXRMb2FkaW5nTWFwcGluZ3NdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc3VjY2Vzc01lc3NhZ2UsIHNldFN1Y2Nlc3NNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExvYWQgbWVyY2hhbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXJjaGFudHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50c2ApO1xuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGE6IE1lcmNoYW50W10gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRNZXJjaGFudHMoZGF0YSk7XG5cbiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IG1lcmNoYW50IGlmIHlvdSB3YW50XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+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+XG4gICAgICAgICAgICAgIE5vIGNhdGVnb3J5IHJvd3MgeWV0IGZvciB0aGlzIG1lcmNoYW50LiBPbmNlIHlvdSBydW4gYW4gaW1wb3J0LFxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGNhdGVnb3JpZXMgd2lsbCBhcHBlYXIgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPi57XCIgXCJ9XG4gICAgICAgICAgICAgICAgU2V0IGEgcGFydCByb2xlIGZvciBlYWNoIHJhdyBjYXRlZ29yeS4gVW5tYXBwZWQgY2F0ZWdvcmllcyB3aWxsXG4gICAgICAgICAgICAgICAgYmUgc2tpcHBlZCBieSB0aGUgaW1wb3J0ZXIuXG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtODAwIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlJhdyBDYXRlZ29yeTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB5LTIgdGV4dC1sZWZ0IHByLTRcIj5NYXBwZWQgUGFydCBSb2xlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHttYXBwaW5ncy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci16aW5jLTkwMCBsYXN0OmJvcmRlci1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wIHRleHQtemluYy0yMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0yIHB5LTEgdGV4dC14cyB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bS5tYXBwZWRQYXJ0Um9sZSA/PyBcIlwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZVBhcnRSb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnJhd0NhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UEFSVF9ST0xFX09QVElPTlMubWFwKChvcHQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHQudmFsdWV9IHZhbHVlPXtvcHQudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3B0LmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNhdmV9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2F2aW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBiZy1hbWJlci00MDAgcHgtNCBweS0yIHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMCBkaXNhYmxlZDpvcGFjaXR5LTUwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c2F2aW5nID8gXCJTYXZpbmfigKZcIiA6IFwiU2F2ZSBNYXBwaW5nc1wifVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJBUElfQkFTRV9VUkwiLCJwcm9jZXNzIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX09QVElPTlMiLCJ2YWx1ZSIsImxhYmVsIiwiQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UiLCJtZXJjaGFudHMiLCJzZXRNZXJjaGFudHMiLCJzZWxlY3RlZE1lcmNoYW50SWQiLCJzZXRTZWxlY3RlZE1lcmNoYW50SWQiLCJtYXBwaW5ncyIsInNldE1hcHBpbmdzIiwibG9hZGluZ01hcHBpbmdzIiwic2V0TG9hZGluZ01hcHBpbmdzIiwic2F2aW5nIiwic2V0U2F2aW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInN1Y2Nlc3NNZXNzYWdlIiwic2V0U3VjY2Vzc01lc3NhZ2UiLCJmZXRjaE1lcmNoYW50cyIsInJlcyIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibGVuZ3RoIiwiaWQiLCJlcnIiLCJjb25zb2xlIiwibWVzc2FnZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaE1hcHBpbmdzIiwidXJsIiwic2lnbmFsIiwibmFtZSIsImFib3J0IiwiaGFuZGxlQ2hhbmdlUGFydFJvbGUiLCJyYXdDYXRlZ29yeSIsIm5ld1JvbGUiLCJwcmV2IiwibWFwIiwibSIsIm1hcHBlZFBhcnRSb2xlIiwiaGFuZGxlU2F2ZSIsInJlcXVlc3RzIiwicGF5bG9hZCIsIm1lcmNoYW50SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwiZmFpbGVkIiwiZmlsdGVyIiwiciIsInNlbGVjdGVkTWVyY2hhbnROYW1lIiwiZmluZCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoZWFkZXIiLCJwIiwiaDEiLCJzZWxlY3QiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJOdW1iZXIiLCJvcHRpb24iLCJzZWN0aW9uIiwic3BhbiIsInRhYmxlIiwidGhlYWQiLCJ0ciIsInRoIiwidGJvZHkiLCJ0ZCIsIm9wdCIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\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 {\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHNzcikvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeCIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFFcUQ7QUFFckQsTUFBTUcsZUFDSkMsUUFBUUMsR0FBRyxDQUFDQyx3QkFBd0IsSUFBSTtBQXFCMUMsd0RBQXdEO0FBQ3hELE1BQU1DLG9CQUFvQjtJQUN4QjtRQUFFQyxPQUFPO1FBQUlDLE9BQU87SUFBZTtJQUNuQztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBVUMsT0FBTztJQUFTO0lBQ25DO1FBQUVELE9BQU87UUFBYUMsT0FBTztJQUFZO0lBQ3pDO1FBQUVELE9BQU87UUFBbUJDLE9BQU87SUFBa0I7SUFDckQ7UUFBRUQsT0FBTztRQUFjQyxPQUFPO0lBQWE7SUFDM0M7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBZ0I7SUFDekM7UUFBRUQsT0FBTztRQUFrQkMsT0FBTztJQUFpQjtJQUNuRDtRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBUTtJQUNqQztRQUFFRCxPQUFPO1FBQVNDLE9BQU87SUFBaUI7Q0FDM0M7QUFFYyxTQUFTQztJQUN0QixNQUFNLENBQUNDLFdBQVdDLGFBQWEsR0FBR1gsK0NBQVFBLENBQWEsRUFBRTtJQUN6RCxNQUFNLENBQUNZLG9CQUFvQkMsc0JBQXNCLEdBQUdiLCtDQUFRQSxDQUMxRDtJQUVGLE1BQU0sQ0FBQ2MsVUFBVUMsWUFBWSxHQUFHZiwrQ0FBUUEsQ0FBWSxFQUFFO0lBQ3RELE1BQU0sQ0FBQ2dCLGlCQUFpQkMsbUJBQW1CLEdBQUdqQiwrQ0FBUUEsQ0FBQztJQUN2RCxNQUFNLENBQUNrQixRQUFRQyxVQUFVLEdBQUduQiwrQ0FBUUEsQ0FBQztJQUNyQyxNQUFNLENBQUNvQixPQUFPQyxTQUFTLEdBQUdyQiwrQ0FB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SUFBSTdGLEtBQUs7MkVBREM2RixJQUFJOUYsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OzBFQU01Qiw4REFBQzZGO2dFQUFHckIsV0FBVTswRUFDWDFDLEVBQUVOLGNBQWMsaUJBQ2YsOERBQUM0RDtvRUFBS1osV0FBVTs4RUFBaUg7Ozs7O3lGQUlqSSw4REFBQ1k7b0VBQUtaLFdBQVU7OEVBQTJHOzs7Ozs7Ozs7Ozs7dURBOUIxSDFDLEVBQUVKLFdBQVc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0F5QzVCLDhEQUFDK0M7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUN1Qjt3Q0FDQ1QsTUFBSzt3Q0FDTFUsU0FBU3pDO3dDQUNUMEMsVUFBVXRGO3dDQUNWNkQsV0FBVTtrREFFVDdELFNBQVMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3hDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vZ3VuYnVpbGRlci1wcm90b3R5cGUvLi9hcHAvZ3VuYnVpbGRlci9hZG1pbi9jYXRlZ29yeS1tYXBwaW5ncy9wYWdlLnRzeD82MzFiIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIGNsaWVudFwiO1xuXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVN0YXRlLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5cbmNvbnN0IEFQSV9CQVNFX1VSTCA9XG4gIHByb2Nlc3MuZW52Lk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCA/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"); /***/ }), diff --git a/.next/server/webpack-runtime.js b/.next/server/webpack-runtime.js index c64dd1c..863a5e4 100644 --- a/.next/server/webpack-runtime.js +++ b/.next/server/webpack-runtime.js @@ -125,7 +125,7 @@ /******/ /******/ /* webpack/runtime/getFullHash */ /******/ (() => { -/******/ __webpack_require__.h = () => ("2b3feb8710102491") +/******/ __webpack_require__.h = () => ("4d1c41951abed137") /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ 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 fe4caad..208eaf2 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 // 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: 172,\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: 175,\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: 178,\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: 171,\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: 186,\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: 198,\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: 200,\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: 189,\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: 185,\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: 170,\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: 210,\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: 215,\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: 221,\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: 226,\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: 225,\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: 229,\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 text-xs text-zinc-500\",\n children: [\n \"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: 236,\n columnNumber: 30\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: 235,\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: 245,\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: 246,\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: 244,\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: 243,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: mappings.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: 255,\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: 270,\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: 259,\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: 258,\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: 251,\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: 249,\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: 242,\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: 241,\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: 283,\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: 282,\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: 208,\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: 169,\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: 168,\n columnNumber: 5\n }, this);\n}\n_s(CategoryMappingsPage, \"5LD8DO/dlk/tyZWbWgncpyGs0dI=\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFNEM7SUFHMUNFO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBcUIxQyx3REFBd0Q7QUFDeEQsTUFBTUksb0JBQW9CO0lBQ3hCO1FBQUVDLE9BQU87UUFBSUMsT0FBTztJQUFlO0lBQ25DO1FBQUVELE9BQU87UUFBa0JDLE9BQU87SUFBaUI7SUFDbkQ7UUFBRUQsT0FBTztRQUFVQyxPQUFPO0lBQVM7SUFDbkM7UUFBRUQsT0FBTztRQUFhQyxPQUFPO0lBQVk7SUFDekM7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQWNDLE9BQU87SUFBYTtJQUMzQztRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBQ3JEO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFnQjtJQUN6QztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFpQjtDQUMzQztBQUVjLFNBQVNDO1FBMEhwQkM7O0lBekhGLE1BQU0sQ0FBQ0EsV0FBV0MsYUFBYSxHQUFHViwrQ0FBUUEsQ0FBYSxFQUFFO0lBQ3pELE1BQU0sQ0FBQ1csb0JBQW9CQyxzQkFBc0IsR0FBR1osK0NBQVFBLENBQzFEO0lBRUYsTUFBTSxDQUFDYSxVQUFVQyxZQUFZLEdBQUdkLCtDQUFRQSxDQUFZLEVBQUU7SUFDdEQsTUFBTSxDQUFDZSxpQkFBaUJDLG1CQUFtQixHQUFHaEIsK0NBQVFBLENBQUM7SUFDdkQsTUFBTSxDQUFDaUIsUUFBUUMs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ZixXQUFVOzswRUFFViw4REFBQ2tCO2dFQUFHbEIsV0FBVTswRUFDWHBCLEVBQUVKLFdBQVc7Ozs7OzswRUFFaEIsOERBQUMwQztnRUFBR2xCLFdBQVU7MEVBQ1osNEVBQUNLO29FQUNDTCxXQUFVO29FQUNWOUQsT0FBTzBDLENBQUFBLG9CQUFBQSxFQUFFQyxjQUFjLGNBQWhCRCwrQkFBQUEsb0JBQW9CO29FQUMzQjBCLFVBQVUsQ0FBQ0MsSUFDVGhDLHFCQUNFSyxFQUFFSixXQUFXLEVBQ2IrQixFQUFFQyxNQUFNLENBQUN0RSxLQUFLOzhFQUlqQkQsa0JBQWtCMEMsR0FBRyxDQUFDLENBQUN3QyxvQkFDdEIsOERBQUNUOzRFQUF1QnhFLE9BQU9pRixJQUFJakYsS0FBSztzRkFDckNpRixJQUFJaEYsS0FBSzsyRUFEQ2dGLElBQUlqRixLQUFLOzs7Ozs7Ozs7Ozs7Ozs7O3VEQWxCdkIwQyxFQUFFSixXQUFXOzs7OztnREF3QmhCOzs7Ozs7Ozs7Ozs7Ozs7Ozs4Q0FNWiw4REFBQ3lCO29DQUFJRCxXQUFVOzhDQUNiLDRFQUFDb0I7d0NBQ0NDLE1BQUs7d0NBQ0xDLFNBQVN4Qzt3Q0FDVHlDLFVBQVUxRTt3Q0FDVm1ELFdBQVU7a0RBRVRuRCxTQUFTLFlBQVk7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVN4QztHQS9Qd0JUO0tBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vX05fRS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4PzYzMWIiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2UgY2xpZW50XCI7XG5cbmltcG9ydCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbnR5cGUgTWVyY2hhbnQgPSB7XG4gIGlkOiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbn07XG5cbnR5cGUgTWFwcGluZyA9IHtcbiAgaWQ6IG51bWJlciB8IG51bGw7ICAgICAgICAgICAvLyBtaWdodCBiZSBudWxsIGlmIGp1c3QgY3JlYXRlZCBjbGllbnQtc2lkZVxuICBtZXJjaGFudElkOiBudW1iZXI7XG4gIG1lcmNoYW50TmFtZTogc3RyaW5nO1xuICByYXdDYXRlZ29yeTogc3RyaW5nO1xuICBtYXBwZWRQYXJ0Um9sZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbnR5cGUgVXBzZXJ0UmVxdWVzdCA9IHtcbiAgbWVyY2hhbnRJZDogbnVtYmVyO1xuICByYXdDYXRlZ29yeTogc3RyaW5nO1xuICBtYXBwZWRQYXJ0Um9sZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbi8vIEtlZXAgdGhpcyBpbiBzeW5jIHdpdGggeW91ciBiYWNrZW5kIGBwYXJ0Um9sZWAgdmFsdWVzXG5jb25zdCBQQVJUX1JPTEVfT1BUSU9OUyA9IFtcbiAgeyB2YWx1ZTogXCJcIiwgbGFiZWw6IFwi4oCUIFVubWFwcGVkIOKAlFwiIH0sXG4gIHsgdmFsdWU6IFwidXBwZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcImJhcnJlbFwiLCBsYWJlbDogXCJCYXJyZWxcIiB9LFxuICB7IHZhbHVlOiBcImhhbmRndWFyZFwiLCBsYWJlbDogXCJIYW5kZ3VhcmRcIiB9LFxuICB7IHZhbHVlOiBcImNoYXJnaW5nLWhhbmRsZVwiLCBsYWJlbDogXCJDaGFyZ2luZyBIYW5kbGVcIiB9LFxuICB7IHZhbHVlOiBcImJ1ZmZlci1raXRcIiwgbGFiZWw6IFwiQnVmZmVyIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwibG93ZXItcGFydHMta2l0XCIsIGxhYmVsOiBcIkxvd2VyIFBhcnRzIEtpdFwiIH0sXG4gIHsgdmFsdWU6IFwic2lnaHRcIiwgbGFiZWw6IFwiU2lnaHQgLyBPcHRpY1wiIH0sXG4gIHsgdmFsdWU6IFwibG93ZXItcmVjZWl2ZXJcIiwgbGFiZWw6IFwiTG93ZXIgUmVjZWl2ZXJcIiB9LFxuICB7IHZhbHVlOiBcIm9wdGljXCIsIGxhYmVsOiBcIk9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJzdG9ja1wiLCBsYWJlbDogXCJTdG9ja1wiIH0sXG4gIHsgdmFsdWU6IFwib3RoZXJcIiwgbGFiZWw6IFwiT3RoZXIgLyBJZ25vcmVcIiB9LFxuXTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UoKSB7XG4gIGNvbnN0IFttZXJjaGFudHMsIHNldE1lcmNoYW50c10gPSB1c2VTdGF0ZTxNZXJjaGFudFtdPihbXSk7XG4gIGNvbnN0IFtzZWxlY3RlZE1lcmNoYW50SWQsIHNldFNlbGVjdGVkTWVyY2hhbnRJZF0gPSB1c2VTdGF0ZTxudW1iZXIgfCBudWxsPihcbiAgICBudWxsLFxuICApO1xuICBjb25zdCBbbWFwcGluZ3MsIHNldE1hcHBpbmdzXSA9IHVzZVN0YXRlPE1hcHBpbmdbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZ01hcHBpbmdzLCBzZXRMb2FkaW5nTWFwcGluZ3NdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbc2F2aW5nLCBzZXRTYXZpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbZXJyb3IsIHNldEVycm9yXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuICBjb25zdCBbc3VjY2Vzc01lc3NhZ2UsIHNldFN1Y2Nlc3NNZXNzYWdlXSA9IHVzZVN0YXRlPHN0cmluZyB8IG51bGw+KG51bGwpO1xuXG4gIC8vIExvYWQgbWVyY2hhbnRzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNZXJjaGFudHMoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaChgJHtBUElfQkFTRV9VUkx9L2FkbWluL21lcmNoYW50c2ApO1xuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWVyY2hhbnRzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGE6IE1lcmNoYW50W10gPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBzZXRNZXJjaGFudHMoZGF0YSk7XG5cbiAgICAgICAgLy8gQXV0by1zZWxlY3QgdGhlIGZpcnN0IG1lcmNoYW50IGlmIHlvdSB3YW50XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA+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+XG4gICAgICAgICAgICAgIE5vIGNhdGVnb3J5IHJvd3MgeWV0IGZvciB0aGlzIG1lcmNoYW50LiBPbmNlIHlvdSBydW4gYW4gaW1wb3J0LFxuICAgICAgICAgICAgICBkaXNjb3ZlcmVkIGNhdGVnb3JpZXMgd2lsbCBhcHBlYXIgaGVyZSBhdXRvbWF0aWNhbGx5LlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICA8PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm1iLTMgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgTWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPi57XCIgXCJ9XG4gICAgICAgICAgICAgICAgU2V0IGEgcGFydCByb2xlIGZvciBlYWNoIHJhdyBjYXRlZ29yeS4gVW5tYXBwZWQgY2F0ZWdvcmllcyB3aWxsXG4gICAgICAgICAgICAgICAgYmUgc2tpcHBlZCBieSB0aGUgaW1wb3J0ZXIuXG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwib3ZlcmZsb3cteC1hdXRvXCI+XG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzTmFtZT1cIm1pbi13LWZ1bGwgdGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgPHRoZWFkPlxuICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3NOYW1lPVwiYm9yZGVyLWIgYm9yZGVyLXppbmMtODAwIHRleHQteHMgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE2ZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPlJhdyBDYXRlZ29yeTwvdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzTmFtZT1cInB5LTIgdGV4dC1sZWZ0IHByLTRcIj5NYXBwZWQgUGFydCBSb2xlPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHttYXBwaW5ncy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci16aW5jLTkwMCBsYXN0OmJvcmRlci1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wIHRleHQtemluYy0yMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0yIHB5LTEgdGV4dC14cyB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bS5tYXBwZWRQYXJ0Um9sZSA/PyBcIlwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZVBhcnRSb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnJhd0NhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UEFSVF9ST0xFX09QVElPTlMubWFwKChvcHQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHQudmFsdWV9IHZhbHVlPXtvcHQudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3B0LmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNhdmV9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2F2aW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBiZy1hbWJlci00MDAgcHgtNCBweS0yIHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMCBkaXNhYmxlZDpvcGFjaXR5LTUwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c2F2aW5nID8gXCJTYXZpbmfigKZcIiA6IFwiU2F2ZSBNYXBwaW5nc1wifVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJwcm9jZXNzIiwiQVBJX0JBU0VfVVJMIiwiZW52IiwiTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMIiwiUEFSVF9ST0xFX09QVElPTlMiLCJ2YWx1ZSIsImxhYmVsIiwiQ2F0ZWdvcnlNYXBwaW5nc1BhZ2UiLCJtZXJjaGFudHMiLCJzZXRNZXJjaGFudHMiLCJzZWxlY3RlZE1lcmNoYW50SWQiLCJzZXRTZWxlY3RlZE1lcmNoYW50SWQiLCJtYXBwaW5ncyIsInNldE1hcHBpbmdzIiwibG9hZGluZ01hcHBpbmdzIiwic2V0TG9hZGluZ01hcHBpbmdzIiwic2F2aW5nIiwic2V0U2F2aW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInN1Y2Nlc3NNZXNzYWdlIiwic2V0U3VjY2Vzc01lc3NhZ2UiLCJmZXRjaE1lcmNoYW50cyIsInJlcyIsImZldGNoIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibGVuZ3RoIiwiaWQiLCJlcnIiLCJjb25zb2xlIiwibWVzc2FnZSIsImNvbnRyb2xsZXIiLCJBYm9ydENvbnRyb2xsZXIiLCJmZXRjaE1hcHBpbmdzIiwidXJsIiwic2lnbmFsIiwibmFtZSIsImFib3J0IiwiaGFuZGxlQ2hhbmdlUGFydFJvbGUiLCJyYXdDYXRlZ29yeSIsIm5ld1JvbGUiLCJwcmV2IiwibWFwIiwibSIsIm1hcHBlZFBhcnRSb2xlIiwiaGFuZGxlU2F2ZSIsInJlcXVlc3RzIiwicGF5bG9hZCIsIm1lcmNoYW50SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwiZmFpbGVkIiwiZmlsdGVyIiwiciIsInNlbGVjdGVkTWVyY2hhbnROYW1lIiwiZmluZCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoZWFkZXIiLCJwIiwiaDEiLCJzZWxlY3QiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJOdW1iZXIiLCJvcHRpb24iLCJzZWN0aW9uIiwic3BhbiIsInRhYmxlIiwidGhlYWQiLCJ0ciIsInRoIiwidGJvZHkiLCJ0ZCIsIm9wdCIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\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 {\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")); /***/ }), diff --git a/.next/static/chunks/app/layout.js b/.next/static/chunks/app/layout.js index 56ff2e8..d450b7a 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\"] = (\"a219314b11ef\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJhMjE5MzE0YjExZWZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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\"] = (\"52fdc5f75b38\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI1MmZkYzVmNzViMzhcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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 0e92e2c..3336616 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 "94cf6984137bd852"; } +/******/ __webpack_require__.h = function() { return "99147c32c43e763f"; } /******/ }(); /******/ /******/ /* webpack/runtime/global */ diff --git a/.next/static/css/app/layout.css b/.next/static/css/app/layout.css index 157e5ff..6df8982 100644 --- a/.next/static/css/app/layout.css +++ b/.next/static/css/app/layout.css @@ -599,6 +599,9 @@ video { .h-full { height: 100%; } +.h-3 { + height: 0.75rem; +} .max-h-80 { max-height: 20rem; } @@ -611,6 +614,9 @@ video { .w-full { width: 100%; } +.w-3 { + width: 0.75rem; +} .min-w-0 { min-width: 0px; } @@ -675,6 +681,9 @@ video { .gap-6 { gap: 1.5rem; } +.gap-1 { + gap: 0.25rem; +} .space-y-1 > :not([hidden]) ~ :not([hidden]) { --tw-space-y-reverse: 0; margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); @@ -714,6 +723,9 @@ video { .rounded-md { border-radius: 0.375rem; } +.rounded-full { + border-radius: 9999px; +} .border { border-width: 1px; } @@ -830,6 +842,9 @@ video { .bg-red-500\/10 { background-color: rgb(239 68 68 / 0.1); } +.bg-zinc-700\/40 { + background-color: rgb(63 63 70 / 0.4); +} .object-contain { -o-object-fit: contain; object-fit: contain; @@ -1059,6 +1074,10 @@ video { --tw-text-opacity: 1; color: rgb(254 202 202 / var(--tw-text-opacity)); } +.text-emerald-300 { + --tw-text-opacity: 1; + color: rgb(110 231 183 / var(--tw-text-opacity)); +} .underline { text-decoration-line: underline; } diff --git a/.next/static/webpack/445131246b4eff72.webpack.hot-update.json b/.next/static/webpack/445131246b4eff72.webpack.hot-update.json new file mode 100644 index 0000000..2e5c8a6 --- /dev/null +++ b/.next/static/webpack/445131246b4eff72.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/admin/category-mappings/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/94cf6984137bd852.webpack.hot-update.json b/.next/static/webpack/94cf6984137bd852.webpack.hot-update.json new file mode 100644 index 0000000..2e5c8a6 --- /dev/null +++ b/.next/static/webpack/94cf6984137bd852.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/admin/category-mappings/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.445131246b4eff72.hot-update.js b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.445131246b4eff72.hot-update.js new file mode 100644 index 0000000..e67f25f --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.445131246b4eff72.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 {\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 [showOnlyMapped, setShowOnlyMapped] = (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)(()=>showOnlyMapped ? sortedMappings.filter((m)=>!!m.mappedPartRole) : sortedMappings, [\n sortedMappings,\n showOnlyMapped\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: showOnlyMapped,\n onChange: (e)=>setShowOnlyMapped(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 mapped\"\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, \"3meqosfCPWCqEPqO1QlDOtdSy/s=\");\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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QUFBLG9CQUFBQSxFQUFFTixjQUFjLGNBQWhCTSwrQkFBQUEsb0JBQW9CO29FQUMzQmdELFVBQVUsQ0FBQ0MsSUFDVDVCLHFCQUNFckIsRUFBRUosV0FBVyxFQUNicUQsRUFBRUMsTUFBTSxDQUFDaEYsS0FBSzs4RUFJakJELGtCQUFrQnVELEdBQUcsQ0FBQyxDQUFDd0Msb0JBQ3RCLDhEQUFDWjs0RUFBdUJsRixPQUFPOEYsSUFBSTlGLEtBQUs7c0ZBQ3JDOEYsSUFBSTdGLEtBQUs7MkVBREM2RixJQUFJOUYsS0FBSzs7Ozs7Ozs7Ozs7Ozs7OzBFQU01Qiw4REFBQzZGO2dFQUFHckIsV0FBVTswRUFDWDFDLEVBQUVOLGNBQWMsaUJBQ2YsOERBQUM0RDtvRUFBS1osV0FBVTs4RUFBaUg7Ozs7O3lGQUlqSSw4REFBQ1k7b0VBQUtaLFdBQVU7OEVBQTJHOzs7Ozs7Ozs7Ozs7dURBOUIxSDFDLEVBQUVKLFdBQVc7Ozs7O2dEQW1DaEI7Ozs7Ozs7Ozs7Ozs7Ozs7OzhDQU1aLDhEQUFDK0M7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUN1Qjt3Q0FDQ1QsTUFBSzt3Q0FDTFUsU0FBU3pDO3dDQUNUMEMsVUFBVXRGO3dDQUNWNkQsV0FBVTtrREFFVDdELFNBQVMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3hDO0dBOVN3QlQ7S0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvYWRtaW4vY2F0ZWdvcnktbWFwcGluZ3MvcGFnZS50c3g/NjMxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxudHlwZSBNZXJjaGFudCA9IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBNYXBwaW5nID0ge1xuICBpZDogbnVtYmVyIHwgbnVsbDsgICAgICAgICAgIC8vIG1pZ2h0IGJlIG51bGwgaWYganVzdCBjcmVhdGVkIGNsaWVudC1zaWRlXG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgbWVyY2hhbnROYW1lOiBzdHJpbmc7XG4gIHJhd0NhdGVnb3J5OiBzdHJpbmc7XG4gIG1hcHBlZFBhcnRSb2xlOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBVcHNlcnRSZXF1ZXN0ID0ge1xuICBtZXJjaGFudElkOiBudW1iZXI7XG4gIHJhd0NhdGVnb3J5OiBzdHJpbmc7XG4gIG1hcHBlZFBhcnRSb2xlOiBzdHJpbmcgfCBudWxsO1xufTtcblxuLy8gS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB5b3VyIGJhY2tlbmQgYHBhcnRSb2xlYCB2YWx1ZXNcbmNvbnN0IFBBUlRfUk9MRV9PUFRJT05TID0gW1xuICB7IHZhbHVlOiBcIlwiLCBsYWJlbDogXCLigJQgVW5tYXBwZWQg4oCUXCIgfSxcbiAgeyB2YWx1ZTogXCJ1cHBlci1yZWNlaXZlclwiLCBsYWJlbDogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgdmFsdWU6IFwiYmFycmVsXCIsIGxhYmVsOiBcIkJhcnJlbFwiIH0sXG4gIHsgdmFsdWU6IFwiaGFuZGd1YXJkXCIsIGxhYmVsOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgdmFsdWU6IFwiY2hhcmdpbmctaGFuZGxlXCIsIGxhYmVsOiBcIkNoYXJnaW5nIEhhbmRsZVwiIH0sXG4gIHsgdmFsdWU6IFwiYnVmZmVyLWtpdFwiLCBsYWJlbDogXCJCdWZmZXIgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1wYXJ0cy1raXRcIiwgbGFiZWw6IFwiTG93ZXIgUGFydHMgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJzaWdodFwiLCBsYWJlbDogXCJTaWdodCAvIE9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1yZWNlaXZlclwiLCBsYWJlbDogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgdmFsdWU6IFwib3B0aWNcIiwgbGFiZWw6IFwiT3B0aWNcIiB9LFxuICB7IHZhbHVlOiBcInN0b2NrXCIsIGxhYmVsOiBcIlN0b2NrXCIgfSxcbiAgeyB2YWx1ZTogXCJvdGhlclwiLCBsYWJlbDogXCJPdGhlciAvIElnbm9yZVwiIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeU1hcHBpbmdzUGFnZSgpIHtcbiAgY29uc3QgW21lcmNoYW50cywgc2V0TWVyY2hhbnRzXSA9IHVzZVN0YXRlPE1lcmNoYW50W10+KFtdKTtcbiAgY29uc3QgW3NlbGVjdGVkTWVyY2hhbnRJZCwgc2V0U2VsZWN0ZWRNZXJjaGFudElkXSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFttYXBwaW5ncywgc2V0TWFwcGluZ3NdID0gdXNlU3RhdGU8TWFwcGluZ1tdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nTWFwcGluZ3MsIHNldExvYWRpbmdNYXBwaW5nc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzdWNjZXNzTWVzc2FnZSwgc2V0U3VjY2Vzc01lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzaG93T25seU1hcHBlZCwgc2V0U2hvd09ubHlNYXBwZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gIGNvbnN0IHNvcnRlZE1hcHBpbmdzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gTWFwcGVkIHJvd3MgZmlyc3QsIHRoZW4gdW5tYXBwZWQ7IHdpdGhpbiBlYWNoIGdyb3VwLCBhbHBoYSBieSByYXdDYXRlZ29yeVxuICAgIHJldHVybiBbLi4ubWFwcGluZ3NdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIGNvbnN0IGFNYXBwZWQgPSAhIWEubWFwcGVkUGFydFJvbGU7XG4gICAgICBjb25zdCBiTWFwcGVkID0gISFiLm1hcHBlZFBhcnRSb2xlO1xuXG4gICAgICBpZiAoYU1hcHBlZCAhPT0gYk1hcHBlZCkge1xuICAgICAgICByZXR1cm4gYU1hcHBlZCA/IC0xIDogMTsgLy8gbWFwcGVkIGZpcnN0XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhLnJhd0NhdGVnb3J5LmxvY2FsZUNvbXBhcmUoYi5yYXdDYXRlZ29yeSk7XG4gICAgfSk7XG4gIH0sIFttYXBwaW5nc10pO1xuXG4gIGNvbnN0IHZpc2libGVNYXBwaW5ncyA9IHVzZU1lbW8oXG4gICAgKCkgPT5cbiAgICAgIHNob3dPbmx5TWFwcGVkXG4gICAgICAgID8gc29ydGVkTWFwcGluZ3MuZmlsdGVyKChtKSA9PiAhIW0ubWFwcGVkUGFydFJvbGUpXG4gICAgICAgIDogc29ydGVkTWFwcGluZ3MsXG4gICAgW3NvcnRlZE1hcHBpbmdzLCBzaG93T25seU1hcHBlZF0sXG4gICk7XG5cbiAgLy8gTG9hZCBtZXJjaGFudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaE1lcmNoYW50cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnRzYCk7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YTogTWVyY2hhbnRbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIHNldE1lcmNoYW50cyhkYXRhKTtcblxuICAgICAgICAvLyBBdXRvLXNlbGVjdCB0aGUgZmlyc3QgbWVyY2hhbnQgaWYgeW91IHdhbnRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1lcmNoYW50SWQgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoZGF0YVswXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHNcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZXJjaGFudHMoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBMb2FkIG1hcHBpbmdzIGZvciBzZWxlY3RlZCBtZXJjaGFudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNYXBwaW5ncygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3M/bWVyY2hhbnRJZD0ke3NlbGVjdGVkTWVyY2hhbnRJZH1gO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3MgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIE1hcHBpbmdbXTtcbiAgICAgICAgc2V0TWFwcGluZ3MoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtYXBwaW5nc1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNYXBwaW5ncygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW3NlbGVjdGVkTWVyY2hhbnRJZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVBhcnRSb2xlID0gKHJhd0NhdGVnb3J5OiBzdHJpbmcsIG5ld1JvbGU6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcHBpbmdzKChwcmV2KSA9PlxuICAgICAgcHJldi5tYXAoKG0pID0+XG4gICAgICAgIG0ucmF3Q2F0ZWdvcnkgPT09IHJhd0NhdGVnb3J5XG4gICAgICAgICAgPyB7IC4uLm0sIG1hcHBlZFBhcnRSb2xlOiBuZXdSb2xlIHx8IG51bGwgfVxuICAgICAgICAgIDogbSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG4gICAgc2V0U2F2aW5nKHRydWUpO1xuICAgIHNldEVycm9yKG51bGwpO1xuICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhdmUgZWFjaCBtYXBwaW5nIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCByZXF1ZXN0czogUHJvbWlzZTxSZXNwb25zZT5bXSA9IG1hcHBpbmdzLm1hcCgobSkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBVcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1lcmNoYW50SWQ6IHNlbGVjdGVkTWVyY2hhbnRJZCxcbiAgICAgICAgICByYXdDYXRlZ29yeTogbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICBtYXBwZWRQYXJ0Um9sZTogbS5tYXBwZWRQYXJ0Um9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9hZG1pbi9tZXJjaGFudC1jYXRlZ29yeS1tYXBwaW5nc2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3BvbnNlcy5maWx0ZXIoKHIpID0+ICFyLm9rKTtcblxuICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU29tZSBtYXBwaW5ncyBmYWlsZWQgdG8gc2F2ZSAoJHtmYWlsZWQubGVuZ3RofSlgKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3VjY2Vzc01lc3NhZ2UoXCJNYXBwaW5ncyBzYXZlZC4gUmUtcnVuIHRoZSBpbXBvcnQgdG8gYXBwbHkgY2hhbmdlcy5cIik7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIHNhdmUgbWFwcGluZ3NcIik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkTWVyY2hhbnROYW1lID1cbiAgICBtZXJjaGFudHMuZmluZCgobSkgPT4gbS5pZCA9PT0gc2VsZWN0ZWRNZXJjaGFudElkKT8ubmFtZSA/PyBcIuKAlFwiO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTV4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmQgLyBBZG1pblxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBNZXJjaGFudCBDYXRlZ29yeSBNYXBwaW5nXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgTm9ybWFsaXplIGVhY2ggbWVyY2hhbnQmYXBvcztzIGNhdGVnb3J5IG5hbWVzIGludG8geW91ciBpbnRlcm5hbFxuICAgICAgICAgICAgICBwYXJ0IHJvbGVzICh1cHBlciwgYmFycmVsLCBoYW5kZ3VhcmQsIGV0Yy4pLiBVbm1hcHBlZCBjYXRlZ29yaWVzXG4gICAgICAgICAgICAgIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgaW1wb3J0IHVudGlsIHRoZXkgYXJlIG1hcHBlZCBoZXJlLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMCBtYi0xXCI+XG4gICAgICAgICAgICAgIFNlbGVjdCBNZXJjaGFudFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRNZXJjaGFudElkID8/IFwiXCJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoXG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA/IE51bWJlcihlLnRhcmdldC52YWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+4oCUIENob29zZSBtZXJjaGFudCDigJQ8L29wdGlvbj5cbiAgICAgICAgICAgICAge21lcmNoYW50cy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17bS5pZH0gdmFsdWU9e20uaWR9PlxuICAgICAgICAgICAgICAgICAge20ubmFtZX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1yZWQtNTAwLzYwIGJnLXJlZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1yZWQtMjAwXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItZW1lcmFsZC01MDAvNjAgYmctZW1lcmFsZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1lbWVyYWxkLTIwMFwiPlxuICAgICAgICAgICAgICB7c3VjY2Vzc01lc3NhZ2V9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgeyFzZWxlY3RlZE1lcmNoYW50SWQgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgQ2hvb3NlIGEgbWVyY2hhbnQgYWJvdmUgdG8gdmlldyBjYXRlZ29yeSBtYXBwaW5ncy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbG9hZGluZ01hcHBpbmdzID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgbWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPuKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBtYXBwaW5ncy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgTm8gY2F0ZWdvcnkgcm93cyB5ZXQgZm9yIHRoaXMgbWVyY2hhbnQuIE9uY2UgeW91IHJ1biBhbiBpbXBvcnQsXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQgY2F0ZWdvcmllcyB3aWxsIGFwcGVhciBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTMgdGV4dC14cyB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIE1hcHBpbmdzIGZvcntcIiBcIn1cbiAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPi57XCIgXCJ9XG4gICAgICAgICAgICAgICAgICBTZXQgYSBwYXJ0IHJvbGUgZm9yIGVhY2ggcmF3IGNhdGVnb3J5LiBVbm1hcHBlZCBjYXRlZ29yaWVzIHdpbGxcbiAgICAgICAgICAgICAgICAgIGJlIHNraXBwZWQgYnkgdGhlIGltcG9ydGVyLlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgdGV4dC1bMC43cmVtXSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC0zIHctMyByb3VuZGVkIGJvcmRlci16aW5jLTYwMCBiZy16aW5jLTkwMFwiXG4gICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9e3Nob3dPbmx5TWFwcGVkfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHNldFNob3dPbmx5TWFwcGVkKGUudGFyZ2V0LmNoZWNrZWQpfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPlNob3cgb25seSBtYXBwZWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwibWluLXctZnVsbCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgdGV4dC14cyB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+UmF3IENhdGVnb3J5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPk1hcHBlZCBQYXJ0IFJvbGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHt2aXNpYmxlTWFwcGluZ3MubWFwKChtKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgPHRyXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXk9e20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy05MDAgbGFzdDpib3JkZXItYi0wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXppbmMtMjAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLnJhd0NhdGVnb3J5fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJyb3VuZGVkLW1kIGJvcmRlciBib3JkZXItemluYy03MDAgYmctemluYy05MDAgcHgtMiBweS0xIHRleHQteHMgdGV4dC16aW5jLTEwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e20ubWFwcGVkUGFydFJvbGUgPz8gXCJcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2VQYXJ0Um9sZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1BBUlRfUk9MRV9PUFRJT05TLm1hcCgob3B0KSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17b3B0LnZhbHVlfSB2YWx1ZT17b3B0LnZhbHVlfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge29wdC5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3NOYW1lPVwicHktMiBwci00IGFsaWduLXRvcCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHttLm1hcHBlZFBhcnRSb2xlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciByb3VuZGVkLWZ1bGwgYmctZW1lcmFsZC01MDAvMTAgcHgtMiBweS0wLjUgdGV4dC1bMC43cmVtXSBmb250LW1lZGl1bSB0ZXh0LWVtZXJhbGQtMzAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICkgOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBiZy16aW5jLTcwMC80MCBweC0yIHB5LTAuNSB0ZXh0LVswLjdyZW1dIGZvbnQtbWVkaXVtIHRleHQtemluYy0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubWFwcGVkIC8gSWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICA8L3Rib2R5PlxuICAgICAgICAgICAgICAgIDwvdGFibGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBmbGV4IGp1c3RpZnktZW5kXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICBvbkNsaWNrPXtoYW5kbGVTYXZlfVxuICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3NhdmluZ31cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYmctYW1iZXItNDAwIHB4LTQgcHktMiB0ZXh0LXNtIGZvbnQtc2VtaWJvbGQgdGV4dC1ibGFjayBob3ZlcjpiZy1hbWJlci0zMDAgZGlzYWJsZWQ6b3BhY2l0eS01MFwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3NhdmluZyA/IFwiU2F2aW5n4oCmXCIgOiBcIlNhdmUgTWFwcGluZ3NcIn1cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgICApfVxuICAgICAgICA8L3NlY3Rpb24+XG4gICAgICA8L2Rpdj5cbiAgICA8L21haW4+XG4gICk7XG59Il0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZVN0YXRlIiwidXNlTWVtbyIsInByb2Nlc3MiLCJBUElfQkFTRV9VUkwiLCJlbnYiLCJORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwiLCJQQVJUX1JPTEVfT1BUSU9OUyIsInZhbHVlIiwibGFiZWwiLCJDYXRlZ29yeU1hcHBpbmdzUGFnZSIsIm1lcmNoYW50cyIsInNldE1lcmNoYW50cyIsInNlbGVjdGVkTWVyY2hhbnRJZCIsInNldFNlbGVjdGVkTWVyY2hhbnRJZCIsIm1hcHBpbmdzIiwic2V0TWFwcGluZ3MiLCJsb2FkaW5nTWFwcGluZ3MiLCJzZXRMb2FkaW5nTWFwcGluZ3MiLCJzYXZpbmciLCJzZXRTYXZpbmciLCJlcnJvciIsInNldEVycm9yIiwic3VjY2Vzc01lc3NhZ2UiLCJzZXRTdWNjZXNzTWVzc2FnZSIsInNob3dPbmx5TWFwcGVkIiwic2V0U2hvd09ubHlNYXBwZWQiLCJzb3J0ZWRNYXBwaW5ncyIsInNvcnQiLCJhIiwiYiIsImFNYXBwZWQiLCJtYXBwZWRQYXJ0Um9sZSIsImJNYXBwZWQiLCJyYXdDYXRlZ29yeSIsImxvY2FsZUNvbXBhcmUiLCJ2aXNpYmxlTWFwcGluZ3MiLCJmaWx0ZXIiLCJtIiwiZmV0Y2hNZXJjaGFudHMiLCJyZXMiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsImxlbmd0aCIsImlkIiwiZXJyIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hNYXBwaW5ncyIsInVybCIsInNpZ25hbCIsIm5hbWUiLCJhYm9ydCIsImhhbmRsZUNoYW5nZVBhcnRSb2xlIiwibmV3Um9sZSIsInByZXYiLCJtYXAiLCJoYW5kbGVTYXZlIiwicmVxdWVzdHMiLCJwYXlsb2FkIiwibWVyY2hhbnRJZCIsIm1ldGhvZCIsImhlYWRlcnMiLCJib2R5IiwiSlNPTiIsInN0cmluZ2lmeSIsInJlc3BvbnNlcyIsIlByb21pc2UiLCJhbGwiLCJmYWlsZWQiLCJyIiwic2VsZWN0ZWRNZXJjaGFudE5hbWUiLCJmaW5kIiwibWFpbiIsImNsYXNzTmFtZSIsImRpdiIsImhlYWRlciIsInAiLCJoMSIsInNlbGVjdCIsIm9uQ2hhbmdlIiwiZSIsInRhcmdldCIsIk51bWJlciIsIm9wdGlvbiIsInNlY3Rpb24iLCJzcGFuIiwiaW5wdXQiLCJ0eXBlIiwiY2hlY2tlZCIsInRhYmxlIiwidGhlYWQiLCJ0ciIsInRoIiwidGJvZHkiLCJ0ZCIsIm9wdCIsImJ1dHRvbiIsIm9uQ2xpY2siLCJkaXNhYmxlZCJdLCJzb3VyY2VSb290IjoiIn0=\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/admin/category-mappings/page.94cf6984137bd852.hot-update.js b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.94cf6984137bd852.hot-update.js new file mode 100644 index 0000000..80c4a4f --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.94cf6984137bd852.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 {\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 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 // 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: 186,\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: 189,\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: 192,\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: 185,\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: 200,\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: 212,\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: 214,\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: 203,\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: 199,\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: 184,\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: 224,\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: 229,\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: 235,\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: 240,\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: 239,\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: 243,\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 text-xs text-zinc-500\",\n children: [\n \"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: 250,\n columnNumber: 30\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: 249,\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: 259,\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: 260,\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: 261,\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: 258,\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: 257,\n columnNumber: 19\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"tbody\", {\n children: sortedMappings.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: 270,\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: 285,\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: 274,\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: 273,\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: 293,\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: 297,\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: 291,\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: 266,\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: 264,\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: 256,\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: 255,\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: 309,\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: 308,\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: 222,\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: 183,\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: 182,\n columnNumber: 5\n }, this);\n}\n_s(CategoryMappingsPage, \"QpetkV2St48HE1WaQHd3HZKP6Xo=\");\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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL2FkbWluL2NhdGVnb3J5LW1hcHBpbmdzL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFFcUQ7SUFHbkRHO0FBREYsTUFBTUMsZUFDSkQsQ0FBQUEsd0NBQUFBLE9BQU9BLENBQUNFLEdBQUcsQ0FBQ0Msd0JBQXdCLGNBQXBDSCxtREFBQUEsd0NBQXdDO0FBcUIxQyx3REFBd0Q7QUFDeEQsTUFBTUksb0JBQW9CO0lBQ3hCO1FBQUVDLE9BQU87UUFBSUMsT0FBTztJQUFlO0lBQ25DO1FBQUVELE9BQU87UUFBa0JDLE9BQU87SUFBaUI7SUFDbkQ7UUFBRUQsT0FBTztRQUFVQyxPQUFPO0lBQVM7SUFDbkM7UUFBRUQsT0FBTztRQUFhQyxPQUFPO0lBQVk7SUFDekM7UUFBRUQsT0FBTztRQUFtQkMsT0FBTztJQUFrQjtJQUNyRDtRQUFFRCxPQUFPO1FBQWNDLE9BQU87SUFBYTtJQUMzQztRQUFFRCxPQUFPO1FBQW1CQyxPQUFPO0lBQWtCO0lBQ3JEO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFnQjtJQUN6QztRQUFFRCxPQUFPO1FBQWtCQyxPQUFPO0lBQWlCO0lBQ25EO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFRO0lBQ2pDO1FBQUVELE9BQU87UUFBU0MsT0FBTztJQUFpQjtDQUMzQztBQUVjLFNBQVNDO1FBd0lwQkM7O0lBdklGLE1BQU0sQ0FBQ0EsV0FBV0MsYUFBYSxHQUFHWCwrQ0FBUUEsQ0FBYSxFQUFFO0lBQ3pELE1BQU0sQ0FBQ1ksb0JBQW9CQyxzQkFBc0IsR0FBR2IsK0NBQVFBLENBQzFEO0lBRUYsTUFBTSxDQUFDYyxVQUFVQyxZQUFZLEdBQUdmLCtDQUFRQSxDQUFZLEVBQUU7SUFDdEQsTUFBTSxDQUFDZ0IsaUJBQWlCQyxtQkFBbUIsR0FBR2pCLCtDQUFRQSxDQUFDO0lBQ3ZELE1BQU0sQ0FBQ2tCLFFBQVFD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bkIsRUFBRTFCLFdBQVc7Ozs7O2dEQW1DaEI7Ozs7Ozs7Ozs7Ozs7Ozs7OzhDQU1aLDhEQUFDOEM7b0NBQUlELFdBQVU7OENBQ2IsNEVBQUNvQjt3Q0FDQ0MsTUFBSzt3Q0FDTEMsU0FBU3hDO3dDQUNUeUMsVUFBVWpGO3dDQUNWMEQsV0FBVTtrREFFVDFELFNBQVMsWUFBWTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBU3hDO0dBelJ3QlQ7S0FBQUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvYWRtaW4vY2F0ZWdvcnktbWFwcGluZ3MvcGFnZS50c3g/NjMxYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgdXNlTWVtbyB9IGZyb20gXCJyZWFjdFwiO1xuXG5jb25zdCBBUElfQkFTRV9VUkwgPVxuICBwcm9jZXNzLmVudi5ORVhUX1BVQkxJQ19BUElfQkFTRV9VUkwgPz8gXCJodHRwOi8vbG9jYWxob3N0OjgwODBcIjtcblxudHlwZSBNZXJjaGFudCA9IHtcbiAgaWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xufTtcblxudHlwZSBNYXBwaW5nID0ge1xuICBpZDogbnVtYmVyIHwgbnVsbDsgICAgICAgICAgIC8vIG1pZ2h0IGJlIG51bGwgaWYganVzdCBjcmVhdGVkIGNsaWVudC1zaWRlXG4gIG1lcmNoYW50SWQ6IG51bWJlcjtcbiAgbWVyY2hhbnROYW1lOiBzdHJpbmc7XG4gIHJhd0NhdGVnb3J5OiBzdHJpbmc7XG4gIG1hcHBlZFBhcnRSb2xlOiBzdHJpbmcgfCBudWxsO1xufTtcblxudHlwZSBVcHNlcnRSZXF1ZXN0ID0ge1xuICBtZXJjaGFudElkOiBudW1iZXI7XG4gIHJhd0NhdGVnb3J5OiBzdHJpbmc7XG4gIG1hcHBlZFBhcnRSb2xlOiBzdHJpbmcgfCBudWxsO1xufTtcblxuLy8gS2VlcCB0aGlzIGluIHN5bmMgd2l0aCB5b3VyIGJhY2tlbmQgYHBhcnRSb2xlYCB2YWx1ZXNcbmNvbnN0IFBBUlRfUk9MRV9PUFRJT05TID0gW1xuICB7IHZhbHVlOiBcIlwiLCBsYWJlbDogXCLigJQgVW5tYXBwZWQg4oCUXCIgfSxcbiAgeyB2YWx1ZTogXCJ1cHBlci1yZWNlaXZlclwiLCBsYWJlbDogXCJVcHBlciBSZWNlaXZlclwiIH0sXG4gIHsgdmFsdWU6IFwiYmFycmVsXCIsIGxhYmVsOiBcIkJhcnJlbFwiIH0sXG4gIHsgdmFsdWU6IFwiaGFuZGd1YXJkXCIsIGxhYmVsOiBcIkhhbmRndWFyZFwiIH0sXG4gIHsgdmFsdWU6IFwiY2hhcmdpbmctaGFuZGxlXCIsIGxhYmVsOiBcIkNoYXJnaW5nIEhhbmRsZVwiIH0sXG4gIHsgdmFsdWU6IFwiYnVmZmVyLWtpdFwiLCBsYWJlbDogXCJCdWZmZXIgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1wYXJ0cy1raXRcIiwgbGFiZWw6IFwiTG93ZXIgUGFydHMgS2l0XCIgfSxcbiAgeyB2YWx1ZTogXCJzaWdodFwiLCBsYWJlbDogXCJTaWdodCAvIE9wdGljXCIgfSxcbiAgeyB2YWx1ZTogXCJsb3dlci1yZWNlaXZlclwiLCBsYWJlbDogXCJMb3dlciBSZWNlaXZlclwiIH0sXG4gIHsgdmFsdWU6IFwib3B0aWNcIiwgbGFiZWw6IFwiT3B0aWNcIiB9LFxuICB7IHZhbHVlOiBcInN0b2NrXCIsIGxhYmVsOiBcIlN0b2NrXCIgfSxcbiAgeyB2YWx1ZTogXCJvdGhlclwiLCBsYWJlbDogXCJPdGhlciAvIElnbm9yZVwiIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBDYXRlZ29yeU1hcHBpbmdzUGFnZSgpIHtcbiAgY29uc3QgW21lcmNoYW50cywgc2V0TWVyY2hhbnRzXSA9IHVzZVN0YXRlPE1lcmNoYW50W10+KFtdKTtcbiAgY29uc3QgW3NlbGVjdGVkTWVyY2hhbnRJZCwgc2V0U2VsZWN0ZWRNZXJjaGFudElkXSA9IHVzZVN0YXRlPG51bWJlciB8IG51bGw+KFxuICAgIG51bGwsXG4gICk7XG4gIGNvbnN0IFttYXBwaW5ncywgc2V0TWFwcGluZ3NdID0gdXNlU3RhdGU8TWFwcGluZ1tdPihbXSk7XG4gIGNvbnN0IFtsb2FkaW5nTWFwcGluZ3MsIHNldExvYWRpbmdNYXBwaW5nc10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtzYXZpbmcsIHNldFNhdmluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG4gIGNvbnN0IFtzdWNjZXNzTWVzc2FnZSwgc2V0U3VjY2Vzc01lc3NhZ2VdID0gdXNlU3RhdGU8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3Qgc29ydGVkTWFwcGluZ3MgPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBNYXBwZWQgcm93cyBmaXJzdCwgdGhlbiB1bm1hcHBlZDsgd2l0aGluIGVhY2ggZ3JvdXAsIGFscGhhIGJ5IHJhd0NhdGVnb3J5XG4gICAgcmV0dXJuIFsuLi5tYXBwaW5nc10uc29ydCgoYSwgYikgPT4ge1xuICAgICAgY29uc3QgYU1hcHBlZCA9ICEhYS5tYXBwZWRQYXJ0Um9sZTtcbiAgICAgIGNvbnN0IGJNYXBwZWQgPSAhIWIubWFwcGVkUGFydFJvbGU7XG5cbiAgICAgIGlmIChhTWFwcGVkICE9PSBiTWFwcGVkKSB7XG4gICAgICAgIHJldHVybiBhTWFwcGVkID8gLTEgOiAxOyAvLyBtYXBwZWQgZmlyc3RcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGEucmF3Q2F0ZWdvcnkubG9jYWxlQ29tcGFyZShiLnJhd0NhdGVnb3J5KTtcbiAgICB9KTtcbiAgfSwgW21hcHBpbmdzXSk7XG5cbiAgLy8gTG9hZCBtZXJjaGFudHNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaE1lcmNoYW50cygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnRzYCk7XG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHMgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YTogTWVyY2hhbnRbXSA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIHNldE1lcmNoYW50cyhkYXRhKTtcblxuICAgICAgICAvLyBBdXRvLXNlbGVjdCB0aGUgZmlyc3QgbWVyY2hhbnQgaWYgeW91IHdhbnRcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMCAmJiBzZWxlY3RlZE1lcmNoYW50SWQgPT09IG51bGwpIHtcbiAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoZGF0YVswXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtZXJjaGFudHNcIik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNZXJjaGFudHMoKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gIH0sIFtdKTtcblxuICAvLyBMb2FkIG1hcHBpbmdzIGZvciBzZWxlY3RlZCBtZXJjaGFudFxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG5cbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gICAgYXN5bmMgZnVuY3Rpb24gZmV0Y2hNYXBwaW5ncygpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG4gICAgICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgICAgIGNvbnN0IHVybCA9IGAke0FQSV9CQVNFX1VSTH0vYWRtaW4vbWVyY2hhbnQtY2F0ZWdvcnktbWFwcGluZ3M/bWVyY2hhbnRJZD0ke3NlbGVjdGVkTWVyY2hhbnRJZH1gO1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBmZXRjaCh1cmwsIHsgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCB9KTtcblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgbWFwcGluZ3MgKCR7cmVzLnN0YXR1c30pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRhID0gKGF3YWl0IHJlcy5qc29uKCkpIGFzIE1hcHBpbmdbXTtcbiAgICAgICAgc2V0TWFwcGluZ3MoZGF0YSk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgc2V0RXJyb3IoZXJyLm1lc3NhZ2UgPz8gXCJGYWlsZWQgdG8gbG9hZCBtYXBwaW5nc1wiKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHNldExvYWRpbmdNYXBwaW5ncyhmYWxzZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hNYXBwaW5ncygpO1xuXG4gICAgcmV0dXJuICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoKTtcbiAgfSwgW3NlbGVjdGVkTWVyY2hhbnRJZF0pO1xuXG4gIGNvbnN0IGhhbmRsZUNoYW5nZVBhcnRSb2xlID0gKHJhd0NhdGVnb3J5OiBzdHJpbmcsIG5ld1JvbGU6IHN0cmluZykgPT4ge1xuICAgIHNldE1hcHBpbmdzKChwcmV2KSA9PlxuICAgICAgcHJldi5tYXAoKG0pID0+XG4gICAgICAgIG0ucmF3Q2F0ZWdvcnkgPT09IHJhd0NhdGVnb3J5XG4gICAgICAgICAgPyB7IC4uLm0sIG1hcHBlZFBhcnRSb2xlOiBuZXdSb2xlIHx8IG51bGwgfVxuICAgICAgICAgIDogbSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICBjb25zdCBoYW5kbGVTYXZlID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghc2VsZWN0ZWRNZXJjaGFudElkKSByZXR1cm47XG4gICAgc2V0U2F2aW5nKHRydWUpO1xuICAgIHNldEVycm9yKG51bGwpO1xuICAgIHNldFN1Y2Nlc3NNZXNzYWdlKG51bGwpO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8vIFNhdmUgZWFjaCBtYXBwaW5nIGluIHBhcmFsbGVsXG4gICAgICBjb25zdCByZXF1ZXN0czogUHJvbWlzZTxSZXNwb25zZT5bXSA9IG1hcHBpbmdzLm1hcCgobSkgPT4ge1xuICAgICAgICBjb25zdCBwYXlsb2FkOiBVcHNlcnRSZXF1ZXN0ID0ge1xuICAgICAgICAgIG1lcmNoYW50SWQ6IHNlbGVjdGVkTWVyY2hhbnRJZCxcbiAgICAgICAgICByYXdDYXRlZ29yeTogbS5yYXdDYXRlZ29yeSxcbiAgICAgICAgICBtYXBwZWRQYXJ0Um9sZTogbS5tYXBwZWRQYXJ0Um9sZSxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gZmV0Y2goYCR7QVBJX0JBU0VfVVJMfS9hZG1pbi9tZXJjaGFudC1jYXRlZ29yeS1tYXBwaW5nc2AsIHtcbiAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCksXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlcyA9IGF3YWl0IFByb21pc2UuYWxsKHJlcXVlc3RzKTtcbiAgICAgIGNvbnN0IGZhaWxlZCA9IHJlc3BvbnNlcy5maWx0ZXIoKHIpID0+ICFyLm9rKTtcblxuICAgICAgaWYgKGZhaWxlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgU29tZSBtYXBwaW5ncyBmYWlsZWQgdG8gc2F2ZSAoJHtmYWlsZWQubGVuZ3RofSlgKTtcbiAgICAgIH1cblxuICAgICAgc2V0U3VjY2Vzc01lc3NhZ2UoXCJNYXBwaW5ncyBzYXZlZC4gUmUtcnVuIHRoZSBpbXBvcnQgdG8gYXBwbHkgY2hhbmdlcy5cIik7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIHNhdmUgbWFwcGluZ3NcIik7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldFNhdmluZyhmYWxzZSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHNlbGVjdGVkTWVyY2hhbnROYW1lID1cbiAgICBtZXJjaGFudHMuZmluZCgobSkgPT4gbS5pZCA9PT0gc2VsZWN0ZWRNZXJjaGFudElkKT8ubmFtZSA/PyBcIuKAlFwiO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTV4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTMgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmQgLyBBZG1pblxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPGgxIGNsYXNzTmFtZT1cIm10LTEgdGV4dC0yeGwgbWQ6dGV4dC0zeGwgZm9udC1zZW1pYm9sZCB0cmFja2luZy10aWdodFwiPlxuICAgICAgICAgICAgICBNZXJjaGFudCBDYXRlZ29yeSBNYXBwaW5nXG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgTm9ybWFsaXplIGVhY2ggbWVyY2hhbnQmYXBvcztzIGNhdGVnb3J5IG5hbWVzIGludG8geW91ciBpbnRlcm5hbFxuICAgICAgICAgICAgICBwYXJ0IHJvbGVzICh1cHBlciwgYmFycmVsLCBoYW5kZ3VhcmQsIGV0Yy4pLiBVbm1hcHBlZCBjYXRlZ29yaWVzXG4gICAgICAgICAgICAgIHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgaW1wb3J0IHVudGlsIHRoZXkgYXJlIG1hcHBlZCBoZXJlLlxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJibG9jayB0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC16aW5jLTQwMCBtYi0xXCI+XG4gICAgICAgICAgICAgIFNlbGVjdCBNZXJjaGFudFxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgIDxzZWxlY3RcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLXppbmMtNzAwIGJnLXppbmMtOTAwIHB4LTMgcHktMiB0ZXh0LXNtIHRleHQtemluYy0xMDBcIlxuICAgICAgICAgICAgICB2YWx1ZT17c2VsZWN0ZWRNZXJjaGFudElkID8/IFwiXCJ9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZE1lcmNoYW50SWQoXG4gICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSA/IE51bWJlcihlLnRhcmdldC52YWx1ZSkgOiBudWxsLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+4oCUIENob29zZSBtZXJjaGFudCDigJQ8L29wdGlvbj5cbiAgICAgICAgICAgICAge21lcmNoYW50cy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICA8b3B0aW9uIGtleT17bS5pZH0gdmFsdWU9e20uaWR9PlxuICAgICAgICAgICAgICAgICAge20ubmFtZX1cbiAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9oZWFkZXI+XG5cbiAgICAgICAgPHNlY3Rpb24gY2xhc3NOYW1lPVwicm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzYwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICB7ZXJyb3IgJiYgKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtYi0zIHJvdW5kZWQgYm9yZGVyIGJvcmRlci1yZWQtNTAwLzYwIGJnLXJlZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1yZWQtMjAwXCI+XG4gICAgICAgICAgICAgIHtlcnJvcn1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgICAge3N1Y2Nlc3NNZXNzYWdlICYmIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyByb3VuZGVkIGJvcmRlciBib3JkZXItZW1lcmFsZC01MDAvNjAgYmctZW1lcmFsZC01MDAvMTAgcHgtMyBweS0yIHRleHQteHMgdGV4dC1lbWVyYWxkLTIwMFwiPlxuICAgICAgICAgICAgICB7c3VjY2Vzc01lc3NhZ2V9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApfVxuXG4gICAgICAgICAgeyFzZWxlY3RlZE1lcmNoYW50SWQgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgQ2hvb3NlIGEgbWVyY2hhbnQgYWJvdmUgdG8gdmlldyBjYXRlZ29yeSBtYXBwaW5ncy5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICApIDogbG9hZGluZ01hcHBpbmdzID8gKFxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1zbSB0ZXh0LXppbmMtNTAwXCI+XG4gICAgICAgICAgICAgIExvYWRpbmcgbWFwcGluZ3MgZm9yIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtemluYy0zMDBcIj57c2VsZWN0ZWRNZXJjaGFudE5hbWV9PC9zcGFuPuKAplxuICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICkgOiBtYXBwaW5ncy5sZW5ndGggPT09IDAgPyAoXG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgTm8gY2F0ZWdvcnkgcm93cyB5ZXQgZm9yIHRoaXMgbWVyY2hhbnQuIE9uY2UgeW91IHJ1biBhbiBpbXBvcnQsXG4gICAgICAgICAgICAgIGRpc2NvdmVyZWQgY2F0ZWdvcmllcyB3aWxsIGFwcGVhciBoZXJlIGF1dG9tYXRpY2FsbHkuXG4gICAgICAgICAgICA8L3A+XG4gICAgICAgICAgKSA6IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWItMyB0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBNYXBwaW5ncyBmb3IgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTMwMFwiPntzZWxlY3RlZE1lcmNoYW50TmFtZX08L3NwYW4+LntcIiBcIn1cbiAgICAgICAgICAgICAgICBTZXQgYSBwYXJ0IHJvbGUgZm9yIGVhY2ggcmF3IGNhdGVnb3J5LiBVbm1hcHBlZCBjYXRlZ29yaWVzIHdpbGxcbiAgICAgICAgICAgICAgICBiZSBza2lwcGVkIGJ5IHRoZSBpbXBvcnRlci5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJvdmVyZmxvdy14LWF1dG9cIj5cbiAgICAgICAgICAgICAgICA8dGFibGUgY2xhc3NOYW1lPVwibWluLXctZnVsbCB0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItemluYy04MDAgdGV4dC14cyB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+UmF3IENhdGVnb3J5PC90aD5cbiAgICAgICAgICAgICAgICAgICAgICA8dGggY2xhc3NOYW1lPVwicHktMiB0ZXh0LWxlZnQgcHItNFwiPk1hcHBlZCBQYXJ0IFJvbGU8L3RoPlxuICAgICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzc05hbWU9XCJweS0yIHRleHQtbGVmdCBwci00XCI+U3RhdHVzPC90aD5cbiAgICAgICAgICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XG4gICAgICAgICAgICAgICAgICAgIHtzb3J0ZWRNYXBwaW5ncy5tYXAoKG0pID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8dHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17bS5yYXdDYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1iIGJvcmRlci16aW5jLTkwMCBsYXN0OmJvcmRlci1iLTBcIlxuICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wIHRleHQtemluYy0yMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge20ucmF3Q2F0ZWdvcnl9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzTmFtZT1cInB5LTIgcHItNCBhbGlnbi10b3BcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMCBweC0yIHB5LTEgdGV4dC14cyB0ZXh0LXppbmMtMTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17bS5tYXBwZWRQYXJ0Um9sZSA/PyBcIlwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNoYW5nZVBhcnRSb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtLnJhd0NhdGVnb3J5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnRhcmdldC52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7UEFSVF9ST0xFX09QVElPTlMubWFwKChvcHQpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24ga2V5PXtvcHQudmFsdWV9IHZhbHVlPXtvcHQudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3B0LmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzc05hbWU9XCJweS0yIHByLTQgYWxpZ24tdG9wIHRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge20ubWFwcGVkUGFydFJvbGUgPyAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHJvdW5kZWQtZnVsbCBiZy1lbWVyYWxkLTUwMC8xMCBweC0yIHB5LTAuNSB0ZXh0LVswLjdyZW1dIGZvbnQtbWVkaXVtIHRleHQtZW1lcmFsZC0zMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIgcm91bmRlZC1mdWxsIGJnLXppbmMtNzAwLzQwIHB4LTIgcHktMC41IHRleHQtWzAuN3JlbV0gZm9udC1tZWRpdW0gdGV4dC16aW5jLTMwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5tYXBwZWQgLyBJZ25vcmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IGZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZVNhdmV9XG4gICAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2F2aW5nfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicm91bmRlZC1tZCBiZy1hbWJlci00MDAgcHgtNCBweS0yIHRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LWJsYWNrIGhvdmVyOmJnLWFtYmVyLTMwMCBkaXNhYmxlZDpvcGFjaXR5LTUwXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7c2F2aW5nID8gXCJTYXZpbmfigKZcIiA6IFwiU2F2ZSBNYXBwaW5nc1wifVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvc2VjdGlvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWFpbj5cbiAgKTtcbn0iXSwibmFtZXMiOlsidXNlRWZmZWN0IiwidXNlU3RhdGUiLCJ1c2VNZW1vIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlBBUlRfUk9MRV9PUFRJT05TIiwidmFsdWUiLCJsYWJlbCIsIkNhdGVnb3J5TWFwcGluZ3NQYWdlIiwibWVyY2hhbnRzIiwic2V0TWVyY2hhbnRzIiwic2VsZWN0ZWRNZXJjaGFudElkIiwic2V0U2VsZWN0ZWRNZXJjaGFudElkIiwibWFwcGluZ3MiLCJzZXRNYXBwaW5ncyIsImxvYWRpbmdNYXBwaW5ncyIsInNldExvYWRpbmdNYXBwaW5ncyIsInNhdmluZyIsInNldFNhdmluZyIsImVycm9yIiwic2V0RXJyb3IiLCJzdWNjZXNzTWVzc2FnZSIsInNldFN1Y2Nlc3NNZXNzYWdlIiwic29ydGVkTWFwcGluZ3MiLCJzb3J0IiwiYSIsImIiLCJhTWFwcGVkIiwibWFwcGVkUGFydFJvbGUiLCJiTWFwcGVkIiwicmF3Q2F0ZWdvcnkiLCJsb2NhbGVDb21wYXJlIiwiZmV0Y2hNZXJjaGFudHMiLCJyZXMiLCJmZXRjaCIsIm9rIiwiRXJyb3IiLCJzdGF0dXMiLCJkYXRhIiwianNvbiIsImxlbmd0aCIsImlkIiwiZXJyIiwiY29uc29sZSIsIm1lc3NhZ2UiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hNYXBwaW5ncyIsInVybCIsInNpZ25hbCIsIm5hbWUiLCJhYm9ydCIsImhhbmRsZUNoYW5nZVBhcnRSb2xlIiwibmV3Um9sZSIsInByZXYiLCJtYXAiLCJtIiwiaGFuZGxlU2F2ZSIsInJlcXVlc3RzIiwicGF5bG9hZCIsIm1lcmNoYW50SWQiLCJtZXRob2QiLCJoZWFkZXJzIiwiYm9keSIsIkpTT04iLCJzdHJpbmdpZnkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwiZmFpbGVkIiwiZmlsdGVyIiwiciIsInNlbGVjdGVkTWVyY2hhbnROYW1lIiwiZmluZCIsIm1haW4iLCJjbGFzc05hbWUiLCJkaXYiLCJoZWFkZXIiLCJwIiwiaDEiLCJzZWxlY3QiLCJvbkNoYW5nZSIsImUiLCJ0YXJnZXQiLCJOdW1iZXIiLCJvcHRpb24iLCJzZWN0aW9uIiwic3BhbiIsInRhYmxlIiwidGhlYWQiLCJ0ciIsInRoIiwidGJvZHkiLCJ0ZCIsIm9wdCIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwiZGlzYWJsZWQiXSwic291cmNlUm9vdCI6IiJ9\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/admin/category-mappings/page.ef2c3cea36ba80d6.hot-update.js b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.ef2c3cea36ba80d6.hot-update.js new file mode 100644 index 0000000..021987e --- /dev/null +++ b/.next/static/webpack/app/gunbuilder/admin/category-mappings/page.ef2c3cea36ba80d6.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 {\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")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/app/layout.445131246b4eff72.hot-update.js b/.next/static/webpack/app/layout.445131246b4eff72.hot-update.js new file mode 100644 index 0000000..3d774fb --- /dev/null +++ b/.next/static/webpack/app/layout.445131246b4eff72.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\"] = (\"3a328a107f23\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCIzYTMyOGExMDdmMjNcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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.94cf6984137bd852.hot-update.js b/.next/static/webpack/app/layout.94cf6984137bd852.hot-update.js new file mode 100644 index 0000000..444cb90 --- /dev/null +++ b/.next/static/webpack/app/layout.94cf6984137bd852.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\"] = (\"e2a80d7b87cf\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCJlMmE4MGQ3Yjg3Y2ZcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\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.ef2c3cea36ba80d6.hot-update.js b/.next/static/webpack/app/layout.ef2c3cea36ba80d6.hot-update.js new file mode 100644 index 0000000..ccdea3b --- /dev/null +++ b/.next/static/webpack/app/layout.ef2c3cea36ba80d6.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\"] = (\"52fdc5f75b38\");\nif (true) { module.hot.accept() }\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9nbG9iYWxzLmNzcyIsIm1hcHBpbmdzIjoiO0FBQUEsK0RBQWUsY0FBYztBQUM3QixJQUFJLElBQVUsSUFBSSxpQkFBaUIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2dsb2JhbHMuY3NzPzk1YWEiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGRlZmF1bHQgXCI1MmZkYzVmNzViMzhcIlxuaWYgKG1vZHVsZS5ob3QpIHsgbW9kdWxlLmhvdC5hY2NlcHQoKSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/globals.css\n")); + +/***/ }) + +}); \ No newline at end of file diff --git a/.next/static/webpack/ef2c3cea36ba80d6.webpack.hot-update.json b/.next/static/webpack/ef2c3cea36ba80d6.webpack.hot-update.json new file mode 100644 index 0000000..2e5c8a6 --- /dev/null +++ b/.next/static/webpack/ef2c3cea36ba80d6.webpack.hot-update.json @@ -0,0 +1 @@ +{"c":["app/layout","app/gunbuilder/admin/category-mappings/page","webpack"],"r":[],"m":[]} \ No newline at end of file diff --git a/.next/static/webpack/webpack.445131246b4eff72.hot-update.js b/.next/static/webpack/webpack.445131246b4eff72.hot-update.js new file mode 100644 index 0000000..85bdb49 --- /dev/null +++ b/.next/static/webpack/webpack.445131246b4eff72.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 "ef2c3cea36ba80d6"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.94cf6984137bd852.hot-update.js b/.next/static/webpack/webpack.94cf6984137bd852.hot-update.js new file mode 100644 index 0000000..aa8e7e7 --- /dev/null +++ b/.next/static/webpack/webpack.94cf6984137bd852.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 "445131246b4eff72"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/static/webpack/webpack.ef2c3cea36ba80d6.hot-update.js b/.next/static/webpack/webpack.ef2c3cea36ba80d6.hot-update.js new file mode 100644 index 0000000..4fbea23 --- /dev/null +++ b/.next/static/webpack/webpack.ef2c3cea36ba80d6.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 "99147c32c43e763f"; } +/******/ }(); +/******/ +/******/ } +); \ No newline at end of file diff --git a/.next/trace b/.next/trace index 3c3bce2..91a32e3 100644 --- a/.next/trace +++ b/.next/trace @@ -26,3 +26,6 @@ [{"name":"handle-request","duration":19605,"timestamp":956177499998,"id":1657,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764588821032,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956177519623,"id":1659,"parentId":1657,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"450019328","memory.heapUsed":"167143000","memory.heapTotal":"190267392"},"startTime":1764588821051,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":20674,"timestamp":956177500268,"id":1658,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764588821032,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956177520949,"id":1660,"parentId":1658,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"450019328","memory.heapUsed":"167174392","memory.heapTotal":"190267392"},"startTime":1764588821053,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":13023,"timestamp":956212766250,"id":1670,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":13208,"timestamp":956212766268,"id":1672,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":14015,"timestamp":956212766037,"id":1665,"parentId":1664,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":14802,"timestamp":956212766261,"id":1671,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":9990,"timestamp":956212777560,"id":1677,"parentId":1676,"tags":{},"startTime":1764588856309,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":10187,"timestamp":956212777370,"id":1676,"parentId":1675,"tags":{},"startTime":1764588856309,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":18940,"timestamp":956212777134,"id":1675,"parentId":1663,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764588856309,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":30873,"timestamp":956212766231,"id":1669,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":31639,"timestamp":956212766205,"id":1667,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":31536,"timestamp":956212766311,"id":1673,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":15216,"timestamp":956212782649,"id":1679,"parentId":1678,"tags":{},"startTime":1764588856314,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":39726,"timestamp":956212766187,"id":1666,"parentId":1664,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":27307,"timestamp":956212797914,"id":1681,"parentId":1680,"tags":{},"startTime":1764588856329,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":27627,"timestamp":956212797894,"id":1680,"parentId":1678,"tags":{},"startTime":1764588856329,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":3875,"timestamp":956212825548,"id":1682,"parentId":1678,"tags":{"astUsed":"true"},"startTime":1764588856357,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":47655,"timestamp":956212782489,"id":1678,"parentId":1674,"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":1764588856314,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":55574,"timestamp":956212776504,"id":1674,"parentId":1663,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764588856308,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":50,"timestamp":956212832301,"id":1683,"parentId":1674,"tags":{},"startTime":1764588856364,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":66157,"timestamp":956212766219,"id":1668,"parentId":1664,"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":1764588856298,"traceId":"d91921d76e888ff4"},{"name":"make","duration":66832,"timestamp":956212765564,"id":1664,"parentId":1663,"tags":{},"startTime":1764588856297,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":889,"timestamp":956212833796,"id":1685,"parentId":1684,"tags":{},"startTime":1764588856365,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":3,"timestamp":956212834702,"id":1687,"parentId":1684,"tags":{},"startTime":1764588856366,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":27,"timestamp":956212834714,"id":1688,"parentId":1684,"tags":{},"startTime":1764588856366,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":4,"timestamp":956212834755,"id":1689,"parentId":1684,"tags":{},"startTime":1764588856366,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":956212834773,"id":1690,"parentId":1684,"tags":{},"startTime":1764588856366,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":433,"timestamp":956212834695,"id":1686,"parentId":1684,"tags":{},"startTime":1764588856366,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":537,"timestamp":956212836004,"id":1691,"parentId":1684,"tags":{},"startTime":1764588856368,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":1367,"timestamp":956212836551,"id":1692,"parentId":1684,"tags":{},"startTime":1764588856368,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":2574,"timestamp":956212838758,"id":1693,"parentId":1684,"tags":{},"startTime":1764588856370,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":158,"timestamp":956212841331,"id":1694,"parentId":1684,"tags":{},"startTime":1764588856373,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":63,"timestamp":956212841477,"id":1695,"parentId":1684,"tags":{},"startTime":1764588856373,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":2946,"timestamp":956212841544,"id":1696,"parentId":1684,"tags":{},"startTime":1764588856373,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":70,"timestamp":956212845311,"id":1698,"parentId":1663,"tags":{},"startTime":1764588856377,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":127,"timestamp":956212845258,"id":1697,"parentId":1663,"tags":{},"startTime":1764588856377,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":12903,"timestamp":956212833427,"id":1684,"parentId":1663,"tags":{},"startTime":1764588856365,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":81407,"timestamp":956212764941,"id":1663,"parentId":1661,"tags":{"name":"client"},"startTime":1764588856296,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":6925,"timestamp":956212846364,"id":1699,"parentId":1661,"tags":{},"startTime":1764588856378,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":97180,"timestamp":956212756574,"id":1661,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764588856288,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":0,"timestamp":956212855367,"id":1702,"parentId":3,"tags":{},"startTime":1764588856387,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":0,"timestamp":956212855388,"id":1703,"parentId":3,"tags":{},"startTime":1764588856387,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4937,"timestamp":956212856413,"id":1705,"parentId":1701,"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":1764588856388,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4943,"timestamp":956212856415,"id":1706,"parentId":1701,"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":1764588856388,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4945,"timestamp":956212856417,"id":1707,"parentId":1701,"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":1764588856388,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5377,"timestamp":956212856392,"id":1704,"parentId":1701,"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":1764588856388,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":1086,"timestamp":956212860919,"id":1711,"parentId":1710,"tags":{},"startTime":1764588856392,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1160,"timestamp":956212860849,"id":1710,"parentId":1709,"tags":{},"startTime":1764588856392,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":2074,"timestamp":956212860678,"id":1709,"parentId":1700,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764588856392,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6671,"timestamp":956212856419,"id":1708,"parentId":1701,"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":1764588856388,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":2344,"timestamp":956212865090,"id":1729,"parentId":1728,"tags":{},"startTime":1764588856397,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":2397,"timestamp":956212865040,"id":1728,"parentId":1727,"tags":{},"startTime":1764588856397,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":4804,"timestamp":956212864947,"id":1727,"parentId":1700,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764588856396,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":110000,"timestamp":956212757219,"id":1730,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764588856402,"traceId":"d91921d76e888ff4"},{"name":"make","duration":15378,"timestamp":956212854917,"id":1701,"parentId":1700,"tags":{},"startTime":1764588856386,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1408,"timestamp":956212871414,"id":1732,"parentId":1731,"tags":{},"startTime":1764588856403,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":1,"timestamp":956212872834,"id":1734,"parentId":1731,"tags":{},"startTime":1764588856404,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":1346,"timestamp":956212872842,"id":1735,"parentId":1731,"tags":{},"startTime":1764588856404,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":956212874197,"id":1736,"parentId":1731,"tags":{},"startTime":1764588856406,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":1,"timestamp":956212874207,"id":1737,"parentId":1731,"tags":{},"startTime":1764588856406,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":1611,"timestamp":956212872827,"id":1733,"parentId":1731,"tags":{},"startTime":1764588856404,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":229,"timestamp":956212875032,"id":1738,"parentId":1731,"tags":{},"startTime":1764588856407,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":673,"timestamp":956212875265,"id":1739,"parentId":1731,"tags":{},"startTime":1764588856407,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":516,"timestamp":956212876433,"id":1740,"parentId":1731,"tags":{},"startTime":1764588856408,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":890,"timestamp":956212876949,"id":1741,"parentId":1731,"tags":{},"startTime":1764588856408,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":29,"timestamp":956212877832,"id":1742,"parentId":1731,"tags":{},"startTime":1764588856409,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1070,"timestamp":956212877865,"id":1743,"parentId":1731,"tags":{},"startTime":1764588856409,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":8630,"timestamp":956212871237,"id":1731,"parentId":1700,"tags":{},"startTime":1764588856403,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":26456,"timestamp":956212854763,"id":1700,"parentId":1662,"tags":{"name":"server"},"startTime":1764588856386,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":1451,"timestamp":956212881228,"id":1744,"parentId":1662,"tags":{},"startTime":1764588856413,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":125723,"timestamp":956212757349,"id":1662,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764588856289,"traceId":"d91921d76e888ff4"}] [{"name":"client-hmr-latency","duration":136000,"timestamp":956212757059,"id":1746,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/admin/category-mappings/page.tsx"],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764588856426,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":7625,"timestamp":956212887962,"id":1745,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764588856419,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956212895602,"id":1748,"parentId":1745,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"459571200","memory.heapUsed":"179027968","memory.heapTotal":"208977920"},"startTime":1764588856427,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":6051,"timestamp":956212895217,"id":1747,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764588856427,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956212901286,"id":1749,"parentId":1747,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"460505088","memory.heapUsed":"180446808","memory.heapTotal":"209960960"},"startTime":1764588856433,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":16436,"timestamp":956233066496,"id":1759,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":16655,"timestamp":956233066508,"id":1761,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":18488,"timestamp":956233066364,"id":1754,"parentId":1753,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":19220,"timestamp":956233066502,"id":1760,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":6626,"timestamp":956233081102,"id":1766,"parentId":1765,"tags":{},"startTime":1764588876613,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":6871,"timestamp":956233080863,"id":1765,"parentId":1764,"tags":{},"startTime":1764588876612,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":20335,"timestamp":956233080543,"id":1764,"parentId":1752,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764588876612,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":36402,"timestamp":956233066488,"id":1758,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":36386,"timestamp":956233066514,"id":1762,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":36474,"timestamp":956233066476,"id":1756,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":15547,"timestamp":956233087412,"id":1768,"parentId":1767,"tags":{},"startTime":1764588876619,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":40342,"timestamp":956233066465,"id":1755,"parentId":1753,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":20570,"timestamp":956233102998,"id":1770,"parentId":1769,"tags":{},"startTime":1764588876635,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":20980,"timestamp":956233102982,"id":1769,"parentId":1767,"tags":{},"startTime":1764588876634,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":4203,"timestamp":956233123979,"id":1771,"parentId":1767,"tags":{"astUsed":"true"},"startTime":1764588876655,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":42823,"timestamp":956233087276,"id":1767,"parentId":1763,"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":1764588876619,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":51825,"timestamp":956233079892,"id":1763,"parentId":1752,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764588876611,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":15,"timestamp":956233131813,"id":1772,"parentId":1763,"tags":{},"startTime":1764588876663,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":65370,"timestamp":956233066482,"id":1757,"parentId":1753,"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":1764588876598,"traceId":"d91921d76e888ff4"},{"name":"make","duration":66071,"timestamp":956233065792,"id":1753,"parentId":1752,"tags":{},"startTime":1764588876597,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":766,"timestamp":956233155811,"id":1774,"parentId":1773,"tags":{},"startTime":1764588876687,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":4,"timestamp":956233156590,"id":1776,"parentId":1773,"tags":{},"startTime":1764588876688,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":30,"timestamp":956233156640,"id":1777,"parentId":1773,"tags":{},"startTime":1764588876688,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":5,"timestamp":956233156682,"id":1778,"parentId":1773,"tags":{},"startTime":1764588876688,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":956233156697,"id":1779,"parentId":1773,"tags":{},"startTime":1764588876688,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":440,"timestamp":956233156586,"id":1775,"parentId":1773,"tags":{},"startTime":1764588876688,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":242,"timestamp":956233157506,"id":1780,"parentId":1773,"tags":{},"startTime":1764588876689,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":847,"timestamp":956233157756,"id":1781,"parentId":1773,"tags":{},"startTime":1764588876689,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":1608,"timestamp":956233159247,"id":1782,"parentId":1773,"tags":{},"startTime":1764588876691,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":66,"timestamp":956233160856,"id":1783,"parentId":1773,"tags":{},"startTime":1764588876692,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":32,"timestamp":956233160916,"id":1784,"parentId":1773,"tags":{},"startTime":1764588876692,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":2438,"timestamp":956233160952,"id":1785,"parentId":1773,"tags":{},"startTime":1764588876692,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":46,"timestamp":956233163743,"id":1787,"parentId":1752,"tags":{},"startTime":1764588876695,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":81,"timestamp":956233163711,"id":1786,"parentId":1752,"tags":{},"startTime":1764588876695,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":9346,"timestamp":956233155149,"id":1773,"parentId":1752,"tags":{},"startTime":1764588876687,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":99283,"timestamp":956233065227,"id":1752,"parentId":1750,"tags":{"name":"client"},"startTime":1764588876597,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":2585,"timestamp":956233164524,"id":1788,"parentId":1750,"tags":{},"startTime":1764588876696,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":112253,"timestamp":956233055264,"id":1750,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764588876587,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":956233169304,"id":1791,"parentId":3,"tags":{},"startTime":1764588876701,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":956233169328,"id":1792,"parentId":3,"tags":{},"startTime":1764588876701,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4770,"timestamp":956233170337,"id":1794,"parentId":1790,"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":1764588876702,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4773,"timestamp":956233170340,"id":1795,"parentId":1790,"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":1764588876702,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4774,"timestamp":956233170342,"id":1796,"parentId":1790,"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":1764588876702,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5277,"timestamp":956233170307,"id":1793,"parentId":1790,"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":1764588876702,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":978,"timestamp":956233174791,"id":1800,"parentId":1799,"tags":{},"startTime":1764588876706,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1040,"timestamp":956233174731,"id":1799,"parentId":1798,"tags":{},"startTime":1764588876706,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":1952,"timestamp":956233174611,"id":1798,"parentId":1789,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764588876706,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":121000,"timestamp":956233055133,"id":1801,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764588876709,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6935,"timestamp":956233170344,"id":1797,"parentId":1790,"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":1764588876702,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":1932,"timestamp":956233178616,"id":1819,"parentId":1818,"tags":{},"startTime":1764588876710,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1984,"timestamp":956233178569,"id":1818,"parentId":1817,"tags":{},"startTime":1764588876710,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":5622,"timestamp":956233178498,"id":1817,"parentId":1789,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764588876710,"traceId":"d91921d76e888ff4"},{"name":"make","duration":15811,"timestamp":956233168749,"id":1790,"parentId":1789,"tags":{},"startTime":1764588876700,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1197,"timestamp":956233185361,"id":1821,"parentId":1820,"tags":{},"startTime":1764588876717,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":1,"timestamp":956233186564,"id":1823,"parentId":1820,"tags":{},"startTime":1764588876718,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":2372,"timestamp":956233186572,"id":1824,"parentId":1820,"tags":{},"startTime":1764588876718,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":2,"timestamp":956233188957,"id":1825,"parentId":1820,"tags":{},"startTime":1764588876720,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":1,"timestamp":956233188971,"id":1826,"parentId":1820,"tags":{},"startTime":1764588876720,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":2663,"timestamp":956233186562,"id":1822,"parentId":1820,"tags":{},"startTime":1764588876718,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":218,"timestamp":956233189763,"id":1827,"parentId":1820,"tags":{},"startTime":1764588876721,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":623,"timestamp":956233189989,"id":1828,"parentId":1820,"tags":{},"startTime":1764588876721,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":675,"timestamp":956233191015,"id":1829,"parentId":1820,"tags":{},"startTime":1764588876723,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":41,"timestamp":956233191691,"id":1830,"parentId":1820,"tags":{},"startTime":1764588876723,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":32,"timestamp":956233191729,"id":1831,"parentId":1820,"tags":{},"startTime":1764588876723,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1124,"timestamp":956233191763,"id":1832,"parentId":1820,"tags":{},"startTime":1764588876723,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":8588,"timestamp":956233185185,"id":1820,"parentId":1789,"tags":{},"startTime":1764588876717,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":26739,"timestamp":956233168590,"id":1789,"parentId":1751,"tags":{"name":"server"},"startTime":1764588876700,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":1837,"timestamp":956233195339,"id":1833,"parentId":1751,"tags":{},"startTime":1764588876727,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":141498,"timestamp":956233056081,"id":1751,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764588876588,"traceId":"d91921d76e888ff4"}] [{"name":"client-hmr-latency","duration":156000,"timestamp":956233055966,"id":1836,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/admin/category-mappings/page.tsx"],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764588876743,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":9099,"timestamp":956233203421,"id":1834,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764588876735,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956233212532,"id":1837,"parentId":1834,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"435093504","memory.heapUsed":"162623632","memory.heapTotal":"182829056"},"startTime":1764588876744,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":8974,"timestamp":956233203626,"id":1835,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764588876735,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956233212605,"id":1838,"parentId":1835,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"435093504","memory.heapUsed":"162635312","memory.heapTotal":"182829056"},"startTime":1764588876744,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":65710,"timestamp":956371245533,"id":1839,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764589014780,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956371311300,"id":1840,"parentId":1839,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"440729600","memory.heapUsed":"152241592","memory.heapTotal":"163659776"},"startTime":1764589014846,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":5,"timestamp":956371504224,"id":1841,"parentId":3,"tags":{},"startTime":1764589015039,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956371514132,"id":1842,"parentId":3,"tags":{},"startTime":1764589015049,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":32407,"timestamp":956469149988,"id":1843,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764589112685,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956469182464,"id":1844,"parentId":1843,"tags":{"url":"/gunbuilder","memory.rss":"440795136","memory.heapUsed":"150694944","memory.heapTotal":"161038336"},"startTime":1764589112717,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":956469409064,"id":1845,"parentId":3,"tags":{},"startTime":1764589112944,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956469412758,"id":1846,"parentId":3,"tags":{},"startTime":1764589112948,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":25481,"timestamp":956480300744,"id":1847,"tags":{"url":"/gunbuilder/handguard?_rsc=1acsq","isTurbopack":false},"startTime":1764589123836,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956480326305,"id":1848,"parentId":1847,"tags":{"url":"/gunbuilder/handguard?_rsc=1acsq","memory.rss":"441335808","memory.heapUsed":"151956056","memory.heapTotal":"159989760"},"startTime":1764589123861,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":6926,"timestamp":956480333041,"id":1849,"tags":{"url":"/gunbuilder/handguard?_rsc=rs5ev","isTurbopack":false},"startTime":1764589123868,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956480339991,"id":1850,"parentId":1849,"tags":{"url":"/gunbuilder/handguard?_rsc=rs5ev","memory.rss":"441335808","memory.heapUsed":"152215240","memory.heapTotal":"161038336"},"startTime":1764589123875,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":16573,"timestamp":956548843135,"id":1851,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764589192378,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956548859750,"id":1852,"parentId":1851,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"441352192","memory.heapUsed":"152101544","memory.heapTotal":"160776192"},"startTime":1764589192395,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956549084797,"id":1853,"parentId":3,"tags":{},"startTime":1764589192620,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956549087565,"id":1854,"parentId":3,"tags":{},"startTime":1764589192622,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":19665,"timestamp":956556207097,"id":1855,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764589199742,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956556226807,"id":1856,"parentId":1855,"tags":{"url":"/gunbuilder","memory.rss":"440958976","memory.heapUsed":"143597680","memory.heapTotal":"156647424"},"startTime":1764589199762,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":956556446019,"id":1857,"parentId":3,"tags":{},"startTime":1764589199981,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956556453185,"id":1858,"parentId":3,"tags":{},"startTime":1764589199988,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":19128,"timestamp":956711788416,"id":1859,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764589355323,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956711807584,"id":1860,"parentId":1859,"tags":{"url":"/gunbuilder","memory.rss":"429850624","memory.heapUsed":"143904096","memory.heapTotal":"155860992"},"startTime":1764589355342,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956712030346,"id":1861,"parentId":3,"tags":{},"startTime":1764589355565,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956712036782,"id":1862,"parentId":3,"tags":{},"startTime":1764589355572,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":14521,"timestamp":956901901743,"id":1874,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":14568,"timestamp":956901901752,"id":1875,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":15543,"timestamp":956901901302,"id":1867,"parentId":1866,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764589545436,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":15804,"timestamp":956901901731,"id":1873,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":6352,"timestamp":956901914792,"id":1879,"parentId":1878,"tags":{},"startTime":1764589545450,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":6596,"timestamp":956901914554,"id":1878,"parentId":1876,"tags":{},"startTime":1764589545449,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":20943,"timestamp":956901912803,"id":1876,"parentId":1865,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"app-pages-browser"},"startTime":1764589545448,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":33016,"timestamp":956901901710,"id":1871,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":33353,"timestamp":956901901722,"id":1872,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":15081,"timestamp":956901920013,"id":1881,"parentId":1880,"tags":{},"startTime":1764589545455,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":40182,"timestamp":956901901669,"id":1868,"parentId":1866,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":36398,"timestamp":956901935132,"id":1883,"parentId":1882,"tags":{},"startTime":1764589545470,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":36712,"timestamp":956901935120,"id":1882,"parentId":1880,"tags":{},"startTime":1764589545470,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":3608,"timestamp":956901971858,"id":1884,"parentId":1880,"tags":{"astUsed":"true"},"startTime":1764589545507,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":57520,"timestamp":956901919725,"id":1880,"parentId":1877,"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":1764589545455,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":70192,"timestamp":956901913239,"id":1877,"parentId":1865,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764589545448,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":39,"timestamp":956901983902,"id":1885,"parentId":1877,"tags":{},"startTime":1764589545519,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":82283,"timestamp":956901901700,"id":1870,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":87395,"timestamp":956901901690,"id":1869,"parentId":1866,"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":1764589545437,"traceId":"d91921d76e888ff4"},{"name":"make","duration":88953,"timestamp":956901900145,"id":1866,"parentId":1865,"tags":{},"startTime":1764589545435,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":12941,"timestamp":956901990098,"id":1887,"parentId":1886,"tags":{},"startTime":1764589545525,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":3,"timestamp":956902003060,"id":1889,"parentId":1886,"tags":{},"startTime":1764589545538,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":41,"timestamp":956902003100,"id":1890,"parentId":1886,"tags":{},"startTime":1764589545538,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":5,"timestamp":956902003168,"id":1891,"parentId":1886,"tags":{},"startTime":1764589545538,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":956902003199,"id":1892,"parentId":1886,"tags":{},"startTime":1764589545538,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":428,"timestamp":956902003050,"id":1888,"parentId":1886,"tags":{},"startTime":1764589545538,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":243,"timestamp":956902003910,"id":1893,"parentId":1886,"tags":{},"startTime":1764589545539,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":883,"timestamp":956902004158,"id":1894,"parentId":1886,"tags":{},"startTime":1764589545539,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":1947,"timestamp":956902005809,"id":1895,"parentId":1886,"tags":{},"startTime":1764589545541,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":52,"timestamp":956902007756,"id":1896,"parentId":1886,"tags":{},"startTime":1764589545543,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":28,"timestamp":956902007804,"id":1897,"parentId":1886,"tags":{},"startTime":1764589545543,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":2165,"timestamp":956902007834,"id":1898,"parentId":1886,"tags":{},"startTime":1764589545543,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":188,"timestamp":956902010633,"id":1900,"parentId":1865,"tags":{},"startTime":1764589545546,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":255,"timestamp":956902010569,"id":1899,"parentId":1865,"tags":{},"startTime":1764589545545,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":21667,"timestamp":956901989863,"id":1886,"parentId":1865,"tags":{},"startTime":1764589545525,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":112919,"timestamp":956901898624,"id":1865,"parentId":1863,"tags":{"name":"client"},"startTime":1764589545434,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":3606,"timestamp":956902011551,"id":1901,"parentId":1863,"tags":{},"startTime":1764589545546,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":128407,"timestamp":956901887221,"id":1863,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764589545422,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":0,"timestamp":956902017666,"id":1904,"parentId":3,"tags":{},"startTime":1764589545553,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":0,"timestamp":956902017686,"id":1905,"parentId":3,"tags":{},"startTime":1764589545553,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5244,"timestamp":956902018604,"id":1907,"parentId":1903,"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":1764589545554,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5248,"timestamp":956902018607,"id":1908,"parentId":1903,"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":1764589545554,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5249,"timestamp":956902018608,"id":1909,"parentId":1903,"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":1764589545554,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5250,"timestamp":956902018610,"id":1910,"parentId":1903,"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":1764589545554,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":997,"timestamp":956902023507,"id":1913,"parentId":1912,"tags":{},"startTime":1764589545558,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1053,"timestamp":956902023452,"id":1912,"parentId":1911,"tags":{},"startTime":1764589545558,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":2170,"timestamp":956902023291,"id":1911,"parentId":1902,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"rsc"},"startTime":1764589545558,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":143000,"timestamp":956901888040,"id":1914,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764589545571,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":145000,"timestamp":956901888111,"id":1915,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/page.tsx"],"page":"/gunbuilder","isPageHidden":true},"startTime":1764589545571,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":17677,"timestamp":956902018582,"id":1906,"parentId":1903,"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":1764589545554,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":2275,"timestamp":956902037918,"id":1933,"parentId":1932,"tags":{},"startTime":1764589545573,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":2342,"timestamp":956902037853,"id":1932,"parentId":1931,"tags":{},"startTime":1764589545573,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":12000,"timestamp":956902037738,"id":1931,"parentId":1902,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx","layer":"ssr"},"startTime":1764589545573,"traceId":"d91921d76e888ff4"},{"name":"make","duration":33464,"timestamp":956902017111,"id":1903,"parentId":1902,"tags":{},"startTime":1764589545552,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1105,"timestamp":956902051742,"id":1935,"parentId":1934,"tags":{},"startTime":1764589545587,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":2,"timestamp":956902052854,"id":1937,"parentId":1934,"tags":{},"startTime":1764589545588,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":1098,"timestamp":956902052889,"id":1938,"parentId":1934,"tags":{},"startTime":1764589545588,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":956902053994,"id":1939,"parentId":1934,"tags":{},"startTime":1764589545589,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":1,"timestamp":956902054005,"id":1940,"parentId":1934,"tags":{},"startTime":1764589545589,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":1393,"timestamp":956902052852,"id":1936,"parentId":1934,"tags":{},"startTime":1764589545588,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":183,"timestamp":956902054657,"id":1941,"parentId":1934,"tags":{},"startTime":1764589545590,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":577,"timestamp":956902054843,"id":1942,"parentId":1934,"tags":{},"startTime":1764589545590,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":905,"timestamp":956902055905,"id":1943,"parentId":1934,"tags":{},"startTime":1764589545591,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":37,"timestamp":956902056810,"id":1944,"parentId":1934,"tags":{},"startTime":1764589545592,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":20,"timestamp":956902056843,"id":1945,"parentId":1934,"tags":{},"startTime":1764589545592,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1244,"timestamp":956902056865,"id":1946,"parentId":1934,"tags":{},"startTime":1764589545592,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":7315,"timestamp":956902051602,"id":1934,"parentId":1902,"tags":{},"startTime":1764589545587,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":43790,"timestamp":956902016809,"id":1902,"parentId":1864,"tags":{"name":"server"},"startTime":1764589545552,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":1307,"timestamp":956902060608,"id":1947,"parentId":1864,"tags":{},"startTime":1764589545596,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":174915,"timestamp":956901887692,"id":1864,"parentId":3,"tags":{"trigger":"app/gunbuilder/page.tsx"},"startTime":1764589545423,"traceId":"d91921d76e888ff4"}] +[{"name":"handle-request","duration":15656,"timestamp":956902067736,"id":1948,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764589545603,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956902083411,"id":1950,"parentId":1948,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"450265088","memory.heapUsed":"167818840","memory.heapTotal":"193740800"},"startTime":1764589545618,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":15566,"timestamp":956902067922,"id":1949,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764589545603,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956902083496,"id":1951,"parentId":1949,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"450265088","memory.heapUsed":"167829736","memory.heapTotal":"193740800"},"startTime":1764589545618,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":71550,"timestamp":956914305322,"id":1952,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764589557840,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":956914376894,"id":1953,"parentId":1952,"tags":{"url":"/gunbuilder","memory.rss":"414236672","memory.heapUsed":"151574824","memory.heapTotal":"158007296"},"startTime":1764589557912,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":6,"timestamp":956914575368,"id":1954,"parentId":3,"tags":{},"startTime":1764589558110,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":956914578422,"id":1955,"parentId":3,"tags":{},"startTime":1764589558113,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":19779,"timestamp":956916876135,"id":1956,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","isTurbopack":false},"startTime":1764589560411,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956916895981,"id":1957,"parentId":1956,"tags":{"url":"/gunbuilder/lower?_rsc=1acsq","memory.rss":"415416320","memory.heapUsed":"152798568","memory.heapTotal":"159055872"},"startTime":1764589560431,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":8368,"timestamp":956916905065,"id":1958,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","isTurbopack":false},"startTime":1764589560440,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956916913465,"id":1959,"parentId":1958,"tags":{"url":"/gunbuilder/lower?_rsc=1o5jb","memory.rss":"415514624","memory.heapUsed":"152325632","memory.heapTotal":"159318016"},"startTime":1764589560448,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":18092,"timestamp":956922340630,"id":1960,"tags":{"url":"/gunbuilder/lower/892?_rsc=uiigs","isTurbopack":false},"startTime":1764589565876,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956922358811,"id":1961,"parentId":1960,"tags":{"url":"/gunbuilder/lower/892?_rsc=uiigs","memory.rss":"415956992","memory.heapUsed":"153052400","memory.heapTotal":"158498816"},"startTime":1764589565894,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":10472,"timestamp":956922364029,"id":1962,"tags":{"url":"/gunbuilder/lower/892?_rsc=nphhn","isTurbopack":false},"startTime":1764589565899,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":956922374536,"id":1963,"parentId":1962,"tags":{"url":"/gunbuilder/lower/892?_rsc=nphhn","memory.rss":"416120832","memory.heapUsed":"153102032","memory.heapTotal":"159285248"},"startTime":1764589565909,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":16676,"timestamp":957168641864,"id":1964,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764589812177,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":957168658581,"id":1965,"parentId":1964,"tags":{"url":"/gunbuilder","memory.rss":"421822464","memory.heapUsed":"155349816","memory.heapTotal":"165773312"},"startTime":1764589812194,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":957168894762,"id":1966,"parentId":3,"tags":{},"startTime":1764589812430,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":957168899321,"id":1967,"parentId":3,"tags":{},"startTime":1764589812434,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":22133,"timestamp":961222146966,"id":1968,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764593865679,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":961222169160,"id":1969,"parentId":1968,"tags":{"url":"/gunbuilder","memory.rss":"421822464","memory.heapUsed":"153555712","memory.heapTotal":"162103296"},"startTime":1764593865701,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":961222397025,"id":1970,"parentId":3,"tags":{},"startTime":1764593865929,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":17766,"timestamp":961226599606,"id":1971,"tags":{"url":"/gunbuilder/barrel?_rsc=1acsq","isTurbopack":false},"startTime":1764593870132,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":961226617444,"id":1972,"parentId":1971,"tags":{"url":"/gunbuilder/barrel?_rsc=1acsq","memory.rss":"421969920","memory.heapUsed":"154344056","memory.heapTotal":"161841152"},"startTime":1764593870150,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":7906,"timestamp":961226625866,"id":1973,"tags":{"url":"/gunbuilder/barrel?_rsc=2b9yl","isTurbopack":false},"startTime":1764593870158,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":961226633800,"id":1974,"parentId":1973,"tags":{"url":"/gunbuilder/barrel?_rsc=2b9yl","memory.rss":"421969920","memory.heapUsed":"154576496","memory.heapTotal":"162889728"},"startTime":1764593870166,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":16083,"timestamp":991009316307,"id":1984,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":16271,"timestamp":991009316321,"id":1986,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":17030,"timestamp":991009316167,"id":1979,"parentId":1978,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":17759,"timestamp":991009316314,"id":1985,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":7882,"timestamp":991009330043,"id":1991,"parentId":1990,"tags":{},"startTime":1764623652830,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":8104,"timestamp":991009329829,"id":1990,"parentId":1989,"tags":{},"startTime":1764623652830,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":17217,"timestamp":991009329604,"id":1989,"parentId":1977,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764623652830,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":32333,"timestamp":991009316298,"id":1983,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":32309,"timestamp":991009316327,"id":1987,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":32387,"timestamp":991009316283,"id":1981,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":11086,"timestamp":991009337615,"id":1993,"parentId":1992,"tags":{},"startTime":1764623652838,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":37055,"timestamp":991009316271,"id":1980,"parentId":1978,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":22290,"timestamp":991009348757,"id":1995,"parentId":1994,"tags":{},"startTime":1764623652849,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":23436,"timestamp":991009348730,"id":1994,"parentId":1992,"tags":{},"startTime":1764623652849,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":5808,"timestamp":991009372206,"id":1996,"parentId":1992,"tags":{"astUsed":"true"},"startTime":1764623652872,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":42496,"timestamp":991009337265,"id":1992,"parentId":1988,"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":1764623652837,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":54657,"timestamp":991009328218,"id":1988,"parentId":1977,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764623652828,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":42,"timestamp":991009383492,"id":1997,"parentId":1988,"tags":{},"startTime":1764623652883,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":67265,"timestamp":991009316291,"id":1982,"parentId":1978,"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":1764623652816,"traceId":"d91921d76e888ff4"},{"name":"make","duration":68380,"timestamp":991009315190,"id":1978,"parentId":1977,"tags":{},"startTime":1764623652815,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":800,"timestamp":991009404225,"id":1999,"parentId":1998,"tags":{},"startTime":1764623652904,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":3,"timestamp":991009405042,"id":2001,"parentId":1998,"tags":{},"startTime":1764623652905,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":43,"timestamp":991009405093,"id":2002,"parentId":1998,"tags":{},"startTime":1764623652905,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":5,"timestamp":991009405170,"id":2003,"parentId":1998,"tags":{},"startTime":1764623652905,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":3,"timestamp":991009405199,"id":2004,"parentId":1998,"tags":{},"startTime":1764623652905,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":469,"timestamp":991009405036,"id":2000,"parentId":1998,"tags":{},"startTime":1764623652905,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":256,"timestamp":991009405929,"id":2005,"parentId":1998,"tags":{},"startTime":1764623652906,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":827,"timestamp":991009406190,"id":2006,"parentId":1998,"tags":{},"startTime":1764623652906,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":3268,"timestamp":991009407794,"id":2007,"parentId":1998,"tags":{},"startTime":1764623652908,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":169,"timestamp":991009411062,"id":2008,"parentId":1998,"tags":{},"startTime":1764623652911,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":54,"timestamp":991009411223,"id":2009,"parentId":1998,"tags":{},"startTime":1764623652911,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":4043,"timestamp":991009411280,"id":2010,"parentId":1998,"tags":{},"startTime":1764623652911,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":221,"timestamp":991009416305,"id":2012,"parentId":1977,"tags":{},"startTime":1764623652916,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":311,"timestamp":991009416219,"id":2011,"parentId":1977,"tags":{},"startTime":1764623652916,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":13730,"timestamp":991009403893,"id":1998,"parentId":1977,"tags":{},"startTime":1764623652904,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":104311,"timestamp":991009313342,"id":1977,"parentId":1975,"tags":{"name":"client"},"startTime":1764623652813,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":3680,"timestamp":991009417670,"id":2013,"parentId":1975,"tags":{},"startTime":1764623652918,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":117563,"timestamp":991009304541,"id":1975,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623652804,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":1,"timestamp":991009425708,"id":2016,"parentId":3,"tags":{},"startTime":1764623652926,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4939,"timestamp":991009427338,"id":2018,"parentId":2015,"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":1764623652927,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4942,"timestamp":991009427343,"id":2020,"parentId":2015,"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":1764623652927,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":4943,"timestamp":991009427344,"id":2021,"parentId":2015,"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":1764623652927,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":1379,"timestamp":991009431306,"id":2024,"parentId":2023,"tags":{},"startTime":1764623652931,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1450,"timestamp":991009431236,"id":2023,"parentId":2022,"tags":{},"startTime":1764623652931,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":2758,"timestamp":991009431064,"id":2022,"parentId":2014,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764623652931,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6587,"timestamp":991009427303,"id":2017,"parentId":2015,"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":1764623652927,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":129000,"timestamp":991009305055,"id":2025,"parentId":3,"tags":{"updatedModules":[],"page":"/gunbuilder","isPageHidden":true},"startTime":1764623652934,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6993,"timestamp":991009427341,"id":2019,"parentId":2015,"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":1764623652927,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":2505,"timestamp":991009436180,"id":2043,"parentId":2042,"tags":{},"startTime":1764623652936,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":2592,"timestamp":991009436098,"id":2042,"parentId":2041,"tags":{},"startTime":1764623652936,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":7144,"timestamp":991009435972,"id":2041,"parentId":2014,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764623652936,"traceId":"d91921d76e888ff4"},{"name":"make","duration":19185,"timestamp":991009424352,"id":2015,"parentId":2014,"tags":{},"startTime":1764623652924,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1469,"timestamp":991009450380,"id":2045,"parentId":2044,"tags":{},"startTime":1764623652950,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":3,"timestamp":991009451863,"id":2047,"parentId":2044,"tags":{},"startTime":1764623652952,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":1463,"timestamp":991009451917,"id":2048,"parentId":2044,"tags":{},"startTime":1764623652952,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":991009453398,"id":2049,"parentId":2044,"tags":{},"startTime":1764623652953,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":991009453411,"id":2050,"parentId":2044,"tags":{},"startTime":1764623652953,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":1766,"timestamp":991009451859,"id":2046,"parentId":2044,"tags":{},"startTime":1764623652952,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":256,"timestamp":991009454299,"id":2051,"parentId":2044,"tags":{},"startTime":1764623652954,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":1099,"timestamp":991009454563,"id":2052,"parentId":2044,"tags":{},"startTime":1764623652954,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":1002,"timestamp":991009456413,"id":2053,"parentId":2044,"tags":{},"startTime":1764623652956,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":64,"timestamp":991009457416,"id":2054,"parentId":2044,"tags":{},"startTime":1764623652957,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":31,"timestamp":991009457474,"id":2055,"parentId":2044,"tags":{},"startTime":1764623652957,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1662,"timestamp":991009457507,"id":2056,"parentId":2044,"tags":{},"startTime":1764623652957,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":10331,"timestamp":991009450162,"id":2044,"parentId":2014,"tags":{},"startTime":1764623652950,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":38352,"timestamp":991009423992,"id":2014,"parentId":1976,"tags":{"name":"server"},"startTime":1764623652924,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":1955,"timestamp":991009462363,"id":2057,"parentId":1976,"tags":{},"startTime":1764623652962,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":160262,"timestamp":991009304872,"id":1976,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623652805,"traceId":"d91921d76e888ff4"}] +[{"name":"handle-request","duration":21494,"timestamp":991009477845,"id":2058,"tags":{"url":"/gunbuilder?_rsc=1kvbu","isTurbopack":false},"startTime":1764623652978,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991009499360,"id":2059,"parentId":2058,"tags":{"url":"/gunbuilder?_rsc=1kvbu","memory.rss":"348422144","memory.heapUsed":"163675944","memory.heapTotal":"189267968"},"startTime":1764623652999,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":58097,"timestamp":991018632838,"id":2060,"tags":{"url":"/gunbuilder/admin/category-mapping","isTurbopack":false},"startTime":1764623662133,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991018690959,"id":2061,"parentId":2060,"tags":{"url":"/gunbuilder/admin/category-mapping","memory.rss":"349323264","memory.heapUsed":"168078480","memory.heapTotal":"191070208"},"startTime":1764623662191,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":991018888460,"id":2062,"parentId":3,"tags":{},"startTime":1764623662388,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":6666,"timestamp":991020800280,"id":2063,"tags":{"url":"/gunbuilder?_rsc=1mfpi","isTurbopack":false},"startTime":1764623664300,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991020806980,"id":2064,"parentId":2063,"tags":{"url":"/gunbuilder?_rsc=1mfpi","memory.rss":"351354880","memory.heapUsed":"170003912","memory.heapTotal":"191070208"},"startTime":1764623664307,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":10860,"timestamp":991020810073,"id":2065,"tags":{"url":"/gunbuilder?_rsc=x5p1f","isTurbopack":false},"startTime":1764623664310,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":991020820964,"id":2066,"parentId":2065,"tags":{"url":"/gunbuilder?_rsc=x5p1f","memory.rss":"351371264","memory.heapUsed":"170677152","memory.heapTotal":"191070208"},"startTime":1764623664321,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":25634,"timestamp":991021352103,"id":2067,"tags":{"url":"/gunbuilder","isTurbopack":false},"startTime":1764623664852,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991021377788,"id":2068,"parentId":2067,"tags":{"url":"/gunbuilder","memory.rss":"351567872","memory.heapUsed":"172259960","memory.heapTotal":"192118784"},"startTime":1764623664878,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":991021576956,"id":2069,"parentId":3,"tags":{},"startTime":1764623665077,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":20741,"timestamp":991026399050,"id":2070,"tags":{"url":"/gunbuilder/admin/category-mapping","isTurbopack":false},"startTime":1764623669899,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991026419841,"id":2071,"parentId":2070,"tags":{"url":"/gunbuilder/admin/category-mapping","memory.rss":"356745216","memory.heapUsed":"175185416","memory.heapTotal":"195002368"},"startTime":1764623669920,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":4,"timestamp":991026600728,"id":2072,"parentId":3,"tags":{},"startTime":1764623670101,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":23608,"timestamp":991029466598,"id":2073,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764623672966,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991029490241,"id":2074,"parentId":2073,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"362414080","memory.heapUsed":"165473928","memory.heapTotal":"196427776"},"startTime":1764623672990,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":2,"timestamp":991029698402,"id":2075,"parentId":3,"tags":{},"startTime":1764623673198,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":15877,"timestamp":991131461577,"id":2085,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":16284,"timestamp":991131461592,"id":2087,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":17604,"timestamp":991131461166,"id":2080,"parentId":2079,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":18225,"timestamp":991131461584,"id":2086,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":9819,"timestamp":991131475274,"id":2092,"parentId":2091,"tags":{},"startTime":1764623774975,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":10057,"timestamp":991131475054,"id":2091,"parentId":2090,"tags":{},"startTime":1764623774975,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":29386,"timestamp":991131474839,"id":2090,"parentId":2078,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764623774975,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":43236,"timestamp":991131461566,"id":2084,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":43415,"timestamp":991131461548,"id":2082,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":23012,"timestamp":991131481968,"id":2094,"parentId":2093,"tags":{},"startTime":1764623774982,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":48101,"timestamp":991131461599,"id":2088,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":48435,"timestamp":991131461522,"id":2081,"parentId":2079,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":22523,"timestamp":991131505033,"id":2096,"parentId":2095,"tags":{},"startTime":1764623775005,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":22962,"timestamp":991131505011,"id":2095,"parentId":2093,"tags":{},"startTime":1764623775005,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":5297,"timestamp":991131527999,"id":2097,"parentId":2093,"tags":{"astUsed":"true"},"startTime":1764623775028,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":53326,"timestamp":991131481730,"id":2093,"parentId":2089,"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":1764623774981,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":65633,"timestamp":991131474069,"id":2089,"parentId":2078,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764623774974,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":63,"timestamp":991131539886,"id":2098,"parentId":2089,"tags":{},"startTime":1764623775040,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":78428,"timestamp":991131461558,"id":2083,"parentId":2079,"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":1764623774961,"traceId":"d91921d76e888ff4"},{"name":"make","duration":79518,"timestamp":991131460494,"id":2079,"parentId":2078,"tags":{},"startTime":1764623774960,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":697,"timestamp":991131564747,"id":2100,"parentId":2099,"tags":{},"startTime":1764623775064,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":2,"timestamp":991131565457,"id":2102,"parentId":2099,"tags":{},"startTime":1764623775065,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":21,"timestamp":991131565468,"id":2103,"parentId":2099,"tags":{},"startTime":1764623775065,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":991131565499,"id":2104,"parentId":2099,"tags":{},"startTime":1764623775065,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":991131565511,"id":2105,"parentId":2099,"tags":{},"startTime":1764623775065,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":264,"timestamp":991131565454,"id":2101,"parentId":2099,"tags":{},"startTime":1764623775065,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":195,"timestamp":991131566093,"id":2106,"parentId":2099,"tags":{},"startTime":1764623775066,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":686,"timestamp":991131566293,"id":2107,"parentId":2099,"tags":{},"startTime":1764623775066,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":1683,"timestamp":991131567579,"id":2108,"parentId":2099,"tags":{},"startTime":1764623775067,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":115,"timestamp":991131569261,"id":2109,"parentId":2099,"tags":{},"startTime":1764623775069,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":59,"timestamp":991131569369,"id":2110,"parentId":2099,"tags":{},"startTime":1764623775069,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":2742,"timestamp":991131569435,"id":2111,"parentId":2099,"tags":{},"startTime":1764623775069,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":69,"timestamp":991131572741,"id":2113,"parentId":2078,"tags":{},"startTime":1764623775072,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":119,"timestamp":991131572694,"id":2112,"parentId":2078,"tags":{},"startTime":1764623775072,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":9132,"timestamp":991131564522,"id":2099,"parentId":2078,"tags":{},"startTime":1764623775064,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":114051,"timestamp":991131459631,"id":2078,"parentId":2076,"tags":{"name":"client"},"startTime":1764623774959,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":3806,"timestamp":991131573700,"id":2114,"parentId":2076,"tags":{},"startTime":1764623775073,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":127551,"timestamp":991131450337,"id":2076,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623774950,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":0,"timestamp":991131579683,"id":2117,"parentId":3,"tags":{},"startTime":1764623775079,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6852,"timestamp":991131581208,"id":2119,"parentId":2116,"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":1764623775081,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6854,"timestamp":991131581216,"id":2120,"parentId":2116,"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":1764623775081,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6846,"timestamp":991131581234,"id":2121,"parentId":2116,"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":1764623775081,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":6842,"timestamp":991131581242,"id":2122,"parentId":2116,"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":1764623775081,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":1251,"timestamp":991131587442,"id":2125,"parentId":2124,"tags":{},"startTime":1764623775087,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1346,"timestamp":991131587347,"id":2124,"parentId":2123,"tags":{},"startTime":1764623775087,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":2452,"timestamp":991131587112,"id":2123,"parentId":2115,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764623775087,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":8838,"timestamp":991131581154,"id":2118,"parentId":2116,"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":1764623775081,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":2456,"timestamp":991131591722,"id":2143,"parentId":2142,"tags":{},"startTime":1764623775091,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":2525,"timestamp":991131591661,"id":2142,"parentId":2141,"tags":{},"startTime":1764623775091,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":7881,"timestamp":991131591541,"id":2141,"parentId":2115,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764623775091,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":147000,"timestamp":991131450835,"id":2144,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/admin/category-mappings/page.tsx"],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764623775100,"traceId":"d91921d76e888ff4"},{"name":"make","duration":20753,"timestamp":991131579152,"id":2116,"parentId":2115,"tags":{},"startTime":1764623775079,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1710,"timestamp":991131605705,"id":2146,"parentId":2145,"tags":{},"startTime":1764623775105,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":2,"timestamp":991131607437,"id":2148,"parentId":2145,"tags":{},"startTime":1764623775107,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":1461,"timestamp":991131607452,"id":2149,"parentId":2145,"tags":{},"startTime":1764623775107,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":9,"timestamp":991131608933,"id":2150,"parentId":2145,"tags":{},"startTime":1764623775109,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":3,"timestamp":991131608953,"id":2151,"parentId":2145,"tags":{},"startTime":1764623775109,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":1767,"timestamp":991131607430,"id":2147,"parentId":2145,"tags":{},"startTime":1764623775107,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":286,"timestamp":991131609945,"id":2152,"parentId":2145,"tags":{},"startTime":1764623775110,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":1062,"timestamp":991131610241,"id":2153,"parentId":2145,"tags":{},"startTime":1764623775110,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":875,"timestamp":991131611870,"id":2154,"parentId":2145,"tags":{},"startTime":1764623775112,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":60,"timestamp":991131612744,"id":2155,"parentId":2145,"tags":{},"startTime":1764623775112,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":29,"timestamp":991131612800,"id":2156,"parentId":2145,"tags":{},"startTime":1764623775113,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1496,"timestamp":991131612831,"id":2157,"parentId":2145,"tags":{},"startTime":1764623775113,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":10214,"timestamp":991131605480,"id":2145,"parentId":2115,"tags":{},"startTime":1764623775105,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":38482,"timestamp":991131578988,"id":2115,"parentId":2077,"tags":{"name":"server"},"startTime":1764623775079,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":12361,"timestamp":991131617506,"id":2158,"parentId":2077,"tags":{},"startTime":1764623775117,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":179193,"timestamp":991131451198,"id":2077,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623774951,"traceId":"d91921d76e888ff4"}] +[{"name":"handle-request","duration":10791,"timestamp":991131635429,"id":2159,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","isTurbopack":false},"startTime":1764623775135,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":0,"timestamp":991131646240,"id":2160,"parentId":2159,"tags":{"url":"/gunbuilder/admin/category-mappings?_rsc=xl4t8","memory.rss":"372899840","memory.heapUsed":"166529328","memory.heapTotal":"194576384"},"startTime":1764623775146,"traceId":"d91921d76e888ff4"},{"name":"handle-request","duration":39232,"timestamp":991134870641,"id":2161,"tags":{"url":"/gunbuilder/admin/category-mappings","isTurbopack":false},"startTime":1764623778370,"traceId":"d91921d76e888ff4"},{"name":"memory-usage","duration":1,"timestamp":991134909945,"id":2162,"parentId":2161,"tags":{"url":"/gunbuilder/admin/category-mappings","memory.rss":"373080064","memory.heapUsed":"169438632","memory.heapTotal":"195100672"},"startTime":1764623778410,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":3,"timestamp":991135102915,"id":2163,"parentId":3,"tags":{},"startTime":1764623778603,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":19364,"timestamp":991263134926,"id":2173,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":19535,"timestamp":991263134939,"id":2175,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":22412,"timestamp":991263134684,"id":2168,"parentId":2167,"tags":{"request":"/Users/sean/Dev/gunbuilder-prototype/node_modules/next/dist/compiled/@next/react-refresh-utils/dist/runtime.js"},"startTime":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":23144,"timestamp":991263134933,"id":2174,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":8646,"timestamp":991263152650,"id":2180,"parentId":2179,"tags":{},"startTime":1764623906652,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":8889,"timestamp":991263152418,"id":2179,"parentId":2178,"tags":{},"startTime":1764623906652,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":22426,"timestamp":991263152150,"id":2178,"parentId":2166,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"app-pages-browser"},"startTime":1764623906652,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":40748,"timestamp":991263134914,"id":2172,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":41598,"timestamp":991263134899,"id":2170,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":41556,"timestamp":991263134945,"id":2176,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"read-resource","duration":16600,"timestamp":991263159913,"id":2182,"parentId":2181,"tags":{},"startTime":1764623906659,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":46928,"timestamp":991263134881,"id":2169,"parentId":2167,"tags":{"request":"./node_modules/next/dist/client/app-next-dev.js"},"startTime":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"postcss-process","duration":23952,"timestamp":991263176562,"id":2184,"parentId":2183,"tags":{},"startTime":1764623906676,"traceId":"d91921d76e888ff4"},{"name":"postcss-loader","duration":24415,"timestamp":991263176541,"id":2183,"parentId":2181,"tags":{},"startTime":1764623906676,"traceId":"d91921d76e888ff4"},{"name":"css-loader","duration":4279,"timestamp":991263200999,"id":2185,"parentId":2181,"tags":{"astUsed":"true"},"startTime":1764623906700,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":47351,"timestamp":991263159708,"id":2181,"parentId":2177,"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":1764623906659,"traceId":"d91921d76e888ff4"},{"name":"build-module-css","duration":57628,"timestamp":991263151334,"id":2177,"parentId":2166,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/globals.css","layer":"app-pages-browser"},"startTime":1764623906651,"traceId":"d91921d76e888ff4"},{"name":"build-module","duration":17,"timestamp":991263209067,"id":2186,"parentId":2177,"tags":{},"startTime":1764623906709,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":74201,"timestamp":991263134907,"id":2171,"parentId":2167,"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":1764623906634,"traceId":"d91921d76e888ff4"},{"name":"make","duration":75137,"timestamp":991263133984,"id":2167,"parentId":2166,"tags":{},"startTime":1764623906633,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":758,"timestamp":991263239528,"id":2188,"parentId":2187,"tags":{},"startTime":1764623906739,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":3,"timestamp":991263240299,"id":2190,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":22,"timestamp":991263240309,"id":2191,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":991263240343,"id":2192,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":2,"timestamp":991263240355,"id":2193,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":286,"timestamp":991263240296,"id":2189,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":331,"timestamp":991263240989,"id":2194,"parentId":2187,"tags":{},"startTime":1764623906740,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":811,"timestamp":991263241337,"id":2195,"parentId":2187,"tags":{},"startTime":1764623906741,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":1617,"timestamp":991263242980,"id":2196,"parentId":2187,"tags":{},"startTime":1764623906742,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":63,"timestamp":991263244597,"id":2197,"parentId":2187,"tags":{},"startTime":1764623906744,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":42,"timestamp":991263244652,"id":2198,"parentId":2187,"tags":{},"startTime":1764623906744,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":2784,"timestamp":991263244696,"id":2199,"parentId":2187,"tags":{},"startTime":1764623906744,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-generateClientManifest","duration":60,"timestamp":991263247877,"id":2201,"parentId":2166,"tags":{},"startTime":1764623906747,"traceId":"d91921d76e888ff4"},{"name":"NextJsBuildManifest-createassets","duration":98,"timestamp":991263247842,"id":2200,"parentId":2166,"tags":{},"startTime":1764623906747,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":9460,"timestamp":991263239234,"id":2187,"parentId":2166,"tags":{},"startTime":1764623906739,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":115648,"timestamp":991263133068,"id":2166,"parentId":2164,"tags":{"name":"client"},"startTime":1764623906633,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":3424,"timestamp":991263248729,"id":2202,"parentId":2164,"tags":{},"startTime":1764623906748,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-client","duration":128021,"timestamp":991263124574,"id":2164,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623906624,"traceId":"d91921d76e888ff4"},{"name":"client-success","duration":1,"timestamp":991263254597,"id":2205,"parentId":3,"tags":{},"startTime":1764623906754,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5220,"timestamp":991263255962,"id":2207,"parentId":2204,"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":1764623906755,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5225,"timestamp":991263255965,"id":2208,"parentId":2204,"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":1764623906755,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5224,"timestamp":991263255968,"id":2210,"parentId":2204,"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":1764623906755,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":5879,"timestamp":991263255931,"id":2206,"parentId":2204,"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":1764623906755,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":1315,"timestamp":991263260846,"id":2213,"parentId":2212,"tags":{},"startTime":1764623906760,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":1398,"timestamp":991263260765,"id":2212,"parentId":2211,"tags":{},"startTime":1764623906760,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":2332,"timestamp":991263260607,"id":2211,"parentId":2203,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"rsc"},"startTime":1764623906760,"traceId":"d91921d76e888ff4"},{"name":"add-entry","duration":7296,"timestamp":991263255967,"id":2209,"parentId":2204,"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":1764623906755,"traceId":"d91921d76e888ff4"},{"name":"next-swc-transform","duration":2874,"timestamp":991263264681,"id":2231,"parentId":2230,"tags":{},"startTime":1764623906764,"traceId":"d91921d76e888ff4"},{"name":"next-swc-loader","duration":2938,"timestamp":991263264624,"id":2230,"parentId":2229,"tags":{},"startTime":1764623906764,"traceId":"d91921d76e888ff4"},{"name":"build-module-tsx","duration":6570,"timestamp":991263264546,"id":2229,"parentId":2203,"tags":{"name":"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/admin/category-mappings/page.tsx","layer":"ssr"},"startTime":1764623906764,"traceId":"d91921d76e888ff4"},{"name":"make","duration":17394,"timestamp":991263254039,"id":2204,"parentId":2203,"tags":{},"startTime":1764623906754,"traceId":"d91921d76e888ff4"},{"name":"chunk-graph","duration":1249,"timestamp":991263276258,"id":2233,"parentId":2232,"tags":{},"startTime":1764623906776,"traceId":"d91921d76e888ff4"},{"name":"optimize-modules","duration":2,"timestamp":991263277519,"id":2235,"parentId":2232,"tags":{},"startTime":1764623906777,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunks","duration":1330,"timestamp":991263277531,"id":2236,"parentId":2232,"tags":{},"startTime":1764623906777,"traceId":"d91921d76e888ff4"},{"name":"optimize-tree","duration":3,"timestamp":991263278875,"id":2237,"parentId":2232,"tags":{},"startTime":1764623906778,"traceId":"d91921d76e888ff4"},{"name":"optimize-chunk-modules","duration":3,"timestamp":991263278885,"id":2238,"parentId":2232,"tags":{},"startTime":1764623906778,"traceId":"d91921d76e888ff4"},{"name":"optimize","duration":1561,"timestamp":991263277515,"id":2234,"parentId":2232,"tags":{},"startTime":1764623906777,"traceId":"d91921d76e888ff4"},{"name":"module-hash","duration":231,"timestamp":991263279613,"id":2239,"parentId":2232,"tags":{},"startTime":1764623906779,"traceId":"d91921d76e888ff4"},{"name":"code-generation","duration":811,"timestamp":991263279849,"id":2240,"parentId":2232,"tags":{},"startTime":1764623906779,"traceId":"d91921d76e888ff4"},{"name":"hash","duration":876,"timestamp":991263281147,"id":2241,"parentId":2232,"tags":{},"startTime":1764623906781,"traceId":"d91921d76e888ff4"},{"name":"code-generation-jobs","duration":88,"timestamp":991263282022,"id":2242,"parentId":2232,"tags":{},"startTime":1764623906781,"traceId":"d91921d76e888ff4"},{"name":"module-assets","duration":42,"timestamp":991263282103,"id":2243,"parentId":2232,"tags":{},"startTime":1764623906782,"traceId":"d91921d76e888ff4"},{"name":"create-chunk-assets","duration":1540,"timestamp":991263282148,"id":2244,"parentId":2232,"tags":{},"startTime":1764623906782,"traceId":"d91921d76e888ff4"},{"name":"client-hmr-latency","duration":148000,"timestamp":991263125374,"id":2245,"parentId":3,"tags":{"updatedModules":["[project]/app/gunbuilder/admin/category-mappings/page.tsx"],"page":"/gunbuilder/admin/category-mappings","isPageHidden":true},"startTime":1764623906784,"traceId":"d91921d76e888ff4"},{"name":"seal","duration":8937,"timestamp":991263276062,"id":2232,"parentId":2203,"tags":{},"startTime":1764623906776,"traceId":"d91921d76e888ff4"},{"name":"webpack-compilation","duration":32800,"timestamp":991263253851,"id":2203,"parentId":2165,"tags":{"name":"server"},"startTime":1764623906753,"traceId":"d91921d76e888ff4"},{"name":"emit","duration":1949,"timestamp":991263286671,"id":2246,"parentId":2165,"tags":{},"startTime":1764623906786,"traceId":"d91921d76e888ff4"},{"name":"webpack-invalidated-server","duration":163799,"timestamp":991263125232,"id":2165,"parentId":3,"tags":{"trigger":"app/gunbuilder/admin/category-mappings/page.tsx"},"startTime":1764623906625,"traceId":"d91921d76e888ff4"}] diff --git a/app/gunbuilder/admin/category-mappings/page.tsx b/app/gunbuilder/admin/category-mappings/page.tsx index d2bb85b..b58e020 100644 --- a/app/gunbuilder/admin/category-mappings/page.tsx +++ b/app/gunbuilder/admin/category-mappings/page.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useState, useMemo } from "react"; const API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL ?? "http://localhost:8080"; @@ -50,6 +50,29 @@ export default function CategoryMappingsPage() { const [saving, setSaving] = useState(false); const [error, setError] = useState(null); const [successMessage, setSuccessMessage] = useState(null); + const [showOnlyUnmapped, setShowOnlyUnmapped] = useState(false); + + const sortedMappings = useMemo(() => { + // Mapped rows first, then unmapped; within each group, alpha by rawCategory + return [...mappings].sort((a, b) => { + const aMapped = !!a.mappedPartRole; + const bMapped = !!b.mappedPartRole; + + if (aMapped !== bMapped) { + return aMapped ? -1 : 1; // mapped first + } + + return a.rawCategory.localeCompare(b.rawCategory); + }); + }, [mappings]); + + const visibleMappings = useMemo( + () => + showOnlyUnmapped + ? sortedMappings.filter((m) => !m.mappedPartRole) + : sortedMappings, + [sortedMappings, showOnlyUnmapped], + ); // Load merchants useEffect(() => { @@ -232,10 +255,22 @@ export default function CategoryMappingsPage() {

) : ( <> -
- Mappings for {selectedMerchantName}.{" "} - Set a part role for each raw category. Unmapped categories will - be skipped by the importer. +
+
+ Mappings for{" "} + {selectedMerchantName}.{" "} + Set a part role for each raw category. Unmapped categories will + be skipped by the importer. +
+
@@ -244,10 +279,11 @@ export default function CategoryMappingsPage() { Raw Category Mapped Part Role + Status - {mappings.map((m) => ( + {visibleMappings.map((m) => ( + + {m.mappedPartRole ? ( + + Mapped + + ) : ( + + Unmapped / Ignored + + )} + ))}