22 lines
92 KiB
JavaScript
22 lines
92 KiB
JavaScript
"use strict";
|
|
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
self["webpackHotUpdate_N_E"]("app/gunbuilder/page",{
|
|
|
|
/***/ "(app-pages-browser)/./app/gunbuilder/page.tsx":
|
|
/*!*********************************!*\
|
|
!*** ./app/gunbuilder/page.tsx ***!
|
|
\*********************************/
|
|
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
|
|
|
eval(__webpack_require__.ts("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": function() { return /* binding */ GunbuilderPage; }\n/* harmony export */ });\n/* harmony import */ var react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react/jsx-dev-runtime */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/jsx-dev-runtime.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"(app-pages-browser)/./node_modules/next/dist/compiled/react/index.js\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var next_link__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/link */ \"(app-pages-browser)/./node_modules/next/dist/api/link.js\");\n/* harmony import */ var next_navigation__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! next/navigation */ \"(app-pages-browser)/./node_modules/next/dist/api/navigation.js\");\n/* harmony import */ var _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @/data/gunbuilderParts */ \"(app-pages-browser)/./data/gunbuilderParts.ts\");\n/* harmony import */ var _components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @/components/CategoryColumn */ \"(app-pages-browser)/./components/CategoryColumn.tsx\");\n/* provided dependency */ var process = __webpack_require__(/*! process */ \"(app-pages-browser)/./node_modules/next/dist/build/polyfills/process.js\");\n/* __next_internal_client_entry_do_not_use__ default auto */ \nvar _s = $RefreshSig$();\n\n\n\n\n\nvar _process_env_NEXT_PUBLIC_API_BASE_URL;\nconst API_BASE_URL = (_process_env_NEXT_PUBLIC_API_BASE_URL = process.env.NEXT_PUBLIC_API_BASE_URL) !== null && _process_env_NEXT_PUBLIC_API_BASE_URL !== void 0 ? _process_env_NEXT_PUBLIC_API_BASE_URL : \"http://localhost:8080\";\n// Map backend partRole to your existing CategoryId values.\nconst PART_ROLE_TO_CATEGORY = {\n // EXISTING\n \"upper-receiver\": \"upper\",\n barrel: \"barrel\",\n handguard: \"handguard\",\n \"charging-handle\": \"chargingHandle\",\n \"buffer-kit\": \"buffer\",\n \"lower-parts-kit\": \"lowerParts\",\n sight: \"sights\",\n \"lower-receiver\": \"lower\",\n optic: \"optic\",\n stock: \"stock\",\n // NEW LOWER PARTS\n trigger: \"trigger\",\n \"trigger-kit\": \"trigger\",\n \"pistol-grip\": \"grip\",\n grip: \"grip\",\n safety: \"safety\",\n \"safety-selector\": \"safety\",\n \"complete-lower\": \"completeLower\",\n // NEW UPPER PARTS\n \"complete-upper\": \"completeUpper\",\n bcg: \"bcg\",\n \"bolt-carrier-group\": \"bcg\",\n \"gas-block\": \"gasBlock\",\n \"gas-tube\": \"gasTube\",\n \"muzzle-device\": \"muzzleDevice\",\n compensator: \"muzzleDevice\",\n brake: \"muzzleDevice\",\n suppressor: \"suppressor\"\n};\nconst STORAGE_KEY = \"gunbuilder-build-state\";\n// Group categories into logical sections.\n//\n// IMPORTANT:\n// These IDs must match the ids you have in CATEGORIES.\n// Anything that doesn't exist will just be skipped.\nconst CATEGORY_GROUPS = [\n {\n id: \"lower-group\",\n label: \"Lower Receiver Parts\",\n description: \"Everything from the serialized lower to small parts, fire control, and core controls.\",\n categoryIds: [\n \"lower\",\n \"completeLower\",\n \"lowerParts\",\n \"trigger\",\n \"grip\",\n \"safety\",\n \"buffer\",\n \"stock\"\n ]\n },\n {\n id: \"upper-group\",\n label: \"Upper Receiver Parts\",\n description: \"Barrel, upper, gas system, and the parts that keep the rifle cycling.\",\n categoryIds: [\n \"upper\",\n \"completeUpper\",\n \"bcg\",\n \"barrel\",\n \"gasBlock\",\n \"gasTube\",\n \"muzzleDevice\",\n \"suppressor\",\n \"handguard\",\n \"chargingHandle\",\n \"sights\",\n \"optic\"\n ]\n }\n];\nfunction GunbuilderPage() {\n _s();\n const searchParams = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams)();\n const router = (0,next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter)();\n const [parts, setParts] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]);\n const [loading, setLoading] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(true);\n const [error, setError] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);\n const [build, setBuild] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(()=>{\n if (true) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored) {\n try {\n return JSON.parse(stored);\n } catch (e) {\n return {};\n }\n }\n }\n return {};\n });\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const controller = new AbortController();\n async function fetchProducts() {\n try {\n setLoading(true);\n setError(null);\n const res = await fetch(\"\".concat(API_BASE_URL, \"/api/products/gunbuilder?platform=AR-15\"), {\n signal: controller.signal\n });\n if (!res.ok) {\n throw new Error(\"Failed to load products (\".concat(res.status, \")\"));\n }\n const data = await res.json();\n const normalized = data.map((p)=>{\n const categoryId = PART_ROLE_TO_CATEGORY[p.partRole];\n if (!categoryId) {\n // Skip any parts we don't know how to map yet\n return null;\n }\n var _p_price, _p_mainImageUrl, _p_buyUrl;\n return {\n id: String(p.id),\n categoryId,\n name: p.name,\n brand: p.brand,\n price: (_p_price = p.price) !== null && _p_price !== void 0 ? _p_price : 0,\n imageUrl: (_p_mainImageUrl = p.mainImageUrl) !== null && _p_mainImageUrl !== void 0 ? _p_mainImageUrl : undefined,\n url: (_p_buyUrl = p.buyUrl) !== null && _p_buyUrl !== void 0 ? _p_buyUrl : undefined,\n notes: undefined\n };\n }).filter((p)=>p !== null);\n setParts(normalized);\n } catch (err) {\n if (err.name === \"AbortError\") return;\n var _err_message;\n setError((_err_message = err.message) !== null && _err_message !== void 0 ? _err_message : \"Failed to load products\");\n } finally{\n setLoading(false);\n }\n }\n fetchProducts();\n return ()=>controller.abort();\n }, []);\n // Handle URL query parameter for part selection (?select=upper:165)\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n const selectParam = searchParams.get(\"select\");\n if (selectParam) {\n const [categoryId, partId] = selectParam.split(\":\");\n if (categoryId && partId && _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === categoryId)) {\n setBuild((prev)=>{\n const updated = {\n ...prev,\n [categoryId]: partId\n };\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(updated));\n }\n return updated;\n });\n router.replace(\"/gunbuilder\", {\n scroll: false\n });\n }\n }\n }, [\n searchParams,\n router\n ]);\n // Persist build state to localStorage whenever it changes\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{\n if (true) {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(build));\n }\n }, [\n build\n ]);\n const partsByCategory = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n const grouped = {};\n for (const category of _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES){\n grouped[category.id] = parts.filter((p)=>p.categoryId === category.id);\n }\n return grouped;\n }, [\n parts\n ]);\n const selectedParts = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>{\n return Object.entries(build).map((param)=>{\n let [categoryId, partId] = param;\n return parts.find((p)=>p.id === partId && p.categoryId === categoryId);\n }).filter(Boolean);\n }, [\n build,\n parts\n ]);\n const totalPrice = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>selectedParts.reduce((sum, p)=>sum + p.price, 0), [\n selectedParts\n ]);\n const handleSelectPart = (categoryId, partId)=>{\n setBuild((prev)=>({\n ...prev,\n [categoryId]: partId\n }));\n };\n // Use group ordering for the summary as well\n const summaryCategoryOrder = (0,react__WEBPACK_IMPORTED_MODULE_1__.useMemo)(()=>CATEGORY_GROUPS.flatMap((group)=>group.categoryIds).filter((id)=>_data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.some((c)=>c.id === id)), []);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"main\", {\n className: \"min-h-screen bg-black text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border-b border-amber-500/20 bg-amber-500/5\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto flex max-w-6xl flex-col gap-1 px-4 py-2 text-[0.75rem] text-amber-100 md:flex-row md:items-center md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"rounded-sm bg-amber-500/20 px-2 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] text-amber-300\",\n children: \"Early Access Beta\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 259,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"hidden text-amber-100/90 md:inline\",\n children: \"You're using an early-access prototype of The Armory. Data, pricing, and available parts are still evolving.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 262,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 258,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-100/90 md:hidden\",\n children: \"Early-access prototype. Data and pricing may change.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 267,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 257,\n columnNumber: 9\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 256,\n columnNumber: 7\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mx-auto max-w-6xl px-4 py-6 lg:py-10\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"header\", {\n className: \"mb-6 flex flex-col gap-2 md:flex-row md:items-end md:justify-between\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs font-semibold tracking-[0.2em] uppercase text-zinc-500\",\n children: \"Shadow Standard\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 276,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h1\", {\n className: \"mt-1 text-2xl md:text-3xl font-semibold tracking-tight\",\n children: [\n \"The Armory: \",\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-amber-300\",\n children: \"Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 280,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 279,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-sm text-zinc-400 max-w-xl\",\n children: \"Explore components from trusted brands, choose one part per category, track live prices, and watch your total build cost update as you go. This early-access builder keeps your setup saved locally so you can come back and refine it anytime.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 282,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 275,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-3 md:mt-0\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-400\",\n children: \"Current build total\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 291,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-2xl font-semibold text-amber-300\",\n children: [\n \"$\",\n totalPrice.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 292,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs text-zinc-500\",\n children: [\n selectedParts.length,\n \" / \",\n _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.length,\n \" categories filled\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 295,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 290,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 274,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 lg:grid-cols-[3fr,1.25fr]\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/60 p-3 md:p-4\",\n children: [\n loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Loading parts from backend…\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 306,\n columnNumber: 15\n }, this),\n error && !loading && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-red-400\",\n children: [\n error,\n \" — check that the Ballistic API is running and CORS is configured.\"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 311,\n columnNumber: 15\n }, this),\n !loading && !error && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-6\",\n children: CATEGORY_GROUPS.map((group)=>{\n const groupCategories = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.filter((c)=>group.categoryIds.includes(c.id));\n if (groupCategories.length === 0) {\n return null;\n }\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"space-y-3\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex items-baseline justify-between gap-2\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-sm font-semibold text-zinc-100\",\n children: group.label\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 331,\n columnNumber: 27\n }, this),\n group.description && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-xs text-zinc-500 mt-1 max-w-xl\",\n children: group.description\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 335,\n columnNumber: 29\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 330,\n columnNumber: 25\n }, this)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 329,\n columnNumber: 23\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"grid gap-4 md:grid-cols-2 lg:grid-cols-3\",\n children: groupCategories.map((category)=>/*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"border border-zinc-800 rounded-md p-2 md:p-3 bg-zinc-950/60\",\n children: /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(_components_CategoryColumn__WEBPACK_IMPORTED_MODULE_5__.CategoryColumn, {\n category: category,\n parts: partsByCategory[category.id],\n selectedPartId: build[category.id],\n onSelectPart: (partId)=>handleSelectPart(category.id, partId)\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 348,\n columnNumber: 29\n }, this)\n }, category.id, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 344,\n columnNumber: 27\n }, this))\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 342,\n columnNumber: 23\n }, this)\n ]\n }, group.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 328,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 317,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 304,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"aside\", {\n className: \"rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4 flex flex-col\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold tracking-[0.16em] uppercase text-zinc-400 mb-3\",\n children: \"Current Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 368,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"flex-1 overflow-y-auto pr-1\",\n children: [\n selectedParts.length === 0 && /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"text-sm text-zinc-500\",\n children: \"Select a part from each category to start your build.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 374,\n columnNumber: 17\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"space-y-2\",\n children: summaryCategoryOrder.map((categoryId)=>{\n const cat = _data_gunbuilderParts__WEBPACK_IMPORTED_MODULE_4__.CATEGORIES.find((c)=>c.id === categoryId);\n if (!cat) return null;\n const selectedPartId = build[cat.id];\n const part = parts.find((p)=>p.id === selectedPartId && p.categoryId === cat.id);\n return /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-[0.7rem] uppercase tracking-[0.16em] text-zinc-500\",\n children: cat.name\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 392,\n columnNumber: 23\n }, this),\n part ? /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 flex justify-between items-center gap-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-sm text-zinc-50\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"span\", {\n className: \"text-zinc-400\",\n children: [\n part.brand,\n \" \"\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 398,\n columnNumber: 29\n }, this),\n part.name\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 397,\n columnNumber: 27\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"text-xs font-semibold text-amber-300 whitespace-nowrap\",\n children: [\n \"$\",\n part.price.toFixed(2)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 403,\n columnNumber: 27\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 396,\n columnNumber: 25\n }, this) : /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-1 text-xs text-zinc-600\",\n children: \"Not selected\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 408,\n columnNumber: 25\n }, this)\n ]\n }, cat.id, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 391,\n columnNumber: 21\n }, this);\n })\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 379,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 372,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"div\", {\n className: \"mt-4 border-t border-zinc-800 pt-3 space-y-2\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(next_link__WEBPACK_IMPORTED_MODULE_2__[\"default\"], {\n href: \"/gunbuilder/build\",\n className: \"block w-full rounded-md border border-amber-400/60 bg-amber-400/10 px-3 py-2 text-sm font-medium text-amber-200 hover:bg-amber-400/15 text-center transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed pointer-events-none\" : \"\"),\n children: \"Build Summary\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 420,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"button\", {\n type: \"button\",\n onClick: ()=>{\n setBuild({});\n if (true) {\n localStorage.removeItem(STORAGE_KEY);\n }\n },\n disabled: selectedParts.length === 0,\n className: \"w-full rounded-md border border-zinc-700 bg-zinc-900/50 px-3 py-2 text-sm font-medium text-zinc-300 hover:bg-zinc-800 hover:border-zinc-600 transition-colors \".concat(selectedParts.length === 0 ? \"opacity-40 cursor-not-allowed\" : \"\"),\n children: \"Clear Build\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 430,\n columnNumber: 15\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"p\", {\n className: \"mt-2 text-[0.7rem] text-zinc-500\",\n children: \"View your build breakdown and share it with others.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 447,\n columnNumber: 15\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 419,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 367,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 302,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's New in Early Access\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 456,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Live parts and pricing pulled from multiple merchants.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 460,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Grouped layout for lower and upper receiver parts so you can see at a glance which sections of your build are still missing.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 461,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Running build total that updates automatically as you add or swap components.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 465,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Local build persistence so your selections stick around between visits on this device.\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 469,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 459,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 455,\n columnNumber: 9\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"section\", {\n className: \"mt-8 rounded-lg border border-zinc-800 bg-zinc-950/80 p-3 md:p-4\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"h2\", {\n className: \"text-xs font-semibold uppercase tracking-[0.16em] text-amber-300\",\n children: \"What's on our roadmap\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 478,\n columnNumber: 11\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"ul\", {\n className: \"mt-2 space-y-1 text-sm text-zinc-400\",\n children: [\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Platform filters (AR-15, AR-9, AR-10)\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 482,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• More part categories and furniture\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 483,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Richer pricing/stock sync\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 484,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• Smarter compatibility checks between components\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 485,\n columnNumber: 13\n }, this),\n /*#__PURE__*/ (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_0__.jsxDEV)(\"li\", {\n children: \"• AR9/AR10 support and more\"\n }, void 0, false, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 486,\n columnNumber: 13\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 481,\n columnNumber: 11\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 477,\n columnNumber: 9\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 272,\n columnNumber: 7\n }, this)\n ]\n }, void 0, true, {\n fileName: \"/Users/sean/Dev/gunbuilder-prototype/app/gunbuilder/page.tsx\",\n lineNumber: 255,\n columnNumber: 5\n }, this);\n}\n_s(GunbuilderPage, \"Svlr/SlMEdeu/xZZnR5gKrepPAg=\", false, function() {\n return [\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useSearchParams,\n next_navigation__WEBPACK_IMPORTED_MODULE_3__.useRouter\n ];\n});\n_c = GunbuilderPage;\nvar _c;\n$RefreshReg$(_c, \"GunbuilderPage\");\n\n\n;\n // Wrapped in an IIFE to avoid polluting the global scope\n ;\n (function () {\n var _a, _b;\n // Legacy CSS implementations will `eval` browser code in a Node.js context\n // to extract CSS. For backwards compatibility, we need to check we're in a\n // browser context before continuing.\n if (typeof self !== 'undefined' &&\n // AMP / No-JS mode does not inject these helpers:\n '$RefreshHelpers$' in self) {\n // @ts-ignore __webpack_module__ is global\n var currentExports = module.exports;\n // @ts-ignore __webpack_module__ is global\n var prevSignature = (_b = (_a = module.hot.data) === null || _a === void 0 ? void 0 : _a.prevSignature) !== null && _b !== void 0 ? _b : null;\n // This cannot happen in MainTemplate because the exports mismatch between\n // templating and execution.\n self.$RefreshHelpers$.registerExportsForReactRefresh(currentExports, module.id);\n // A module can be accepted automatically based on its exports, e.g. when\n // it is a Refresh Boundary.\n if (self.$RefreshHelpers$.isReactRefreshBoundary(currentExports)) {\n // Save the previous exports signature on update so we can compare the boundary\n // signatures. We avoid saving exports themselves since it causes memory leaks (https://github.com/vercel/next.js/pull/53797)\n module.hot.dispose(function (data) {\n data.prevSignature =\n self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports);\n });\n // Unconditionally accept an update to this module, we'll check if it's\n // still a Refresh Boundary later.\n // @ts-ignore importMeta is replaced in the loader\n module.hot.accept();\n // This field is set when the previous version of this module was a\n // Refresh Boundary, letting us know we need to check for invalidation or\n // enqueue an update.\n if (prevSignature !== null) {\n // A boundary can become ineligible if its exports are incompatible\n // with the previous exports.\n //\n // For example, if you add/remove/change exports, we'll want to\n // re-execute the importing modules, and force those components to\n // re-render. Similarly, if you convert a class component to a\n // function, we want to invalidate the boundary.\n if (self.$RefreshHelpers$.shouldInvalidateReactRefreshBoundary(prevSignature, self.$RefreshHelpers$.getRefreshBoundarySignature(currentExports))) {\n module.hot.invalidate();\n }\n else {\n self.$RefreshHelpers$.scheduleUpdate();\n }\n }\n }\n else {\n // Since we just executed the code for the module, it's possible that the\n // new exports made it ineligible for being a boundary.\n // We only care about the case when we were _previously_ a boundary,\n // because we already accepted this update (accidental side effect).\n var isNoLongerABoundary = prevSignature !== null;\n if (isNoLongerABoundary) {\n module.hot.invalidate();\n }\n }\n }\n })();\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKGFwcC1wYWdlcy1icm93c2VyKS8uL2FwcC9ndW5idWlsZGVyL3BhZ2UudHN4IiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBRXFEO0FBQ3hCO0FBQ2dDO0FBQ1Q7QUFFUztJQWMzRFE7QUFERixNQUFNQyxlQUNKRCxDQUFBQSx3Q0FBQUEsT0FBT0EsQ0FBQ0UsR0FBRyxDQUFDQyx3QkFBd0IsY0FBcENILG1EQUFBQSx3Q0FBd0M7QUFFMUMsMkRBQTJEO0FBQzNELE1BQU1JLHdCQUFvRDtJQUN4RCxXQUFXO0lBQ1gsa0JBQWtCO0lBQ2xCQyxRQUFRO0lBQ1JDLFdBQVc7SUFDWCxtQkFBbUI7SUFDbkIsY0FBYztJQUNkLG1CQUFtQjtJQUNuQkMsT0FBTztJQUNQLGtCQUFrQjtJQUNsQkMsT0FBTztJQUNQQyxPQUFPO0lBRVAsa0JBQWtCO0lBQ2xCQyxTQUFTO0lBQ1QsZUFBZTtJQUNmLGVBQWU7SUFDZkMsTUFBTTtJQUNOQyxRQUFRO0lBQ1IsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUVsQixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCQyxLQUFLO0lBQ0wsc0JBQXNCO0lBQ3RCLGFBQWE7SUFDYixZQUFZO0lBQ1osaUJBQWlCO0lBQ2pCQyxhQUFhO0lBQ2JDLE9BQU87SUFDUEMsWUFBWTtBQUNkO0FBSUEsTUFBTUMsY0FBYztBQUVwQiwwQ0FBMEM7QUFDMUMsRUFBRTtBQUNGLGFBQWE7QUFDYix1REFBdUQ7QUFDdkQsb0RBQW9EO0FBQ3BELE1BQU1DLGtCQUtBO0lBQ0o7UUFDRUMsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7U0FDRDtJQUNIO0lBQ0E7UUFDRUgsSUFBSTtRQUNKQyxPQUFPO1FBQ1BDLGFBQ0U7UUFDRkMsYUFBYTtZQUNYO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtZQUNBO1lBQ0E7WUFDQTtTQUNEO0lBQ0g7Q0FDRDtB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LDhEQUFDQTtrREFBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBTWhCO0dBNVh3QjNGOztRQUNEM0IsNERBQWVBO1FBQ3JCQyxzREFBU0E7OztLQUZGMEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9fTl9FLy4vYXBwL2d1bmJ1aWxkZXIvcGFnZS50c3g/MDU0MCJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBjbGllbnRcIjtcblxuaW1wb3J0IHsgdXNlTWVtbywgdXNlU3RhdGUsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IExpbmsgZnJvbSBcIm5leHQvbGlua1wiO1xuaW1wb3J0IHsgdXNlU2VhcmNoUGFyYW1zLCB1c2VSb3V0ZXIgfSBmcm9tIFwibmV4dC9uYXZpZ2F0aW9uXCI7XG5pbXBvcnQgeyBDQVRFR09SSUVTIH0gZnJvbSBcIkAvZGF0YS9ndW5idWlsZGVyUGFydHNcIjtcbmltcG9ydCB0eXBlIHsgQ2F0ZWdvcnlJZCwgUGFydCB9IGZyb20gXCJAL3R5cGVzL2d1bmJ1aWxkZXJcIjtcbmltcG9ydCB7IENhdGVnb3J5Q29sdW1uIH0gZnJvbSBcIkAvY29tcG9uZW50cy9DYXRlZ29yeUNvbHVtblwiO1xuXG50eXBlIEd1bmJ1aWxkZXJQcm9kdWN0RnJvbUFwaSA9IHtcbiAgaWQ6IG51bWJlcjsgLy8gYmFja2VuZCBudW1lcmljIGlkXG4gIG5hbWU6IHN0cmluZztcbiAgYnJhbmQ6IHN0cmluZztcbiAgcGxhdGZvcm06IHN0cmluZztcbiAgcGFydFJvbGU6IHN0cmluZztcbiAgcHJpY2U6IG51bWJlciB8IG51bGw7XG4gIG1haW5JbWFnZVVybDogc3RyaW5nIHwgbnVsbDtcbiAgYnV5VXJsOiBzdHJpbmcgfCBudWxsO1xufTtcblxuY29uc3QgQVBJX0JBU0VfVVJMID1cbiAgcHJvY2Vzcy5lbnYuTkVYVF9QVUJMSUNfQVBJX0JBU0VfVVJMID8/IFwiaHR0cDovL2xvY2FsaG9zdDo4MDgwXCI7XG5cbi8vIE1hcCBiYWNrZW5kIHBhcnRSb2xlIHRvIHlvdXIgZXhpc3RpbmcgQ2F0ZWdvcnlJZCB2YWx1ZXMuXG5jb25zdCBQQVJUX1JPTEVfVE9fQ0FURUdPUlk6IFJlY29yZDxzdHJpbmcsIENhdGVnb3J5SWQ+ID0ge1xuICAvLyBFWElTVElOR1xuICBcInVwcGVyLXJlY2VpdmVyXCI6IFwidXBwZXJcIixcbiAgYmFycmVsOiBcImJhcnJlbFwiLFxuICBoYW5kZ3VhcmQ6IFwiaGFuZGd1YXJkXCIsXG4gIFwiY2hhcmdpbmctaGFuZGxlXCI6IFwiY2hhcmdpbmdIYW5kbGVcIixcbiAgXCJidWZmZXIta2l0XCI6IFwiYnVmZmVyXCIsXG4gIFwibG93ZXItcGFydHMta2l0XCI6IFwibG93ZXJQYXJ0c1wiLFxuICBzaWdodDogXCJzaWdodHNcIixcbiAgXCJsb3dlci1yZWNlaXZlclwiOiBcImxvd2VyXCIsXG4gIG9wdGljOiBcIm9wdGljXCIsXG4gIHN0b2NrOiBcInN0b2NrXCIsXG5cbiAgLy8gTkVXIExPV0VSIFBBUlRTXG4gIHRyaWdnZXI6IFwidHJpZ2dlclwiLFxuICBcInRyaWdnZXIta2l0XCI6IFwidHJpZ2dlclwiLFxuICBcInBpc3RvbC1ncmlwXCI6IFwiZ3JpcFwiLFxuICBncmlwOiBcImdyaXBcIixcbiAgc2FmZXR5OiBcInNhZmV0eVwiLFxuICBcInNhZmV0eS1zZWxlY3RvclwiOiBcInNhZmV0eVwiLFxuICBcImNvbXBsZXRlLWxvd2VyXCI6IFwiY29tcGxldGVMb3dlclwiLFxuXG4gIC8vIE5FVyBVUFBFUiBQQVJUU1xuICBcImNvbXBsZXRlLXVwcGVyXCI6IFwiY29tcGxldGVVcHBlclwiLFxuICBiY2c6IFwiYmNnXCIsXG4gIFwiYm9sdC1jYXJyaWVyLWdyb3VwXCI6IFwiYmNnXCIsXG4gIFwiZ2FzLWJsb2NrXCI6IFwiZ2FzQmxvY2tcIixcbiAgXCJnYXMtdHViZVwiOiBcImdhc1R1YmVcIixcbiAgXCJtdXp6bGUtZGV2aWNlXCI6IFwibXV6emxlRGV2aWNlXCIsXG4gIGNvbXBlbnNhdG9yOiBcIm11enpsZURldmljZVwiLFxuICBicmFrZTogXCJtdXp6bGVEZXZpY2VcIixcbiAgc3VwcHJlc3NvcjogXCJzdXBwcmVzc29yXCIsXG59O1xuXG50eXBlIEJ1aWxkU3RhdGUgPSBQYXJ0aWFsPFJlY29yZDxDYXRlZ29yeUlkLCBzdHJpbmc+PjsgLy8gY2F0ZWdvcnlJZCAtPiBwYXJ0SWRcblxuY29uc3QgU1RPUkFHRV9LRVkgPSBcImd1bmJ1aWxkZXItYnVpbGQtc3RhdGVcIjtcblxuLy8gR3JvdXAgY2F0ZWdvcmllcyBpbnRvIGxvZ2ljYWwgc2VjdGlvbnMuXG4vL1xuLy8gSU1QT1JUQU5UOlxuLy8gVGhlc2UgSURzIG11c3QgbWF0Y2ggdGhlIGlkcyB5b3UgaGF2ZSBpbiBDQVRFR09SSUVTLlxuLy8gQW55dGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0IHdpbGwganVzdCBiZSBza2lwcGVkLlxuY29uc3QgQ0FURUdPUllfR1JPVVBTOiB7XG4gIGlkOiBzdHJpbmc7XG4gIGxhYmVsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBjYXRlZ29yeUlkczogQ2F0ZWdvcnlJZFtdO1xufVtdID0gW1xuICB7XG4gICAgaWQ6IFwibG93ZXItZ3JvdXBcIixcbiAgICBsYWJlbDogXCJMb3dlciBSZWNlaXZlciBQYXJ0c1wiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJFdmVyeXRoaW5nIGZyb20gdGhlIHNlcmlhbGl6ZWQgbG93ZXIgdG8gc21hbGwgcGFydHMsIGZpcmUgY29udHJvbCwgYW5kIGNvcmUgY29udHJvbHMuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwibG93ZXJcIixcbiAgICAgIFwiY29tcGxldGVMb3dlclwiLFxuICAgICAgXCJsb3dlclBhcnRzXCIsXG4gICAgICBcInRyaWdnZXJcIixcbiAgICAgIFwiZ3JpcFwiLFxuICAgICAgXCJzYWZldHlcIixcbiAgICAgIFwiYnVmZmVyXCIsXG4gICAgICBcInN0b2NrXCIsXG4gICAgXSxcbiAgfSxcbiAge1xuICAgIGlkOiBcInVwcGVyLWdyb3VwXCIsXG4gICAgbGFiZWw6IFwiVXBwZXIgUmVjZWl2ZXIgUGFydHNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiQmFycmVsLCB1cHBlciwgZ2FzIHN5c3RlbSwgYW5kIHRoZSBwYXJ0cyB0aGF0IGtlZXAgdGhlIHJpZmxlIGN5Y2xpbmcuXCIsXG4gICAgY2F0ZWdvcnlJZHM6IFtcbiAgICAgIFwidXBwZXJcIixcbiAgICAgIFwiY29tcGxldGVVcHBlclwiLFxuICAgICAgXCJiY2dcIixcbiAgICAgIFwiYmFycmVsXCIsXG4gICAgICBcImdhc0Jsb2NrXCIsXG4gICAgICBcImdhc1R1YmVcIixcbiAgICAgIFwibXV6emxlRGV2aWNlXCIsXG4gICAgICBcInN1cHByZXNzb3JcIixcbiAgICAgIFwiaGFuZGd1YXJkXCIsXG4gICAgICBcImNoYXJnaW5nSGFuZGxlXCIsXG4gICAgICBcInNpZ2h0c1wiLFxuICAgICAgXCJvcHRpY1wiLFxuICAgIF0sXG4gIH0sXG5dO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBHdW5idWlsZGVyUGFnZSgpIHtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gdXNlU2VhcmNoUGFyYW1zKCk7XG4gIGNvbnN0IHJvdXRlciA9IHVzZVJvdXRlcigpO1xuICBjb25zdCBbcGFydHMsIHNldFBhcnRzXSA9IHVzZVN0YXRlPFBhcnRbXT4oW10pO1xuICBjb25zdCBbbG9hZGluZywgc2V0TG9hZGluZ10gPSB1c2VTdGF0ZSh0cnVlKTtcbiAgY29uc3QgW2Vycm9yLCBzZXRFcnJvcl0gPSB1c2VTdGF0ZTxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgY29uc3QgW2J1aWxkLCBzZXRCdWlsZF0gPSB1c2VTdGF0ZTxCdWlsZFN0YXRlPigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGNvbnN0IHN0b3JlZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKFNUT1JBR0VfS0VZKTtcbiAgICAgIGlmIChzdG9yZWQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdG9yZWQpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9KTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG5cbiAgICBhc3luYyBmdW5jdGlvbiBmZXRjaFByb2R1Y3RzKCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2V0TG9hZGluZyh0cnVlKTtcbiAgICAgICAgc2V0RXJyb3IobnVsbCk7XG5cbiAgICAgICAgY29uc3QgcmVzID0gYXdhaXQgZmV0Y2goXG4gICAgICAgICAgYCR7QVBJX0JBU0VfVVJMfS9hcGkvcHJvZHVjdHMvZ3VuYnVpbGRlcj9wbGF0Zm9ybT1BUi0xNWAsXG4gICAgICAgICAgeyBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBsb2FkIHByb2R1Y3RzICgke3Jlcy5zdGF0dXN9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGF0YTogR3VuYnVpbGRlclByb2R1Y3RGcm9tQXBpW10gPSBhd2FpdCByZXMuanNvbigpO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWQ6IFBhcnRbXSA9IGRhdGFcbiAgICAgICAgICAubWFwKChwKTogUGFydCB8IG51bGwgPT4ge1xuICAgICAgICAgICAgY29uc3QgY2F0ZWdvcnlJZCA9IFBBUlRfUk9MRV9UT19DQVRFR09SWVtwLnBhcnRSb2xlXTtcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAvLyBTa2lwIGFueSBwYXJ0cyB3ZSBkb24ndCBrbm93IGhvdyB0byBtYXAgeWV0XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpZDogU3RyaW5nKHAuaWQpLCAvLyBBTFdBWVMgc3RyaW5nXG4gICAgICAgICAgICAgIGNhdGVnb3J5SWQsXG4gICAgICAgICAgICAgIG5hbWU6IHAubmFtZSxcbiAgICAgICAgICAgICAgYnJhbmQ6IHAuYnJhbmQsXG4gICAgICAgICAgICAgIHByaWNlOiBwLnByaWNlID8/IDAsXG4gICAgICAgICAgICAgIGltYWdlVXJsOiBwLm1haW5JbWFnZVVybCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVybDogcC5idXlVcmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBub3RlczogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHApOiBwIGlzIFBhcnQgPT4gcCAhPT0gbnVsbCk7XG5cbiAgICAgICAgc2V0UGFydHMobm9ybWFsaXplZCk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBpZiAoZXJyLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSByZXR1cm47XG4gICAgICAgIHNldEVycm9yKGVyci5tZXNzYWdlID8/IFwiRmFpbGVkIHRvIGxvYWQgcHJvZHVjdHNcIik7XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmZXRjaFByb2R1Y3RzKCk7XG5cbiAgICByZXR1cm4gKCkgPT4gY29udHJvbGxlci5hYm9ydCgpO1xuICB9LCBbXSk7XG5cbiAgLy8gSGFuZGxlIFVSTCBxdWVyeSBwYXJhbWV0ZXIgZm9yIHBhcnQgc2VsZWN0aW9uICg/c2VsZWN0PXVwcGVyOjE2NSlcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBzZWxlY3RQYXJhbSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJzZWxlY3RcIik7XG4gICAgaWYgKHNlbGVjdFBhcmFtKSB7XG4gICAgICBjb25zdCBbY2F0ZWdvcnlJZCwgcGFydElkXSA9IHNlbGVjdFBhcmFtLnNwbGl0KFwiOlwiKTtcbiAgICAgIGlmIChjYXRlZ29yeUlkICYmIHBhcnRJZCAmJiBDQVRFR09SSUVTLnNvbWUoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpKSB7XG4gICAgICAgIHNldEJ1aWxkKChwcmV2KSA9PiB7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZCA9IHtcbiAgICAgICAgICAgIC4uLnByZXYsXG4gICAgICAgICAgICBbY2F0ZWdvcnlJZCBhcyBDYXRlZ29yeUlkXTogcGFydElkLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFNUT1JBR0VfS0VZLCBKU09OLnN0cmluZ2lmeSh1cGRhdGVkKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB1cGRhdGVkO1xuICAgICAgICB9KTtcblxuICAgICAgICByb3V0ZXIucmVwbGFjZShcIi9ndW5idWlsZGVyXCIsIHsgc2Nyb2xsOiBmYWxzZSB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtzZWFyY2hQYXJhbXMsIHJvdXRlcl0pO1xuXG4gIC8vIFBlcnNpc3QgYnVpbGQgc3RhdGUgdG8gbG9jYWxTdG9yYWdlIHdoZW5ldmVyIGl0IGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oU1RPUkFHRV9LRVksIEpTT04uc3RyaW5naWZ5KGJ1aWxkKSk7XG4gICAgfVxuICB9LCBbYnVpbGRdKTtcblxuICBjb25zdCBwYXJ0c0J5Q2F0ZWdvcnk6IFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZ3JvdXBlZCA9IHt9IGFzIFJlY29yZDxDYXRlZ29yeUlkLCBQYXJ0W10+O1xuICAgIGZvciAoY29uc3QgY2F0ZWdvcnkgb2YgQ0FURUdPUklFUykge1xuICAgICAgZ3JvdXBlZFtjYXRlZ29yeS5pZF0gPSBwYXJ0cy5maWx0ZXIoXG4gICAgICAgIChwKSA9PiBwLmNhdGVnb3J5SWQgPT09IGNhdGVnb3J5LmlkLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGdyb3VwZWQ7XG4gIH0sIFtwYXJ0c10pO1xuXG4gIGNvbnN0IHNlbGVjdGVkUGFydHM6IFBhcnRbXSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhidWlsZClcbiAgICAgIC5tYXAoKFtjYXRlZ29yeUlkLCBwYXJ0SWRdKSA9PlxuICAgICAgICBwYXJ0cy5maW5kKChwKSA9PiBwLmlkID09PSBwYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXRlZ29yeUlkKSxcbiAgICAgIClcbiAgICAgIC5maWx0ZXIoQm9vbGVhbikgYXMgUGFydFtdO1xuICB9LCBbYnVpbGQsIHBhcnRzXSk7XG5cbiAgY29uc3QgdG90YWxQcmljZSA9IHVzZU1lbW8oXG4gICAgKCkgPT4gc2VsZWN0ZWRQYXJ0cy5yZWR1Y2UoKHN1bSwgcCkgPT4gc3VtICsgcC5wcmljZSwgMCksXG4gICAgW3NlbGVjdGVkUGFydHNdLFxuICApO1xuXG4gIGNvbnN0IGhhbmRsZVNlbGVjdFBhcnQgPSAoY2F0ZWdvcnlJZDogQ2F0ZWdvcnlJZCwgcGFydElkOiBzdHJpbmcpID0+IHtcbiAgICBzZXRCdWlsZCgocHJldikgPT4gKHtcbiAgICAgIC4uLnByZXYsXG4gICAgICBbY2F0ZWdvcnlJZF06IHBhcnRJZCxcbiAgICB9KSk7XG4gIH07XG5cbiAgLy8gVXNlIGdyb3VwIG9yZGVyaW5nIGZvciB0aGUgc3VtbWFyeSBhcyB3ZWxsXG4gIGNvbnN0IHN1bW1hcnlDYXRlZ29yeU9yZGVyOiBDYXRlZ29yeUlkW10gPSB1c2VNZW1vKFxuICAgICgpID0+XG4gICAgICBDQVRFR09SWV9HUk9VUFMuZmxhdE1hcCgoZ3JvdXApID0+IGdyb3VwLmNhdGVnb3J5SWRzKS5maWx0ZXIoXG4gICAgICAgIChpZCkgPT4gQ0FURUdPUklFUy5zb21lKChjKSA9PiBjLmlkID09PSBpZCksXG4gICAgICApLFxuICAgIFtdLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgPG1haW4gY2xhc3NOYW1lPVwibWluLWgtc2NyZWVuIGJnLWJsYWNrIHRleHQtemluYy01MFwiPlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJib3JkZXItYiBib3JkZXItYW1iZXItNTAwLzIwIGJnLWFtYmVyLTUwMC81XCI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXgtYXV0byBmbGV4IG1heC13LTZ4bCBmbGV4LWNvbCBnYXAtMSBweC00IHB5LTIgdGV4dC1bMC43NXJlbV0gdGV4dC1hbWJlci0xMDAgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtY2VudGVyIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInJvdW5kZWQtc20gYmctYW1iZXItNTAwLzIwIHB4LTIgcHktMC41IHRleHQtWzAuNjVyZW1dIGZvbnQtc2VtaWJvbGQgdXBwZXJjYXNlIHRyYWNraW5nLVswLjE4ZW1dIHRleHQtYW1iZXItMzAwXCI+XG4gICAgICAgICAgICAgIEVhcmx5IEFjY2VzcyBCZXRhXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gdGV4dC1hbWJlci0xMDAvOTAgbWQ6aW5saW5lXCI+XG4gICAgICAgICAgICAgIFlvdSZhcG9zO3JlIHVzaW5nIGFuIGVhcmx5LWFjY2VzcyBwcm90b3R5cGUgb2YgVGhlIEFybW9yeS4gRGF0YSxcbiAgICAgICAgICAgICAgcHJpY2luZywgYW5kIGF2YWlsYWJsZSBwYXJ0cyBhcmUgc3RpbGwgZXZvbHZpbmcuXG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0xMDAvOTAgbWQ6aGlkZGVuXCI+XG4gICAgICAgICAgICBFYXJseS1hY2Nlc3MgcHJvdG90eXBlLiBEYXRhIGFuZCBwcmljaW5nIG1heSBjaGFuZ2UuXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJteC1hdXRvIG1heC13LTZ4bCBweC00IHB5LTYgbGc6cHktMTBcIj5cbiAgICAgICAgey8qIEhlYWRlciAqL31cbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJtYi02IGZsZXggZmxleC1jb2wgZ2FwLTIgbWQ6ZmxleC1yb3cgbWQ6aXRlbXMtZW5kIG1kOmp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctWzAuMmVtXSB1cHBlcmNhc2UgdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICBTaGFkb3cgU3RhbmRhcmRcbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxoMSBjbGFzc05hbWU9XCJtdC0xIHRleHQtMnhsIG1kOnRleHQtM3hsIGZvbnQtc2VtaWJvbGQgdHJhY2tpbmctdGlnaHRcIj5cbiAgICAgICAgICAgICAgVGhlIEFybW9yeTogPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1hbWJlci0zMDBcIj5FYXJseSBBY2Nlc3M8L3NwYW4+XG4gICAgICAgICAgICA8L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LXNtIHRleHQtemluYy00MDAgbWF4LXcteGxcIj5cbiAgICAgICAgICAgICAgRXhwbG9yZSBjb21wb25lbnRzIGZyb20gdHJ1c3RlZCBicmFuZHMsIGNob29zZSBvbmUgcGFydCBwZXJcbiAgICAgICAgICAgICAgY2F0ZWdvcnksIHRyYWNrIGxpdmUgcHJpY2VzLCBhbmQgd2F0Y2ggeW91ciB0b3RhbCBidWlsZCBjb3N0XG4gICAgICAgICAgICAgIHVwZGF0ZSBhcyB5b3UgZ28uIFRoaXMgZWFybHktYWNjZXNzIGJ1aWxkZXIga2VlcHMgeW91ciBzZXR1cCBzYXZlZFxuICAgICAgICAgICAgICBsb2NhbGx5IHNvIHlvdSBjYW4gY29tZSBiYWNrIGFuZCByZWZpbmUgaXQgYW55dGltZS5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtMyBtZDptdC0wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTQwMFwiPkN1cnJlbnQgYnVpbGQgdG90YWw8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC0yeGwgZm9udC1zZW1pYm9sZCB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgICAke3RvdGFsUHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RofSAvIHtDQVRFR09SSUVTLmxlbmd0aH0gY2F0ZWdvcmllcyBmaWxsZWRcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2hlYWRlcj5cblxuICAgICAgICB7LyogTGF5b3V0ICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbGc6Z3JpZC1jb2xzLVszZnIsMS4yNWZyXVwiPlxuICAgICAgICAgIHsvKiBDYXRlZ29yaWVzL3BhcnRzICovfVxuICAgICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cInJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC82MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgICB7bG9hZGluZyAmJiAoXG4gICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgIExvYWRpbmcgcGFydHMgZnJvbSBiYWNrZW5k4oCmXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7ZXJyb3IgJiYgIWxvYWRpbmcgJiYgKFxuICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtcmVkLTQwMFwiPlxuICAgICAgICAgICAgICAgIHtlcnJvcn0g4oCUIGNoZWNrIHRoYXQgdGhlIEJhbGxpc3RpYyBBUEkgaXMgcnVubmluZyBhbmQgQ09SUyBpc1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyZWQuXG4gICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICB7IWxvYWRpbmcgJiYgIWVycm9yICYmIChcbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJzcGFjZS15LTZcIj5cbiAgICAgICAgICAgICAgICB7Q0FURUdPUllfR1JPVVBTLm1hcCgoZ3JvdXApID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2F0ZWdvcmllcyA9IENBVEVHT1JJRVMuZmlsdGVyKChjKSA9PlxuICAgICAgICAgICAgICAgICAgICBncm91cC5jYXRlZ29yeUlkcy5pbmNsdWRlcyhjLmlkIGFzIENhdGVnb3J5SWQpLFxuICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2F0ZWdvcmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYga2V5PXtncm91cC5pZH0gY2xhc3NOYW1lPVwic3BhY2UteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWJhc2VsaW5lIGp1c3RpZnktYmV0d2VlbiBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQtc20gZm9udC1zZW1pYm9sZCB0ZXh0LXppbmMtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge2dyb3VwLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb24gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgdGV4dC16aW5jLTUwMCBtdC0xIG1heC13LXhsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Z3JvdXAuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTQgbWQ6Z3JpZC1jb2xzLTIgbGc6Z3JpZC1jb2xzLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtncm91cENhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtjYXRlZ29yeS5pZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXIgYm9yZGVyLXppbmMtODAwIHJvdW5kZWQtbWQgcC0yIG1kOnAtMyBiZy16aW5jLTk1MC82MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q2F0ZWdvcnlDb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5PXtjYXRlZ29yeX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzPXtwYXJ0c0J5Q2F0ZWdvcnlbY2F0ZWdvcnkuaWRdfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0SWQ9e2J1aWxkW2NhdGVnb3J5LmlkXX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0UGFydD17KHBhcnRJZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlU2VsZWN0UGFydChjYXRlZ29yeS5pZCwgcGFydElkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICAgIHsvKiBCdWlsZCBTdW1tYXJ5ICovfVxuICAgICAgICAgIDxhc2lkZSBjbGFzc05hbWU9XCJyb3VuZGVkLWxnIGJvcmRlciBib3JkZXItemluYy04MDAgYmctemluYy05NTAvODAgcC0zIG1kOnAtNCBmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHRyYWNraW5nLVswLjE2ZW1dIHVwcGVyY2FzZSB0ZXh0LXppbmMtNDAwIG1iLTNcIj5cbiAgICAgICAgICAgICAgQ3VycmVudCBCdWlsZFxuICAgICAgICAgICAgPC9oMj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4LTEgb3ZlcmZsb3cteS1hdXRvIHByLTFcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkUGFydHMubGVuZ3RoID09PSAwICYmIChcbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXNtIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICAgIFNlbGVjdCBhIHBhcnQgZnJvbSBlYWNoIGNhdGVnb3J5IHRvIHN0YXJ0IHlvdXIgYnVpbGQuXG4gICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgIDx1bCBjbGFzc05hbWU9XCJzcGFjZS15LTJcIj5cbiAgICAgICAgICAgICAgICB7c3VtbWFyeUNhdGVnb3J5T3JkZXIubWFwKChjYXRlZ29yeUlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjYXQgPSBDQVRFR09SSUVTLmZpbmQoKGMpID0+IGMuaWQgPT09IGNhdGVnb3J5SWQpO1xuICAgICAgICAgICAgICAgICAgaWYgKCFjYXQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RlZFBhcnRJZCA9IGJ1aWxkW2NhdC5pZF07XG4gICAgICAgICAgICAgICAgICBjb25zdCBwYXJ0ID0gcGFydHMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgKHApID0+XG4gICAgICAgICAgICAgICAgICAgICAgcC5pZCA9PT0gc2VsZWN0ZWRQYXJ0SWQgJiYgcC5jYXRlZ29yeUlkID09PSBjYXQuaWQsXG4gICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICA8bGkga2V5PXtjYXQuaWR9PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC1bMC43cmVtXSB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC16aW5jLTUwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2NhdC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIHtwYXJ0ID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIGZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInRleHQtc20gdGV4dC16aW5jLTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3BhcnQuYnJhbmR9e1wiIFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGFydC5uYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIGZvbnQtc2VtaWJvbGQgdGV4dC1hbWJlci0zMDAgd2hpdGVzcGFjZS1ub3dyYXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3BhcnQucHJpY2UudG9GaXhlZCgyKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC0xIHRleHQteHMgdGV4dC16aW5jLTYwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICBOb3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBDVEEgKi99XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm10LTQgYm9yZGVyLXQgYm9yZGVyLXppbmMtODAwIHB0LTMgc3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgIDxMaW5rXG4gICAgICAgICAgICAgICAgaHJlZj1cIi9ndW5idWlsZGVyL2J1aWxkXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2BibG9jayB3LWZ1bGwgcm91bmRlZC1tZCBib3JkZXIgYm9yZGVyLWFtYmVyLTQwMC82MCBiZy1hbWJlci00MDAvMTAgcHgtMyBweS0yIHRleHQtc20gZm9udC1tZWRpdW0gdGV4dC1hbWJlci0yMDAgaG92ZXI6YmctYW1iZXItNDAwLzE1IHRleHQtY2VudGVyIHRyYW5zaXRpb24tY29sb3JzICR7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBhcnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICAgICA/IFwib3BhY2l0eS00MCBjdXJzb3Itbm90LWFsbG93ZWQgcG9pbnRlci1ldmVudHMtbm9uZVwiXG4gICAgICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQnVpbGQgU3VtbWFyeVxuICAgICAgICAgICAgICA8L0xpbms+XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZXRCdWlsZCh7fSk7XG4gICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShTVE9SQUdFX0tFWSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICBkaXNhYmxlZD17c2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDB9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgdy1mdWxsIHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci16aW5jLTcwMCBiZy16aW5jLTkwMC81MCBweC0zIHB5LTIgdGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LXppbmMtMzAwIGhvdmVyOmJnLXppbmMtODAwIGhvdmVyOmJvcmRlci16aW5jLTYwMCB0cmFuc2l0aW9uLWNvbG9ycyAke1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQYXJ0cy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBcIm9wYWNpdHktNDAgY3Vyc29yLW5vdC1hbGxvd2VkXCJcbiAgICAgICAgICAgICAgICAgICAgOiBcIlwiXG4gICAgICAgICAgICAgICAgfWB9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDbGVhciBCdWlsZFxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPHAgY2xhc3NOYW1lPVwibXQtMiB0ZXh0LVswLjdyZW1dIHRleHQtemluYy01MDBcIj5cbiAgICAgICAgICAgICAgICBWaWV3IHlvdXIgYnVpbGQgYnJlYWtkb3duIGFuZCBzaGFyZSBpdCB3aXRoIG90aGVycy5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9hc2lkZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgey8qIFdoYXQncyBOZXcgKi99XG4gICAgICAgIDxzZWN0aW9uIGNsYXNzTmFtZT1cIm10LTggcm91bmRlZC1sZyBib3JkZXIgYm9yZGVyLXppbmMtODAwIGJnLXppbmMtOTUwLzgwIHAtMyBtZDpwLTRcIj5cbiAgICAgICAgICA8aDIgY2xhc3NOYW1lPVwidGV4dC14cyBmb250LXNlbWlib2xkIHVwcGVyY2FzZSB0cmFja2luZy1bMC4xNmVtXSB0ZXh0LWFtYmVyLTMwMFwiPlxuICAgICAgICAgICAgV2hhdCZhcG9zO3MgTmV3IGluIEVhcmx5IEFjY2Vzc1xuICAgICAgICAgIDwvaDI+XG4gICAgICAgICAgPHVsIGNsYXNzTmFtZT1cIm10LTIgc3BhY2UteS0xIHRleHQtc20gdGV4dC16aW5jLTQwMFwiPlxuICAgICAgICAgICAgPGxpPuKAoiBMaXZlIHBhcnRzIGFuZCBwcmljaW5nIHB1bGxlZCBmcm9tIG11bHRpcGxlIG1lcmNoYW50cy48L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgR3JvdXBlZCBsYXlvdXQgZm9yIGxvd2VyIGFuZCB1cHBlciByZWNlaXZlciBwYXJ0cyBzbyB5b3UgY2FuIHNlZVxuICAgICAgICAgICAgICBhdCBhIGdsYW5jZSB3aGljaCBzZWN0aW9ucyBvZiB5b3VyIGJ1aWxkIGFyZSBzdGlsbCBtaXNzaW5nLlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAg4oCiIFJ1bm5pbmcgYnVpbGQgdG90YWwgdGhhdCB1cGRhdGVzIGF1dG9tYXRpY2FsbHkgYXMgeW91IGFkZCBvclxuICAgICAgICAgICAgICBzd2FwIGNvbXBvbmVudHMuXG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPGxpPlxuICAgICAgICAgICAgICDigKIgTG9jYWwgYnVpbGQgcGVyc2lzdGVuY2Ugc28geW91ciBzZWxlY3Rpb25zIHN0aWNrIGFyb3VuZCBiZXR3ZWVuXG4gICAgICAgICAgICAgIHZpc2l0cyBvbiB0aGlzIGRldmljZS5cbiAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuXG4gICAgICAgIHsvKiBSb2FkbWFwICovfVxuICAgICAgICA8c2VjdGlvbiBjbGFzc05hbWU9XCJtdC04IHJvdW5kZWQtbGcgYm9yZGVyIGJvcmRlci16aW5jLTgwMCBiZy16aW5jLTk1MC84MCBwLTMgbWQ6cC00XCI+XG4gICAgICAgICAgPGgyIGNsYXNzTmFtZT1cInRleHQteHMgZm9udC1zZW1pYm9sZCB1cHBlcmNhc2UgdHJhY2tpbmctWzAuMTZlbV0gdGV4dC1hbWJlci0zMDBcIj5cbiAgICAgICAgICAgIFdoYXQmYXBvcztzIG9uIG91ciByb2FkbWFwXG4gICAgICAgICAgPC9oMj5cbiAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXQtMiBzcGFjZS15LTEgdGV4dC1zbSB0ZXh0LXppbmMtNDAwXCI+XG4gICAgICAgICAgICA8bGk+4oCiIFBsYXRmb3JtIGZpbHRlcnMgKEFSLTE1LCBBUi05LCBBUi0xMCk8L2xpPlxuICAgICAgICAgICAgPGxpPuKAoiBNb3JlIHBhcnQgY2F0ZWdvcmllcyBhbmQgZnVybml0dXJlPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgUmljaGVyIHByaWNpbmcvc3RvY2sgc3luYzwvbGk+XG4gICAgICAgICAgICA8bGk+4oCiIFNtYXJ0ZXIgY29tcGF0aWJpbGl0eSBjaGVja3MgYmV0d2VlbiBjb21wb25lbnRzPC9saT5cbiAgICAgICAgICAgIDxsaT7igKIgQVI5L0FSMTAgc3VwcG9ydCBhbmQgbW9yZTwvbGk+XG4gICAgICAgICAgPC91bD5cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9tYWluPlxuICApO1xufSJdLCJuYW1lcyI6WyJ1c2VNZW1vIiwidXNlU3RhdGUiLCJ1c2VFZmZlY3QiLCJMaW5rIiwidXNlU2VhcmNoUGFyYW1zIiwidXNlUm91dGVyIiwiQ0FURUdPUklFUyIsIkNhdGVnb3J5Q29sdW1uIiwicHJvY2VzcyIsIkFQSV9CQVNFX1VSTCIsImVudiIsIk5FWFRfUFVCTElDX0FQSV9CQVNFX1VSTCIsIlBBUlRfUk9MRV9UT19DQVRFR09SWSIsImJhcnJlbCIsImhhbmRndWFyZCIsInNpZ2h0Iiwib3B0aWMiLCJzdG9jayIsInRyaWdnZXIiLCJncmlwIiwic2FmZXR5IiwiYmNnIiwiY29tcGVuc2F0b3IiLCJicmFrZSIsInN1cHByZXNzb3IiLCJTVE9SQUdFX0tFWSIsIkNBVEVHT1JZX0dST1VQUyIsImlkIiwibGFiZWwiLCJkZXNjcmlwdGlvbiIsImNhdGVnb3J5SWRzIiwiR3VuYnVpbGRlclBhZ2UiLCJzZWFyY2hQYXJhbXMiLCJyb3V0ZXIiLCJwYXJ0cyIsInNldFBhcnRzIiwibG9hZGluZyIsInNldExvYWRpbmciLCJlcnJvciIsInNldEVycm9yIiwiYnVpbGQiLCJzZXRCdWlsZCIsInN0b3JlZCIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJKU09OIiwicGFyc2UiLCJjb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwiZmV0Y2hQcm9kdWN0cyIsInJlcyIsImZldGNoIiwic2lnbmFsIiwib2siLCJFcnJvciIsInN0YXR1cyIsImRhdGEiLCJqc29uIiwibm9ybWFsaXplZCIsIm1hcCIsInAiLCJjYXRlZ29yeUlkIiwicGFydFJvbGUiLCJTdHJpbmciLCJuYW1lIiwiYnJhbmQiLCJwcmljZSIsImltYWdlVXJsIiwibWFpbkltYWdlVXJsIiwidW5kZWZpbmVkIiwidXJsIiwiYnV5VXJsIiwibm90ZXMiLCJmaWx0ZXIiLCJlcnIiLCJtZXNzYWdlIiwiYWJvcnQiLCJzZWxlY3RQYXJhbSIsImdldCIsInBhcnRJZCIsInNwbGl0Iiwic29tZSIsImMiLCJwcmV2IiwidXBkYXRlZCIsInNldEl0ZW0iLCJzdHJpbmdpZnkiLCJyZXBsYWNlIiwic2Nyb2xsIiwicGFydHNCeUNhdGVnb3J5IiwiZ3JvdXBlZCIsImNhdGVnb3J5Iiwic2VsZWN0ZWRQYXJ0cyIsIk9iamVjdCIsImVudHJpZXMiLCJmaW5kIiwiQm9vbGVhbiIsInRvdGFsUHJpY2UiLCJyZWR1Y2UiLCJzdW0iLCJoYW5kbGVTZWxlY3RQYXJ0Iiwic3VtbWFyeUNhdGVnb3J5T3JkZXIiLCJmbGF0TWFwIiwiZ3JvdXAiLCJtYWluIiwiY2xhc3NOYW1lIiwiZGl2Iiwic3BhbiIsImhlYWRlciIsImgxIiwidG9GaXhlZCIsImxlbmd0aCIsInNlY3Rpb24iLCJncm91cENhdGVnb3JpZXMiLCJpbmNsdWRlcyIsImgyIiwic2VsZWN0ZWRQYXJ0SWQiLCJvblNlbGVjdFBhcnQiLCJhc2lkZSIsInVsIiwiY2F0IiwicGFydCIsImxpIiwiaHJlZiIsImJ1dHRvbiIsInR5cGUiLCJvbkNsaWNrIiwicmVtb3ZlSXRlbSIsImRpc2FibGVkIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///(app-pages-browser)/./app/gunbuilder/page.tsx\n"));
|
|
|
|
/***/ })
|
|
|
|
}); |