Full Code of iib0011/omni-tools for AI

main d318dd3f26d9 cached
723 files
2.4 MB
675.9k tokens
827 symbols
1 requests
Download .txt
Showing preview only (2,681K chars total). Download the full file or copy to clipboard to get everything.
Repository: iib0011/omni-tools
Branch: main
Commit: d318dd3f26d9
Files: 723
Total size: 2.4 MB

Directory structure:
gitextract_qdwcsdfo/

├── .dockerignore
├── .editorconfig
├── .eslintrc
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .husky/
│   └── pre-commit
├── .idea/
│   ├── codeStyles/
│   │   ├── Project.xml
│   │   └── codeStyleConfig.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── modules.xml
│   ├── omni-tools.iml
│   ├── prettier.xml
│   ├── shelf/
│   │   ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/
│   │   │   └── shelved.patch
│   │   ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]1/
│   │   │   └── shelved.patch
│   │   └── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM__Changes_.xml
│   ├── vcs.xml
│   └── workspace.xml
├── .prettierrc
├── .vitest/
│   └── setup.ts
├── .vscode/
│   └── settings.json
├── @types/
│   ├── i18n.d.ts
│   └── theme.d.ts
├── CODEOWNERS
├── Dockerfile
├── LICENSE
├── README.md
├── commitlint.config.js
├── index.html
├── package.json
├── playwright.config.ts
├── postcss.config.mjs
├── public/
│   ├── _redirects
│   ├── assets/
│   │   └── fonts/
│   │       └── quicksand/
│   │           └── quick-sand.css
│   ├── gs.js
│   ├── locales/
│   │   ├── de/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── en/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── es/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── fr/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── hi/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── ja/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── nl/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── pt/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── ru/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   └── zh/
│   │       ├── audio.json
│   │       ├── converters.json
│   │       ├── csv.json
│   │       ├── image.json
│   │       ├── json.json
│   │       ├── list.json
│   │       ├── number.json
│   │       ├── pdf.json
│   │       ├── string.json
│   │       ├── time.json
│   │       ├── translation.json
│   │       ├── video.json
│   │       └── xml.json
│   ├── robots.txt
│   └── site.webmanifest
├── scripts/
│   ├── add-i18n-to-meta.js
│   ├── cleanup-empty-directories.js
│   ├── create-tool.mjs
│   ├── locize-upload.js
│   └── update-i18n-from-meta.js
├── src/
│   ├── @types/
│   │   └── i18n.d.ts
│   ├── components/
│   │   ├── App.tsx
│   │   ├── BackButton.tsx
│   │   ├── Hero.tsx
│   │   ├── InputHeader.tsx
│   │   ├── Loading.css
│   │   ├── Loading.tsx
│   │   ├── Navbar/
│   │   │   └── index.tsx
│   │   ├── ScrollToTopButton.tsx
│   │   ├── Separator.tsx
│   │   ├── ToolBreadcrumb.tsx
│   │   ├── ToolContent.tsx
│   │   ├── ToolHeader.tsx
│   │   ├── ToolInfo.tsx
│   │   ├── ToolInputAndResult.tsx
│   │   ├── ToolLayout.tsx
│   │   ├── UserTypeFilter.tsx
│   │   ├── allTools/
│   │   │   ├── AllTools.tsx
│   │   │   └── ToolCard.tsx
│   │   ├── examples/
│   │   │   ├── ExampleCard.tsx
│   │   │   ├── ExampleOptions.tsx
│   │   │   └── ToolExamples.tsx
│   │   ├── index.css
│   │   ├── input/
│   │   │   ├── BaseFileInput.tsx
│   │   │   ├── InputFooter.tsx
│   │   │   ├── NumericInputWithUnit.tsx
│   │   │   ├── ToolAudioInput.tsx
│   │   │   ├── ToolCodeInput.tsx
│   │   │   ├── ToolImageInput.tsx
│   │   │   ├── ToolMultipleAudioInput.tsx
│   │   │   ├── ToolMultipleImageInput.tsx
│   │   │   ├── ToolMultiplePdfInput.tsx
│   │   │   ├── ToolMultipleVideoInput.tsx
│   │   │   ├── ToolPdfInput.tsx
│   │   │   ├── ToolTextInput.tsx
│   │   │   ├── ToolVideoInput.tsx
│   │   │   └── file-input-utils.ts
│   │   ├── options/
│   │   │   ├── CheckboxWithDesc.tsx
│   │   │   ├── ColorSelector.tsx
│   │   │   ├── RadioWithTextField.tsx
│   │   │   ├── SelectWithDesc.tsx
│   │   │   ├── SimpleRadio.tsx
│   │   │   ├── TextFieldWithDesc.tsx
│   │   │   ├── ToolOptionGroups.tsx
│   │   │   └── ToolOptions.tsx
│   │   └── result/
│   │       ├── ResultFooter.tsx
│   │       ├── ToolFileResult.tsx
│   │       ├── ToolMultiFileResult.tsx
│   │       └── ToolTextResult.tsx
│   ├── config/
│   │   ├── muiConfig.ts
│   │   ├── routesConfig.tsx
│   │   └── uiConfig.ts
│   ├── contexts/
│   │   └── CustomSnackBarContext.tsx
│   ├── datatables/
│   │   ├── data/
│   │   │   ├── material_electrical_properties.ts
│   │   │   └── wire_gauge.ts
│   │   ├── index.ts
│   │   └── types.ts
│   ├── hooks/
│   │   ├── index.ts
│   │   ├── useDebounce.ts
│   │   ├── usePrevious.ts
│   │   ├── useTimeout.ts
│   │   └── useUpdateEffect.ts
│   ├── i18n/
│   │   └── index.ts
│   ├── index.tsx
│   ├── lib/
│   │   └── ghostscript/
│   │       ├── background-worker.js
│   │       ├── gs-worker.js
│   │       └── worker-init.ts
│   ├── pages/
│   │   ├── home/
│   │   │   ├── Categories.tsx
│   │   │   └── index.tsx
│   │   ├── tools/
│   │   │   ├── audio/
│   │   │   │   ├── change-speed/
│   │   │   │   │   ├── change-speed.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── extract-audio/
│   │   │   │   │   ├── extract-audio.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── merge-audio/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── merge-audio.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── trim/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       ├── trim.service.test.ts
│   │   │   │       └── types.ts
│   │   │   ├── converters/
│   │   │   │   ├── audio-converter/
│   │   │   │   │   ├── audio-converter.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── index.ts
│   │   │   ├── csv/
│   │   │   │   ├── change-csv-separator/
│   │   │   │   │   ├── change-csv-separator.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── csv-rows-to-columns/
│   │   │   │   │   ├── csv-rows-to-columns.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-json/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-tsv/
│   │   │   │   │   ├── csv-to-tsv.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-xml/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-yaml/
│   │   │   │   │   ├── csv-to-yaml.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── find-incomplete-csv-records/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── insert-csv-columns/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── insert-csv-columns.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── swap-csv-columns/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── swap-csv-columns.service.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── transpose-csv/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── transpose-csv.service.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── tsv-to-json/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── types.ts
│   │   │   ├── image/
│   │   │   │   ├── generic/
│   │   │   │   │   ├── change-colors/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── service.ts
│   │   │   │   │   ├── change-opacity/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── service.ts
│   │   │   │   │   ├── compress/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── convert-to-jpg/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── create-transparent/
│   │   │   │   │   │   ├── create-transparent.e2e.spec.ts
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── crop/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── editor/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── image-to-text/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── qr-code/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── remove-background/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── resize/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   └── rotate/
│   │   │   │   │       ├── index.tsx
│   │   │   │   │       ├── meta.ts
│   │   │   │   │       ├── service.ts
│   │   │   │   │       └── type.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── png/
│   │   │   │       ├── compress-png/
│   │   │   │       │   ├── index.tsx
│   │   │   │       │   ├── meta.ts
│   │   │   │       │   └── service.ts
│   │   │   │       ├── convert-jgp-to-png/
│   │   │   │       │   ├── convert-jgp-to-png.e2e.spec.ts
│   │   │   │       │   ├── index.tsx
│   │   │   │       │   └── meta.ts
│   │   │   │       └── index.ts
│   │   │   ├── json/
│   │   │   │   ├── escape-json/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── json-comparison/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── json-to-csv/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── json-to-xml/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── minify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── prettify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── stringify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── validateJson/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       └── service.ts
│   │   │   ├── list/
│   │   │   │   ├── duplicate/
│   │   │   │   │   ├── duplicate.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── find-most-popular/
│   │   │   │   │   ├── find-most-popular.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── find-unique/
│   │   │   │   │   ├── find-unique.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── group/
│   │   │   │   │   ├── group.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── reverse.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── shuffle/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── shuffle.service.test.ts
│   │   │   │   ├── sort/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── sort.service.test.ts
│   │   │   │   ├── truncate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── truncate.service.test.ts
│   │   │   │   ├── unwrap/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── unwrap.service.test.ts
│   │   │   │   └── wrap/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── wrap.service.test.ts
│   │   │   ├── number/
│   │   │   │   ├── arithmetic-sequence/
│   │   │   │   │   ├── arithmetic-sequence.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── byte-converter/
│   │   │   │   │   ├── byte-converter.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── generate/
│   │   │   │   │   ├── generate.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── generic-calc/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── ohmsLaw.ts
│   │   │   │   │   │   ├── slackline.ts
│   │   │   │   │   │   ├── sphereArea.ts
│   │   │   │   │   │   ├── sphereVolume.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── voltageDropInWire.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── random-number-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── random-number-generator.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── random-port-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── random-port-generator.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── sum/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── sum.service.test.ts
│   │   │   ├── pdf/
│   │   │   │   ├── compress-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── convert-to-pdf/
│   │   │   │   │   ├── convert-to-pdf.service.test.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── editor/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── meta.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── merge-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── pdf-to-epub/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── pdf-to-png/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── protect-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── rotate-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate-pdf.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── split-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── utils.ts
│   │   │   ├── string/
│   │   │   │   ├── base64/
│   │   │   │   │   ├── base64.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── censor/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── create-palindrome/
│   │   │   │   │   ├── create-palindrome.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── extract-substring/
│   │   │   │   │   ├── extract-substring.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── hidden-character-detector/
│   │   │   │   │   ├── hidden-character-detector.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── join/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── string-join.e2e.spec.ts
│   │   │   │   │   └── string-join.service.test.ts
│   │   │   │   ├── palindrome/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── palindrome.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── password-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── password-generator.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── quote/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── quote.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── randomize-case/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── randomize-case.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── remove-duplicate-lines/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── remove-duplicate-lines.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── repeat/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── repeatText.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── reverse.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rot13/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rot13.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── split/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── string-split.service.test.ts
│   │   │   │   ├── statistic/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── text-replacer/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── replaceText.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── to-morse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── to-morse.service.test.ts
│   │   │   │   ├── truncate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── truncateText.service.test.ts
│   │   │   │   ├── unicode/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── unicode.service.test.ts
│   │   │   │   ├── uppercase/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── uppercase.service.test.ts
│   │   │   │   ├── url-decode/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── url-encode/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── types.ts
│   │   │   ├── time/
│   │   │   │   ├── check-leap-years/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-days-to-hours/
│   │   │   │   │   ├── convert-days-to-hours.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-hours-to-days/
│   │   │   │   │   ├── convert-hours-to-days.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-seconds-to-time/
│   │   │   │   │   ├── convert-seconds-to-time.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-time-to-decimal/
│   │   │   │   │   ├── convert-time-to-decimal.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── convert-time-to-seconds/
│   │   │   │   │   ├── convert-time-to-seconds.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-unix-to-date/
│   │   │   │   │   ├── convert-unix-to-date.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── crontab-guru/
│   │   │   │   │   ├── crontab-guru.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── discord-timestamp/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── time-between-dates/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── time-between-dates.service.test.ts
│   │   │   │   └── truncate-clock-time/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── truncate-clock-time.service.test.ts
│   │   │   ├── video/
│   │   │   │   ├── change-speed/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── compress/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── crop-video/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── flip/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── gif/
│   │   │   │   │   ├── change-speed/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── loop/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── merge-video/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── merge-video.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── trim/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── meta.ts
│   │   │   │   └── video-to-gif/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       └── types.ts
│   │   │   └── xml/
│   │   │       ├── index.ts
│   │   │       ├── xml-beautifier/
│   │   │       │   ├── index.tsx
│   │   │       │   ├── meta.ts
│   │   │       │   ├── service.ts
│   │   │       │   ├── types.ts
│   │   │       │   └── xml-beautifier.service.test.ts
│   │   │       └── xml-validator/
│   │   │           ├── index.tsx
│   │   │           ├── meta.ts
│   │   │           ├── service.ts
│   │   │           ├── types.ts
│   │   │           └── xml-validator.service.test.ts
│   │   └── tools-by-category/
│   │       └── index.tsx
│   ├── providers/
│   │   └── UserTypeFilterProvider.tsx
│   ├── tools/
│   │   ├── defineTool.tsx
│   │   ├── index.test.ts
│   │   └── index.ts
│   └── utils/
│       ├── array.ts
│       ├── bookmark.ts
│       ├── color.ts
│       ├── csv.ts
│       ├── file.ts
│       ├── gif.ts
│       ├── index.ts
│       ├── json.ts
│       ├── number.ts
│       ├── string.ts
│       └── time.ts
├── tailwind.config.mjs
├── tsconfig.json
└── vite.config.ts

================================================
FILE CONTENTS
================================================

================================================
FILE: .dockerignore
================================================
node_modules
playwright-report
coverage
dist
test-results


================================================
FILE: .editorconfig
================================================
root = true

[*]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true


================================================
FILE: .eslintrc
================================================
{
  "env": {
    "browser": true,
    "es2020": true,
    "jest": true,
    "node": true
  },
  "settings": {
    "react": {
      "version": "detect"
    }
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/eslint-recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:prettier/recommended",
    "plugin:tailwindcss/recommended"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": 11,
    "sourceType": "module"
  },
  "plugins": [
    "react",
    "react-hooks",
    "@typescript-eslint",
    "tailwindcss"
  ],
  "rules": {
    "react-hooks/rules-of-hooks": "error",
    "react-hooks/exhaustive-deps": "warn",
    "react/prop-types": "off",
    "react/react-in-jsx-scope": "off",
    "@typescript-eslint/explicit-module-boundary-types": "off",
    "@typescript-eslint/no-non-null-assertion": "off",
    "tailwindcss/classnames-order": "warn",
    "tailwindcss/no-custom-classname": "warn",
    "tailwindcss/no-contradicting-classname": "error",
    "@typescript-eslint/ban-types": "off",
    "@typescript-eslint/ban-ts-comment": "off",
    "@typescript-eslint/no-explicit-any": "off"
  }
}


================================================
FILE: .github/FUNDING.yml
================================================
github: [iib0011]
buy_me_a_coffee: iib0011

================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on:
  push:
    branches:
      - main
    tags:
      - 'v*'
  pull_request:
    branches:
      - main
jobs:
  test-and-build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'
      - name: Install dependencies
        run: npm install
      - name: Run tests
        run: npm run test
      - name: Build project
        run: npm run build
  e2e-test:
    name: 'Playwright Tests'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
      - name: Install dependencies
        run: npm ci
      - name: Install Playwright Browsers
        run: npx playwright install --with-deps
      - name: Run Playwright tests
        run: npx playwright test
      - uses: actions/upload-artifact@v4
        if: ${{ !cancelled() }}
        with:
          name: playwright-report
          path: playwright-report/
          retention-days: 30
  build-and-push-docker:
    name: Build and Push Multi-Platform Docker Image
    runs-on: ubuntu-latest
    needs:
      - test-and-build
      - e2e-test
    if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2
        with:
          platforms: 'arm64,amd64'
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2
      - name: Login to DockerHub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - name: Extract metadata for Docker
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: iib0011/omni-tools
          tags: |
            type=raw,value=latest,enable=${{ github.ref == 'refs/heads/main' }}
            type=semver,pattern={{version}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
            type=semver,pattern={{major}}.{{minor}},enable=${{ startsWith(github.ref, 'refs/tags/v') }}
      - name: Build and push Docker image
        uses: docker/build-push-action@v4
        with:
          context: .
          platforms: linux/amd64,linux/arm64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
  deploy:
    if: github.ref == 'refs/heads/main'
    needs:
      - test-and-build
      - e2e-test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: '20'
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: npm run build
      - name: Deploy to Netlify
        uses: nwtgck/actions-netlify@v1.2
        with:
          publish-dir: ./dist
          production-branch: main
          deploy-message: ${{ github.event.head_commit.message }}
          enable-pull-request-comment: true
          enable-commit-comment: true
          overwrites-pull-request-comment: true
        env:
          NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }}
          NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
        timeout-minutes: 20


================================================
FILE: .gitignore
================================================
dist
dist-ssr
*.local

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*

# local env files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local

# vercel
.vercel

/test-results
/playwright-report

dist.zip
.aider*
.qodo

error.txt


================================================
FILE: .husky/pre-commit
================================================
npx lint-staged

================================================
FILE: .idea/codeStyles/Project.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <code_scheme name="Project" version="173">
    <HTMLCodeStyleSettings>
      <option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
    </HTMLCodeStyleSettings>
    <JSCodeStyleSettings version="0">
      <option name="FORCE_SEMICOLON_STYLE" value="true" />
      <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
      <option name="USE_DOUBLE_QUOTES" value="false" />
      <option name="FORCE_QUOTE_STYlE" value="true" />
      <option name="ENFORCE_TRAILING_COMMA" value="Remove" />
      <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
      <option name="SPACES_WITHIN_IMPORTS" value="true" />
    </JSCodeStyleSettings>
    <TypeScriptCodeStyleSettings version="0">
      <option name="FORCE_SEMICOLON_STYLE" value="true" />
      <option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
      <option name="USE_DOUBLE_QUOTES" value="false" />
      <option name="FORCE_QUOTE_STYlE" value="true" />
      <option name="ENFORCE_TRAILING_COMMA" value="Remove" />
      <option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
      <option name="SPACES_WITHIN_IMPORTS" value="true" />
    </TypeScriptCodeStyleSettings>
    <VueCodeStyleSettings>
      <option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
      <option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
    </VueCodeStyleSettings>
    <codeStyleSettings language="HTML">
      <option name="SOFT_MARGINS" value="80" />
      <indentOptions>
        <option name="INDENT_SIZE" value="2" />
        <option name="CONTINUATION_INDENT_SIZE" value="2" />
        <option name="TAB_SIZE" value="2" />
      </indentOptions>
    </codeStyleSettings>
    <codeStyleSettings language="JavaScript">
      <option name="SOFT_MARGINS" value="80" />
      <indentOptions>
        <option name="INDENT_SIZE" value="2" />
        <option name="CONTINUATION_INDENT_SIZE" value="2" />
        <option name="TAB_SIZE" value="2" />
      </indentOptions>
    </codeStyleSettings>
    <codeStyleSettings language="TypeScript">
      <option name="SOFT_MARGINS" value="80" />
      <indentOptions>
        <option name="INDENT_SIZE" value="2" />
        <option name="CONTINUATION_INDENT_SIZE" value="2" />
        <option name="TAB_SIZE" value="2" />
      </indentOptions>
    </codeStyleSettings>
    <codeStyleSettings language="Vue">
      <option name="SOFT_MARGINS" value="80" />
      <indentOptions>
        <option name="CONTINUATION_INDENT_SIZE" value="2" />
      </indentOptions>
    </codeStyleSettings>
  </code_scheme>
</component>

================================================
FILE: .idea/codeStyles/codeStyleConfig.xml
================================================
<component name="ProjectCodeStyleConfiguration">
  <state>
    <option name="USE_PER_PROJECT_SETTINGS" value="true" />
  </state>
</component>

================================================
FILE: .idea/inspectionProfiles/Project_Default.xml
================================================
<component name="InspectionProjectProfileManager">
  <profile version="1.0">
    <option name="myName" value="Project Default" />
    <inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
    <inspection_tool class="ImplicitTypeConversion" enabled="true" level="WARNING" enabled_by_default="true">
      <option name="BITS" value="1720" />
      <option name="FLAG_EXPLICIT_CONVERSION" value="true" />
      <option name="IGNORE_NODESET_TO_BOOLEAN_VIA_STRING" value="true" />
    </inspection_tool>
  </profile>
</component>

================================================
FILE: .idea/modules.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ProjectModuleManager">
    <modules>
      <module fileurl="file://$PROJECT_DIR$/.idea/omni-tools.iml" filepath="$PROJECT_DIR$/.idea/omni-tools.iml" />
    </modules>
  </component>
</project>

================================================
FILE: .idea/omni-tools.iml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
  <component name="NewModuleRootManager" inherit-compiler-output="true">
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <excludeFolder url="file://$MODULE_DIR$/dist" />
      <excludeFolder url="file://$MODULE_DIR$/test-results" />
    </content>
    <orderEntry type="inheritedJdk" />
    <orderEntry type="sourceFolder" forTests="false" />
  </component>
</module>

================================================
FILE: .idea/prettier.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="PrettierConfiguration">
    <option name="myConfigurationMode" value="AUTOMATIC" />
    <option name="myRunOnSave" value="true" />
  </component>
</project>

================================================
FILE: .idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/shelved.patch
================================================
Index: .idea/workspace.xml
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP
<+><?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<project version=\"4\">\r\n  <component name=\"AutoImportSettings\">\r\n    <option name=\"autoReloadType\" value=\"SELECTIVE\" />\r\n  </component>\r\n  <component name=\"ChangeListManager\">\r\n    <list default=\"true\" id=\"b30e2810-c4c1-4aad-b134-794e52cc1c7d\" name=\"Changes\" comment=\"refact: examples\">\r\n      <change beforePath=\"$PROJECT_DIR$/.idea/workspace.xml\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/.idea/workspace.xml\" afterDir=\"false\" />\r\n      <change beforePath=\"$PROJECT_DIR$/src/components/ToolHeader.tsx\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/components/ToolHeader.tsx\" afterDir=\"false\" />\r\n      <change beforePath=\"$PROJECT_DIR$/src/components/examples/Examples.tsx\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/components/examples/ToolExamples.tsx\" afterDir=\"false\" />\r\n      <change beforePath=\"$PROJECT_DIR$/src/pages/tools/string/join/index.tsx\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/pages/tools/string/join/index.tsx\" afterDir=\"false\" />\r\n      <change beforePath=\"$PROJECT_DIR$/src/pages/tools/string/split/index.tsx\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/pages/tools/string/split/index.tsx\" afterDir=\"false\" />\r\n      <change beforePath=\"$PROJECT_DIR$/src/tools/defineTool.tsx\" beforeDir=\"false\" afterPath=\"$PROJECT_DIR$/src/tools/defineTool.tsx\" afterDir=\"false\" />\r\n    </list>\r\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\r\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\r\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\r\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\r\n  </component>\r\n  <component name=\"FormatOnSaveOptions\">\r\n    <option name=\"myRunOnSave\" value=\"true\" />\r\n  </component>\r\n  <component name=\"Git.Merge.Settings\">\r\n    <option name=\"BRANCH\" value=\"origin/main\" />\r\n  </component>\r\n  <component name=\"Git.Settings\">\r\n    <option name=\"RECENT_BRANCH_BY_REPOSITORY\">\r\n      <map>\r\n        <entry key=\"$PROJECT_DIR$\" value=\"main\" />\r\n      </map>\r\n    </option>\r\n    <option name=\"RECENT_GIT_ROOT_PATH\" value=\"$PROJECT_DIR$\" />\r\n    <option name=\"RESET_MODE\" value=\"HARD\" />\r\n  </component>\r\n  <component name=\"GitHubPullRequestSearchHistory\">{\r\n  &quot;lastFilter&quot;: {\r\n    &quot;state&quot;: &quot;OPEN&quot;,\r\n    &quot;assignee&quot;: &quot;iib0011&quot;\r\n  }\r\n}</component>\r\n  <component name=\"GithubPullRequestsUISettings\">{\r\n  &quot;selectedUrlAndAccountId&quot;: {\r\n    &quot;url&quot;: &quot;https://github.com/iib0011/omni-tools.git&quot;,\r\n    &quot;accountId&quot;: &quot;45f8cd51-000f-4ba4-a4c6-c4d96ac9b1e5&quot;\r\n  }\r\n}</component>\r\n  <component name=\"KubernetesApiProvider\">{\r\n  &quot;isMigrated&quot;: true\r\n}</component>\r\n  <component name=\"MarkdownSettingsMigration\">\r\n    <option name=\"stateVersion\" value=\"1\" />\r\n  </component>\r\n  <component name=\"ProjectColorInfo\">{\r\n  &quot;associatedIndex&quot;: 0\r\n}</component>\r\n  <component name=\"ProjectId\" id=\"2i6g3WkUxdCURKYvUIJ9LMY5Qsc\" />\r\n  <component name=\"ProjectLevelVcsManager\" settingsEditedManually=\"true\">\r\n    <ConfirmationsSetting value=\"2\" id=\"Add\" />\r\n  </component>\r\n  <component name=\"ProjectViewState\">\r\n    <option name=\"autoscrollFromSource\" value=\"true\" />\r\n    <option name=\"hideEmptyMiddlePackages\" value=\"true\" />\r\n    <option name=\"showLibraryContents\" value=\"true\" />\r\n  </component>\r\n  <component name=\"PropertiesComponent\"><![CDATA[{\r\n  \"keyToString\": {\r\n    \"ASKED_ADD_EXTERNAL_FILES\": \"true\",\r\n    \"ASKED_SHARE_PROJECT_CONFIGURATION_FILES\": \"true\",\r\n    \"Docker.Dockerfile build.executor\": \"Run\",\r\n    \"Docker.Dockerfile.executor\": \"Run\",\r\n    \"Playwright.JoinText Component.executor\": \"Run\",\r\n    \"Playwright.JoinText Component.should merge text pieces with specified join character.executor\": \"Run\",\r\n    \"RunOnceActivity.OpenProjectViewOnStart\": \"true\",\r\n    \"RunOnceActivity.ShowReadmeOnStart\": \"true\",\r\n    \"RunOnceActivity.git.unshallow\": \"true\",\r\n    \"Vitest.compute function (1).executor\": \"Run\",\r\n    \"Vitest.compute function.executor\": \"Run\",\r\n    \"Vitest.mergeText.executor\": \"Run\",\r\n    \"Vitest.mergeText.should merge lines and preserve blank lines when deleteBlankLines is false.executor\": \"Run\",\r\n    \"Vitest.mergeText.should merge lines, preserve blank lines and trailing spaces when both deleteBlankLines and deleteTrailingSpaces are false.executor\": \"Run\",\r\n    \"git-widget-placeholder\": \"examples\",\r\n    \"ignore.virus.scanning.warn.message\": \"true\",\r\n    \"kotlin-language-version-configured\": \"true\",\r\n    \"last_opened_file_path\": \"C:/Users/Ibrahima/IdeaProjects/omni-tools/src/assets\",\r\n    \"node.js.detected.package.eslint\": \"true\",\r\n    \"node.js.detected.package.tslint\": \"true\",\r\n    \"node.js.selected.package.eslint\": \"(autodetect)\",\r\n    \"node.js.selected.package.tslint\": \"(autodetect)\",\r\n    \"nodejs_package_manager_path\": \"npm\",\r\n    \"npm.dev.executor\": \"Run\",\r\n    \"npm.lint.executor\": \"Run\",\r\n    \"npm.prebuild.executor\": \"Run\",\r\n    \"npm.script:create:tool.executor\": \"Run\",\r\n    \"npm.test.executor\": \"Run\",\r\n    \"npm.test:e2e.executor\": \"Run\",\r\n    \"npm.test:e2e:run.executor\": \"Run\",\r\n    \"prettierjs.PrettierConfiguration.Package\": \"C:\\\\Users\\\\Ibrahima\\\\IdeaProjects\\\\omni-tools\\\\node_modules\\\\prettier\",\r\n    \"project.structure.last.edited\": \"Problems\",\r\n    \"project.structure.proportion\": \"0.0\",\r\n    \"project.structure.side.proportion\": \"0.2\",\r\n    \"settings.editor.selected.configurable\": \"settings.typescriptcompiler\",\r\n    \"ts.external.directory.path\": \"C:\\\\Users\\\\Ibrahima\\\\IdeaProjects\\\\omni-tools\\\\node_modules\\\\typescript\\\\lib\",\r\n    \"vue.rearranger.settings.migration\": \"true\"\r\n  }\r\n}]]></component>\r\n  <component name=\"ReactDesignerToolWindowState\">\r\n    <option name=\"myId2Visible\">\r\n      <map>\r\n        <entry key=\"com.intellij.reactbuddy.reactComponents\" value=\"false\" />\r\n        <entry key=\"com.intellij.reactbuddy.reactInspector\" value=\"false\" />\r\n        <entry key=\"com.intellij.reactbuddy.storybook\" value=\"false\" />\r\n      </map>\r\n    </option>\r\n  </component>\r\n  <component name=\"RecentsManager\">\r\n    <key name=\"CopyFile.RECENT_KEYS\">\r\n      <recent name=\"C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\src\\assets\" />\r\n      <recent name=\"C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\.github\" />\r\n      <recent name=\"C:\\Users\\HP\\IdeaProjects\\omni-tools\\src\\components\\options\" />\r\n      <recent name=\"C:\\Users\\HP\\IdeaProjects\\omni-tools\\src\\assets\" />\r\n      <recent name=\"C:\\Users\\HP\\IdeaProjects\\omni-tools\\src\\pages\\string\" />\r\n    </key>\r\n    <key name=\"MoveFile.RECENT_KEYS\">\r\n      <recent name=\"C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\public\\assets\" />\r\n      <recent name=\"C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\src\\pages\\tools\" />\r\n      <recent name=\"C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\src\\pages\\categories\" />\r\n      <recent name=\"C:\\Users\\HP\\IdeaProjects\\omni-tools\\src\\components\" />\r\n      <recent name=\"C:\\Users\\HP\\IdeaProjects\\omni-tools\\src\\components\\options\" />\r\n    </key>\r\n  </component>\r\n  <component name=\"RunManager\" selected=\"npm.dev\">\r\n    <configuration name=\"Dockerfile build\" type=\"docker-deploy\" factoryName=\"dockerfile\" temporary=\"true\" server-name=\"Docker\">\r\n      <deployment type=\"dockerfile\">\r\n        <settings>\r\n          <option name=\"imageTag\" value=\"omnitools\" />\r\n          <option name=\"buildCliOptions\" value=\"--target build\" />\r\n          <option name=\"containerName\" value=\"omni-tools\" />\r\n          <option name=\"publishAllPorts\" value=\"true\" />\r\n          <option name=\"sourceFilePath\" value=\"Dockerfile\" />\r\n        </settings>\r\n      </deployment>\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <configuration name=\"Dockerfile\" type=\"docker-deploy\" factoryName=\"dockerfile\" temporary=\"true\" server-name=\"Docker\">\r\n      <deployment type=\"dockerfile\">\r\n        <settings>\r\n          <option name=\"sourceFilePath\" value=\"Dockerfile\" />\r\n        </settings>\r\n      </deployment>\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <configuration default=\"true\" type=\"docker-deploy\" factoryName=\"dockerfile\" temporary=\"true\">\r\n      <deployment type=\"dockerfile\">\r\n        <settings />\r\n      </deployment>\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <configuration name=\"dev\" type=\"js.build_tools.npm\" temporary=\"true\" nameIsGenerated=\"true\">\r\n      <package-json value=\"$PROJECT_DIR$/package.json\" />\r\n      <command value=\"run\" />\r\n      <scripts>\r\n        <script value=\"dev\" />\r\n      </scripts>\r\n      <node-interpreter value=\"project\" />\r\n      <envs />\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <configuration name=\"lint\" type=\"js.build_tools.npm\" temporary=\"true\" nameIsGenerated=\"true\">\r\n      <package-json value=\"$PROJECT_DIR$/package.json\" />\r\n      <command value=\"run\" />\r\n      <scripts>\r\n        <script value=\"lint\" />\r\n      </scripts>\r\n      <node-interpreter value=\"project\" />\r\n      <envs />\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <configuration name=\"test\" type=\"js.build_tools.npm\" temporary=\"true\" nameIsGenerated=\"true\">\r\n      <package-json value=\"$PROJECT_DIR$/package.json\" />\r\n      <command value=\"run\" />\r\n      <scripts>\r\n        <script value=\"test\" />\r\n      </scripts>\r\n      <node-interpreter value=\"project\" />\r\n      <envs />\r\n      <method v=\"2\" />\r\n    </configuration>\r\n    <list>\r\n      <item itemvalue=\"Docker.Dockerfile\" />\r\n      <item itemvalue=\"Docker.Dockerfile build\" />\r\n      <item itemvalue=\"npm.test\" />\r\n      <item itemvalue=\"npm.dev\" />\r\n      <item itemvalue=\"npm.lint\" />\r\n    </list>\r\n    <recent_temporary>\r\n      <list>\r\n        <item itemvalue=\"npm.dev\" />\r\n        <item itemvalue=\"Docker.Dockerfile\" />\r\n        <item itemvalue=\"npm.test\" />\r\n        <item itemvalue=\"npm.lint\" />\r\n        <item itemvalue=\"Docker.Dockerfile build\" />\r\n      </list>\r\n    </recent_temporary>\r\n  </component>\r\n  <component name=\"SharedIndexes\">\r\n    <attachedChunks>\r\n      <set>\r\n        <option value=\"bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.24978.46\" />\r\n        <option value=\"bundled-js-predefined-d6986cc7102b-76f8388c3a79-JavaScript-IU-243.24978.46\" />\r\n      </set>\r\n    </attachedChunks>\r\n  </component>\r\n  <component name=\"SpellCheckerSettings\" RuntimeDictionaries=\"0\" Folders=\"0\" CustomDictionaries=\"0\" DefaultDictionary=\"application-level\" UseSingleDictionary=\"true\" transferred=\"true\" />\r\n  <component name=\"TaskManager\">\r\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\r\n      <changelist id=\"b30e2810-c4c1-4aad-b134-794e52cc1c7d\" name=\"Changes\" comment=\"\" />\r\n      <created>1718816243156</created>\r\n      <option name=\"number\" value=\"Default\" />\r\n      <option name=\"presentableId\" value=\"Default\" />\r\n      <updated>1718816243156</updated>\r\n      <workItem from=\"1718816244509\" duration=\"13061000\" />\r\n      <workItem from=\"1718991004992\" duration=\"25000\" />\r\n      <workItem from=\"1718991057845\" duration=\"85000\" />\r\n      <workItem from=\"1718991144614\" duration=\"6968000\" />\r\n      <workItem from=\"1718998317252\" duration=\"8533000\" />\r\n      <workItem from=\"1719006887776\" duration=\"7000\" />\r\n      <workItem from=\"1719006951159\" duration=\"2377000\" />\r\n      <workItem from=\"1719021128819\" duration=\"3239000\" />\r\n      <workItem from=\"1719083989394\" duration=\"7971000\" />\r\n      <workItem from=\"1719092003308\" duration=\"14856000\" />\r\n      <workItem from=\"1719164664347\" duration=\"2033000\" />\r\n      <workItem from=\"1719166718305\" duration=\"1783000\" />\r\n      <workItem from=\"1719168519203\" duration=\"17675000\" />\r\n      <workItem from=\"1719197816332\" duration=\"1453000\" />\r\n      <workItem from=\"1719273044735\" duration=\"9847000\" />\r\n      <workItem from=\"1719294110005\" duration=\"3842000\" />\r\n      <workItem from=\"1719339559458\" duration=\"303000\" />\r\n      <workItem from=\"1719340295244\" duration=\"772000\" />\r\n      <workItem from=\"1719363272227\" duration=\"390000\" />\r\n      <workItem from=\"1719379971872\" duration=\"8943000\" />\r\n      <workItem from=\"1719464673797\" duration=\"38000\" />\r\n      <workItem from=\"1719475764139\" duration=\"14903000\" />\r\n      <workItem from=\"1719492452780\" duration=\"8000\" />\r\n      <workItem from=\"1719496624579\" duration=\"6148000\" />\r\n      <workItem from=\"1720542757452\" duration=\"5355000\" />\r\n      <workItem from=\"1720557527691\" duration=\"3245000\" />\r\n      <workItem from=\"1720564427492\" duration=\"1523000\" />\r\n      <workItem from=\"1720613598176\" duration=\"8000\" />\r\n      <workItem from=\"1720655252208\" duration=\"3975000\" />\r\n      <workItem from=\"1720661825389\" duration=\"4305000\" />\r\n      <workItem from=\"1720729165596\" duration=\"3258000\" />\r\n      <workItem from=\"1720911748039\" duration=\"331000\" />\r\n      <workItem from=\"1720912096050\" duration=\"3065000\" />\r\n      <workItem from=\"1740259920741\" duration=\"7742000\" />\r\n      <workItem from=\"1740270391152\" duration=\"690000\" />\r\n      <workItem from=\"1740274898695\" duration=\"2231000\" />\r\n      <workItem from=\"1740295530385\" duration=\"1120000\" />\r\n      <workItem from=\"1740300354462\" duration=\"1059000\" />\r\n      <workItem from=\"1740301493702\" duration=\"8924000\" />\r\n      <workItem from=\"1740318886545\" duration=\"856000\" />\r\n      <workItem from=\"1740348963270\" duration=\"388000\" />\r\n      <workItem from=\"1740399426653\" duration=\"627000\" />\r\n      <workItem from=\"1740459961271\" duration=\"66000\" />\r\n      <workItem from=\"1740460036909\" duration=\"8299000\" />\r\n      <workItem from=\"1740490890760\" duration=\"1889000\" />\r\n      <workItem from=\"1740503199053\" duration=\"4853000\" />\r\n      <workItem from=\"1740584243965\" duration=\"17000\" />\r\n      <workItem from=\"1740613094492\" duration=\"9615000\" />\r\n    </task>\r\n    <task id=\"LOCAL-00080\" summary=\"fix: ci\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719588378907</created>\r\n      <option name=\"number\" value=\"00080\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00080\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719588378907</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00081\" summary=\"fix: ci\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719588501953</created>\r\n      <option name=\"number\" value=\"00081\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00081\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719588501953</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00082\" summary=\"fix: ci\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719588854025</created>\r\n      <option name=\"number\" value=\"00082\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00082\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719588854025</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00083\" summary=\"fix: ci\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719589144843</created>\r\n      <option name=\"number\" value=\"00083\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00083\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719589144843</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00084\" summary=\"chore: jimp types\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719591262232</created>\r\n      <option name=\"number\" value=\"00084\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00084\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719591262232</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00085\" summary=\"fix: package.json\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719591700496</created>\r\n      <option name=\"number\" value=\"00085\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00085\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719591700496</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00086\" summary=\"feat: playwright report\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719600693979</created>\r\n      <option name=\"number\" value=\"00086\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00086\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719600693979</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00087\" summary=\"chore: idea config\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1719600739052</created>\r\n      <option name=\"number\" value=\"00087\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00087\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1719600739052</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00088\" summary=\"feat: sort list\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720545582958</created>\r\n      <option name=\"number\" value=\"00088\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00088\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720545582958</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00089\" summary=\"feat: find most popular ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720546921899</created>\r\n      <option name=\"number\" value=\"00089\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00089\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720546921899</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00090\" summary=\"fix: misc\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720558690146</created>\r\n      <option name=\"number\" value=\"00090\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00090\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720558690147</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00091\" summary=\"fix: style\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720564711406</created>\r\n      <option name=\"number\" value=\"00091\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00091\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720564711406</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00092\" summary=\"feat: find unique ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720565760853</created>\r\n      <option name=\"number\" value=\"00092\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00092\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720565760853</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00093\" summary=\"feat: group list ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720656867853</created>\r\n      <option name=\"number\" value=\"00093\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00093\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720656867853</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00094\" summary=\"feat: reverse list ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720658257129</created>\r\n      <option name=\"number\" value=\"00094\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00094\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720658257129</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00095\" summary=\"feat: self host\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720665220407</created>\r\n      <option name=\"number\" value=\"00095\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00095\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720665220408</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00096\" summary=\"chore: format number\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720730102816</created>\r\n      <option name=\"number\" value=\"00096\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00096\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720730102817</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00097\" summary=\"feat: rotate ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720913013183</created>\r\n      <option name=\"number\" value=\"00097\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00097\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720913013183</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00098\" summary=\"feat: shuffle ui\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720913810733</created>\r\n      <option name=\"number\" value=\"00098\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00098\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720913810733</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00099\" summary=\"refactor: remove validation schema\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720914492812</created>\r\n      <option name=\"number\" value=\"00099\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00099\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720914492812</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00100\" summary=\"refactor: optimize imports\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720914702655</created>\r\n      <option name=\"number\" value=\"00100\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00100\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720914702656</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00101\" summary=\"chore: use string tools\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1720914810712</created>\r\n      <option name=\"number\" value=\"00101\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00101\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1720914810713</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00102\" summary=\"fix: ctrl v\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740267666455</created>\r\n      <option name=\"number\" value=\"00102\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00102\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740267666455</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00103\" summary=\"feat: update readme\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740276092528</created>\r\n      <option name=\"number\" value=\"00103\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00103\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740276092528</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00104\" summary=\"feat: compress png\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740321721526</created>\r\n      <option name=\"number\" value=\"00104\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00104\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740321721526</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00105\" summary=\"feat: compress png\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740321912140</created>\r\n      <option name=\"number\" value=\"00105\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00105\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740321912140</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00106\" summary=\"fix: compress png\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740322444616</created>\r\n      <option name=\"number\" value=\"00106\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00106\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740322444616</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00107\" summary=\"fix: docs\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740324026721</created>\r\n      <option name=\"number\" value=\"00107\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00107\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740324026721</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00108\" summary=\"fix: docs\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740324069359</created>\r\n      <option name=\"number\" value=\"00108\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00108\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740324069359</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00109\" summary=\"fix: docs\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740324274955</created>\r\n      <option name=\"number\" value=\"00109\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00109\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740324274955</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00110\" summary=\"feat: funding\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740460017596</created>\r\n      <option name=\"number\" value=\"00110\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00110\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740460017596</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00111\" summary=\"feat: ui changes\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740464231905</created>\r\n      <option name=\"number\" value=\"00111\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00111\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740464231905</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00112\" summary=\"feat: ui changes\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740464250449</created>\r\n      <option name=\"number\" value=\"00112\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00112\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740464250449</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00113\" summary=\"fix: tsc\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740464642001</created>\r\n      <option name=\"number\" value=\"00113\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00113\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740464642001</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00114\" summary=\"fix: readme\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740468159111</created>\r\n      <option name=\"number\" value=\"00114\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00114\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740468159111</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00115\" summary=\"fix: broken links\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740488522618</created>\r\n      <option name=\"number\" value=\"00115\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00115\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740488522618</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00116\" summary=\"chore: style buttons\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740490919407</created>\r\n      <option name=\"number\" value=\"00116\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00116\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740490919407</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00117\" summary=\"chore: style\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740491274739</created>\r\n      <option name=\"number\" value=\"00117\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00117\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740491274739</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00118\" summary=\"style: background svg\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740491737480</created>\r\n      <option name=\"number\" value=\"00118\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00118\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740491737480</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00119\" summary=\"docs: img\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740503310227</created>\r\n      <option name=\"number\" value=\"00119\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00119\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740503310228</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00120\" summary=\"fix: bg\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740503419102</created>\r\n      <option name=\"number\" value=\"00120\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00120\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740503419102</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00121\" summary=\"fix: bg\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740504051051</created>\r\n      <option name=\"number\" value=\"00121\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00121\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740504051051</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00122\" summary=\"fix: bg\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740504100676</created>\r\n      <option name=\"number\" value=\"00122\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00122\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740504100676</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00123\" summary=\"fix: bg\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740505390205</created>\r\n      <option name=\"number\" value=\"00123\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00123\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740505390205</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00124\" summary=\"docs: readme\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740614012237</created>\r\n      <option name=\"number\" value=\"00124\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00124\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740614012237</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00125\" summary=\"docs: readme\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740614185980</created>\r\n      <option name=\"number\" value=\"00125\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00125\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740614185980</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00126\" summary=\"chore: handle enter press on search\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740614957672</created>\r\n      <option name=\"number\" value=\"00126\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00126\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740614957672</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00127\" summary=\"chore: show tooloptions in example\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740619610168</created>\r\n      <option name=\"number\" value=\"00127\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00127\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740619610169</updated>\r\n    </task>\r\n    <task id=\"LOCAL-00128\" summary=\"refact: examples\">\r\n      <option name=\"closed\" value=\"true\" />\r\n      <created>1740620866551</created>\r\n      <option name=\"number\" value=\"00128\" />\r\n      <option name=\"presentableId\" value=\"LOCAL-00128\" />\r\n      <option name=\"project\" value=\"LOCAL\" />\r\n      <updated>1740620866551</updated>\r\n    </task>\r\n    <option name=\"localTasksCounter\" value=\"129\" />\r\n    <servers />\r\n  </component>\r\n  <component name=\"TypeScriptGeneratedFilesManager\">\r\n    <option name=\"version\" value=\"3\" />\r\n  </component>\r\n  <component name=\"Vcs.Log.History.Properties\">\r\n    <option name=\"COLUMN_ID_ORDER\">\r\n      <list>\r\n        <option value=\"Default.Root\" />\r\n        <option value=\"Default.Author\" />\r\n        <option value=\"Default.Date\" />\r\n        <option value=\"Default.Subject\" />\r\n        <option value=\"Space.CommitStatus\" />\r\n      </list>\r\n    </option>\r\n  </component>\r\n  <component name=\"Vcs.Log.Tabs.Properties\">\r\n    <option name=\"TAB_STATES\">\r\n      <map>\r\n        <entry key=\"MAIN\">\r\n          <value>\r\n            <State />\r\n          </value>\r\n        </entry>\r\n      </map>\r\n    </option>\r\n  </component>\r\n  <component name=\"VcsManagerConfiguration\">\r\n    <option name=\"CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT\" value=\"false\" />\r\n    <option name=\"CHECK_NEW_TODO\" value=\"false\" />\r\n    <option name=\"ADD_EXTERNAL_FILES_SILENTLY\" value=\"true\" />\r\n    <MESSAGE value=\"chore: format number\" />\r\n    <MESSAGE value=\"feat: rotate ui\" />\r\n    <MESSAGE value=\"feat: shuffle ui\" />\r\n    <MESSAGE value=\"refactor: remove validation schema\" />\r\n    <MESSAGE value=\"refactor: optimize imports\" />\r\n    <MESSAGE value=\"chore: use string tools\" />\r\n    <MESSAGE value=\"fix: ctrl v\" />\r\n    <MESSAGE value=\"feat: update readme\" />\r\n    <MESSAGE value=\"feat: compress png\" />\r\n    <MESSAGE value=\"fix: compress png\" />\r\n    <MESSAGE value=\"fix: docs\" />\r\n    <MESSAGE value=\"feat: funding\" />\r\n    <MESSAGE value=\"feat: ui changes\" />\r\n    <MESSAGE value=\"fix: tsc\" />\r\n    <MESSAGE value=\"fix: readme\" />\r\n    <MESSAGE value=\"fix: broken links\" />\r\n    <MESSAGE value=\"chore: style buttons\" />\r\n    <MESSAGE value=\"chore: style\" />\r\n    <MESSAGE value=\"style: background svg\" />\r\n    <MESSAGE value=\"docs: img\" />\r\n    <MESSAGE value=\"fix: bg\" />\r\n    <MESSAGE value=\"docs: readme\" />\r\n    <MESSAGE value=\"chore: handle enter press on search\" />\r\n    <MESSAGE value=\"chore: show tooloptions in example\" />\r\n    <MESSAGE value=\"refact: examples\" />\r\n    <option name=\"LAST_COMMIT_MESSAGE\" value=\"refact: examples\" />\r\n  </component>\r\n  <component name=\"XSLT-Support.FileAssociations.UIState\">\r\n    <expand />\r\n    <select />\r\n  </component>\r\n</project>
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
--- a/.idea/workspace.xml	(revision a713690882b7cecea240163d06ee0b3715158faf)
+++ b/.idea/workspace.xml	(date 1740653982366)
@@ -4,14 +4,7 @@
     <option name="autoReloadType" value="SELECTIVE" />
   </component>
   <component name="ChangeListManager">
-    <list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="refact: examples">
-      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/components/ToolHeader.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/ToolHeader.tsx" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/components/examples/Examples.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/components/examples/ToolExamples.tsx" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/pages/tools/string/join/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/join/index.tsx" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/pages/tools/string/split/index.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/pages/tools/string/split/index.tsx" afterDir="false" />
-      <change beforePath="$PROJECT_DIR$/src/tools/defineTool.tsx" beforeDir="false" afterPath="$PROJECT_DIR$/src/tools/defineTool.tsx" afterDir="false" />
-    </list>
+    <list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="fix: examples" />
     <option name="SHOW_DIALOG" value="false" />
     <option name="HIGHLIGHT_CONFLICTS" value="true" />
     <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -62,47 +55,47 @@
     <option name="hideEmptyMiddlePackages" value="true" />
     <option name="showLibraryContents" value="true" />
   </component>
-  <component name="PropertiesComponent"><![CDATA[{
-  "keyToString": {
-    "ASKED_ADD_EXTERNAL_FILES": "true",
-    "ASKED_SHARE_PROJECT_CONFIGURATION_FILES": "true",
-    "Docker.Dockerfile build.executor": "Run",
-    "Docker.Dockerfile.executor": "Run",
-    "Playwright.JoinText Component.executor": "Run",
-    "Playwright.JoinText Component.should merge text pieces with specified join character.executor": "Run",
-    "RunOnceActivity.OpenProjectViewOnStart": "true",
-    "RunOnceActivity.ShowReadmeOnStart": "true",
-    "RunOnceActivity.git.unshallow": "true",
-    "Vitest.compute function (1).executor": "Run",
-    "Vitest.compute function.executor": "Run",
-    "Vitest.mergeText.executor": "Run",
-    "Vitest.mergeText.should merge lines and preserve blank lines when deleteBlankLines is false.executor": "Run",
-    "Vitest.mergeText.should merge lines, preserve blank lines and trailing spaces when both deleteBlankLines and deleteTrailingSpaces are false.executor": "Run",
-    "git-widget-placeholder": "examples",
-    "ignore.virus.scanning.warn.message": "true",
-    "kotlin-language-version-configured": "true",
-    "last_opened_file_path": "C:/Users/Ibrahima/IdeaProjects/omni-tools/src/assets",
-    "node.js.detected.package.eslint": "true",
-    "node.js.detected.package.tslint": "true",
-    "node.js.selected.package.eslint": "(autodetect)",
-    "node.js.selected.package.tslint": "(autodetect)",
-    "nodejs_package_manager_path": "npm",
-    "npm.dev.executor": "Run",
-    "npm.lint.executor": "Run",
-    "npm.prebuild.executor": "Run",
-    "npm.script:create:tool.executor": "Run",
-    "npm.test.executor": "Run",
-    "npm.test:e2e.executor": "Run",
-    "npm.test:e2e:run.executor": "Run",
-    "prettierjs.PrettierConfiguration.Package": "C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\prettier",
-    "project.structure.last.edited": "Problems",
-    "project.structure.proportion": "0.0",
-    "project.structure.side.proportion": "0.2",
-    "settings.editor.selected.configurable": "settings.typescriptcompiler",
-    "ts.external.directory.path": "C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\typescript\\lib",
-    "vue.rearranger.settings.migration": "true"
+  <component name="PropertiesComponent">{
+  &quot;keyToString&quot;: {
+    &quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
+    &quot;ASKED_SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
+    &quot;Docker.Dockerfile build.executor&quot;: &quot;Run&quot;,
+    &quot;Docker.Dockerfile.executor&quot;: &quot;Run&quot;,
+    &quot;Playwright.JoinText Component.executor&quot;: &quot;Run&quot;,
+    &quot;Playwright.JoinText Component.should merge text pieces with specified join character.executor&quot;: &quot;Run&quot;,
+    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
+    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
+    &quot;Vitest.compute function (1).executor&quot;: &quot;Run&quot;,
+    &quot;Vitest.compute function.executor&quot;: &quot;Run&quot;,
+    &quot;Vitest.mergeText.executor&quot;: &quot;Run&quot;,
+    &quot;Vitest.mergeText.should merge lines and preserve blank lines when deleteBlankLines is false.executor&quot;: &quot;Run&quot;,
+    &quot;Vitest.mergeText.should merge lines, preserve blank lines and trailing spaces when both deleteBlankLines and deleteTrailingSpaces are false.executor&quot;: &quot;Run&quot;,
+    &quot;git-widget-placeholder&quot;: &quot;examples&quot;,
+    &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
+    &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
+    &quot;last_opened_file_path&quot;: &quot;C:/Users/Ibrahima/IdeaProjects/omni-tools/src/assets&quot;,
+    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
+    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
+    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
+    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
+    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
+    &quot;npm.dev.executor&quot;: &quot;Run&quot;,
+    &quot;npm.lint.executor&quot;: &quot;Run&quot;,
+    &quot;npm.prebuild.executor&quot;: &quot;Run&quot;,
+    &quot;npm.script:create:tool.executor&quot;: &quot;Run&quot;,
+    &quot;npm.test.executor&quot;: &quot;Run&quot;,
+    &quot;npm.test:e2e.executor&quot;: &quot;Run&quot;,
+    &quot;npm.test:e2e:run.executor&quot;: &quot;Run&quot;,
+    &quot;prettierjs.PrettierConfiguration.Package&quot;: &quot;C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\prettier&quot;,
+    &quot;project.structure.last.edited&quot;: &quot;Problems&quot;,
+    &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
+    &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
+    &quot;settings.editor.selected.configurable&quot;: &quot;settings.typescriptcompiler&quot;,
+    &quot;ts.external.directory.path&quot;: &quot;C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\typescript\\lib&quot;,
+    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
   }
-}]]></component>
+}</component>
   <component name="ReactDesignerToolWindowState">
     <option name="myId2Visible">
       <map>
@@ -265,15 +258,7 @@
       <workItem from="1740490890760" duration="1889000" />
       <workItem from="1740503199053" duration="4853000" />
       <workItem from="1740584243965" duration="17000" />
-      <workItem from="1740613094492" duration="9615000" />
-    </task>
-    <task id="LOCAL-00080" summary="fix: ci">
-      <option name="closed" value="true" />
-      <created>1719588378907</created>
-      <option name="number" value="00080" />
-      <option name="presentableId" value="LOCAL-00080" />
-      <option name="project" value="LOCAL" />
-      <updated>1719588378907</updated>
+      <workItem from="1740613094492" duration="10412000" />
     </task>
     <task id="LOCAL-00081" summary="fix: ci">
       <option name="closed" value="true" />
@@ -659,7 +644,15 @@
       <option name="project" value="LOCAL" />
       <updated>1740620866551</updated>
     </task>
-    <option name="localTasksCounter" value="129" />
+    <task id="LOCAL-00129" summary="fix: examples">
+      <option name="closed" value="true" />
+      <created>1740622869635</created>
+      <option name="number" value="00129" />
+      <option name="presentableId" value="LOCAL-00129" />
+      <option name="project" value="LOCAL" />
+      <updated>1740622869635</updated>
+    </task>
+    <option name="localTasksCounter" value="130" />
     <servers />
   </component>
   <component name="TypeScriptGeneratedFilesManager">
@@ -691,7 +684,6 @@
     <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
     <option name="CHECK_NEW_TODO" value="false" />
     <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
-    <MESSAGE value="chore: format number" />
     <MESSAGE value="feat: rotate ui" />
     <MESSAGE value="feat: shuffle ui" />
     <MESSAGE value="refactor: remove validation schema" />
@@ -716,7 +708,8 @@
     <MESSAGE value="chore: handle enter press on search" />
     <MESSAGE value="chore: show tooloptions in example" />
     <MESSAGE value="refact: examples" />
-    <option name="LAST_COMMIT_MESSAGE" value="refact: examples" />
+    <MESSAGE value="fix: examples" />
+    <option name="LAST_COMMIT_MESSAGE" value="fix: examples" />
   </component>
   <component name="XSLT-Support.FileAssociations.UIState">
     <expand />


================================================
FILE: .idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]1/shelved.patch
================================================


================================================
FILE: .idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM__Changes_.xml
================================================
<changelist name="Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]" date="1740656670640" recycled="false" toDelete="true">
  <option name="PATH" value="$PROJECT_DIR$/.idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/shelved.patch" />
  <option name="DESCRIPTION" value="Uncommitted changes before Checkout at 2/27/2025 11:44 AM [Changes]" />
</changelist>

================================================
FILE: .idea/vcs.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="VcsDirectoryMappings">
    <mapping directory="$PROJECT_DIR$" vcs="Git" />
  </component>
</project>

================================================
FILE: .idea/workspace.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="AutoImportSettings">
    <option name="autoReloadType" value="SELECTIVE" />
  </component>
  <component name="ChangeListManager">
    <list default="true" id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar across all supported languages. The order of&#10;the elements was also fixed to be consistent.">
      <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/public/locales/es/translation.json" beforeDir="false" afterPath="$PROJECT_DIR$/public/locales/es/translation.json" afterDir="false" />
      <change beforePath="$PROJECT_DIR$/public/locales/fr/translation.json" beforeDir="false" afterPath="$PROJECT_DIR$/public/locales/fr/translation.json" afterDir="false" />
    </list>
    <option name="SHOW_DIALOG" value="false" />
    <option name="HIGHLIGHT_CONFLICTS" value="true" />
    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
    <option name="LAST_RESOLUTION" value="IGNORE" />
  </component>
  <component name="FileTemplateManagerImpl">
    <option name="RECENT_TEMPLATES">
      <list>
        <option value="JavaScript File" />
      </list>
    </option>
  </component>
  <component name="Git.Merge.Settings">
    <option name="BRANCH" value="origin/main" />
  </component>
  <component name="Git.Settings">
    <excluded-from-favorite>
      <branch-storage>
        <map>
          <entry type="LOCAL">
            <value>
              <list>
                <branch-info repo="$PROJECT_DIR$" source="main" />
              </list>
            </value>
          </entry>
        </map>
      </branch-storage>
    </excluded-from-favorite>
    <option name="PUSH_AUTO_UPDATE" value="true" />
    <option name="RECENT_BRANCH_BY_REPOSITORY">
      <map>
        <entry key="$PROJECT_DIR$" value="28f4c64d3044df927dc088435164e803e14f8794" />
      </map>
    </option>
    <option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
    <option name="RESET_MODE" value="HARD" />
  </component>
  <component name="GitHubPullRequestSearchHistory">{
  &quot;history&quot;: [
    {
      &quot;assignee&quot;: &quot;iib0011&quot;
    },
    {
      &quot;searchQuery&quot;: &quot;filter&quot;,
      &quot;state&quot;: &quot;OPEN&quot;
    },
    {
      &quot;state&quot;: &quot;OPEN&quot;
    }
  ],
  &quot;lastFilter&quot;: {
    &quot;state&quot;: &quot;OPEN&quot;
  }
}</component>
  <component name="GitHubPullRequestState">{
  &quot;prStates&quot;: [
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts51PkS9&quot;,
        &quot;number&quot;: 22
      },
      &quot;lastSeen&quot;: 1741207144695
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6NiNYl&quot;,
        &quot;number&quot;: 32
      },
      &quot;lastSeen&quot;: 1741209723869
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6Nheyd&quot;,
        &quot;number&quot;: 31
      },
      &quot;lastSeen&quot;: 1741213371410
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6NmRBs&quot;,
        &quot;number&quot;: 33
      },
      &quot;lastSeen&quot;: 1741282429036
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts5zyFTs&quot;,
        &quot;number&quot;: 15
      },
      &quot;lastSeen&quot;: 1741535540953
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6QQB3c&quot;,
        &quot;number&quot;: 59
      },
      &quot;lastSeen&quot;: 1743018960900
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6QMPEg&quot;,
        &quot;number&quot;: 58
      },
      &quot;lastSeen&quot;: 1743019452983
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6QZvRI&quot;,
        &quot;number&quot;: 61
      },
      &quot;lastSeen&quot;: 1743103196866
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6QqPrQ&quot;,
        &quot;number&quot;: 73
      },
      &quot;lastSeen&quot;: 1743265865001
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6Qp5nI&quot;,
        &quot;number&quot;: 72
      },
      &quot;lastSeen&quot;: 1743338472110
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6QsjlS&quot;,
        &quot;number&quot;: 76
      },
      &quot;lastSeen&quot;: 1743352150953
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6Q0JBe&quot;,
        &quot;number&quot;: 82
      },
      &quot;lastSeen&quot;: 1743470267269
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6UE9-x&quot;,
        &quot;number&quot;: 102
      },
      &quot;lastSeen&quot;: 1747171977348
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6XPua_&quot;,
        &quot;number&quot;: 117
      },
      &quot;lastSeen&quot;: 1747929835864
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6XY-mZ&quot;,
        &quot;number&quot;: 119
      },
      &quot;lastSeen&quot;: 1748028108508
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6Xdz4n&quot;,
        &quot;number&quot;: 120
      },
      &quot;lastSeen&quot;: 1748282672214
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6X_zxl&quot;,
        &quot;number&quot;: 131
      },
      &quot;lastSeen&quot;: 1748881279494
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6bhieT&quot;,
        &quot;number&quot;: 152
      },
      &quot;lastSeen&quot;: 1751848489082
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6dOyRk&quot;,
        &quot;number&quot;: 154
      },
      &quot;lastSeen&quot;: 1751849436454
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6cHjNi&quot;,
        &quot;number&quot;: 153
      },
      &quot;lastSeen&quot;: 1751849501498
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6Zs1FN&quot;,
        &quot;number&quot;: 145
      },
      &quot;lastSeen&quot;: 1751849770308
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6bgKi9&quot;,
        &quot;number&quot;: 150
      },
      &quot;lastSeen&quot;: 1751850367300
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6eUKC-&quot;,
        &quot;number&quot;: 176
      },
      &quot;lastSeen&quot;: 1752158748013
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6et6vx&quot;,
        &quot;number&quot;: 192
      },
      &quot;lastSeen&quot;: 1752585709582
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6d36mi&quot;,
        &quot;number&quot;: 168
      },
      &quot;lastSeen&quot;: 1752805763664
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6fnXKf&quot;,
        &quot;number&quot;: 208
      },
      &quot;lastSeen&quot;: 1752862212326
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6rjINx&quot;,
        &quot;number&quot;: 259
      },
      &quot;lastSeen&quot;: 1759434090574
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6qcP13&quot;,
        &quot;number&quot;: 256
      },
      &quot;lastSeen&quot;: 1759434257615
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6ow8QZ&quot;,
        &quot;number&quot;: 252
      },
      &quot;lastSeen&quot;: 1759434340504
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6myVeZ&quot;,
        &quot;number&quot;: 247
      },
      &quot;lastSeen&quot;: 1759434588110
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6i5ZAq&quot;,
        &quot;number&quot;: 239
      },
      &quot;lastSeen&quot;: 1759434599664
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6iiuGd&quot;,
        &quot;number&quot;: 237
      },
      &quot;lastSeen&quot;: 1759434652702
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6gwm8n&quot;,
        &quot;number&quot;: 230
      },
      &quot;lastSeen&quot;: 1759434669914
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6f5JeZ&quot;,
        &quot;number&quot;: 220
      },
      &quot;lastSeen&quot;: 1759434706785
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6ftgWI&quot;,
        &quot;number&quot;: 217
      },
      &quot;lastSeen&quot;: 1759434804548
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6XsHfL&quot;,
        &quot;number&quot;: 128
      },
      &quot;lastSeen&quot;: 1759434870000
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6ec-tz&quot;,
        &quot;number&quot;: 180
      },
      &quot;lastSeen&quot;: 1759434882113
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6fsi5n&quot;,
        &quot;number&quot;: 216
      },
      &quot;lastSeen&quot;: 1759434902813
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6ZkP3F&quot;,
        &quot;number&quot;: 142
      },
      &quot;lastSeen&quot;: 1759434918778
    },
    {
      &quot;id&quot;: {
        &quot;id&quot;: &quot;PR_kwDOMJIfts6qcbuA&quot;,
        &quot;number&quot;: 257
      },
      &quot;lastSeen&quot;: 1759438234107
    }
  ]
}</component>
  <component name="GithubPullRequestsUISettings">{
  &quot;selectedUrlAndAccountId&quot;: {
    &quot;url&quot;: &quot;https://github.com/iib0011/omni-tools.git&quot;,
    &quot;accountId&quot;: &quot;45f8cd51-000f-4ba4-a4c6-c4d96ac9b1e5&quot;
  }
}</component>
  <component name="GoLibraries">
    <option name="indexEntireGoPath" value="true" />
  </component>
  <component name="HighlightingSettingsPerFile">
    <setting file="file://$PROJECT_DIR$/node_modules/react-image-crop/dist/index.d.ts" root0="SKIP_INSPECTION" />
  </component>
  <component name="KubernetesApiProvider">{
  &quot;isMigrated&quot;: true
}</component>
  <component name="MarkdownSettingsMigration">
    <option name="stateVersion" value="1" />
  </component>
  <component name="ProjectColorInfo">{
    &quot;associatedIndex&quot;: 0
    }</component>
  <component name="ProjectId" id="2i6g3WkUxdCURKYvUIJ9LMY5Qsc" />
  <component name="ProjectLevelVcsManager" settingsEditedManually="true">
    <OptionsSetting value="false" id="Update" />
    <ConfirmationsSetting value="2" id="Add" />
  </component>
  <component name="ProjectViewState">
    <option name="autoscrollFromSource" value="true" />
    <option name="hideEmptyMiddlePackages" value="true" />
    <option name="showLibraryContents" value="true" />
  </component>
  <component name="PropertiesComponent">{
  &quot;keyToString&quot;: {
    &quot;ASKED_ADD_EXTERNAL_FILES&quot;: &quot;true&quot;,
    &quot;ASKED_SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;,
    &quot;Docker.Dockerfile build.executor&quot;: &quot;Run&quot;,
    &quot;Docker.Dockerfile.executor&quot;: &quot;Run&quot;,
    &quot;Node.js.add-i18n-to-meta.js.executor&quot;: &quot;Run&quot;,
    &quot;Node.js.locize-upload.js.executor&quot;: &quot;Run&quot;,
    &quot;Node.js.update-i18n-from-meta.js.executor&quot;: &quot;Run&quot;,
    &quot;Playwright.Create transparent PNG.should make png color transparent.executor&quot;: &quot;Run&quot;,
    &quot;Playwright.JoinText Component.executor&quot;: &quot;Run&quot;,
    &quot;Playwright.JoinText Component.should merge text pieces with specified join character.executor&quot;: &quot;Run&quot;,
    &quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
    &quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;,
    &quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;,
    &quot;Vitest.compute function (1).executor&quot;: &quot;Run&quot;,
    &quot;Vitest.compute function.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.generatePassword.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.mergeText.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.mergeText.should merge lines and preserve blank lines when deleteBlankLines is false.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.mergeText.should merge lines, preserve blank lines and trailing spaces when both deleteBlankLines and deleteTrailingSpaces are false.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.parsePageRanges.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.removeDuplicateLines function.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.removeDuplicateLines function.newlines option.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.removeDuplicateLines function.newlines option.should filter newlines when newlines is set to filter.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.replaceText function (regexp mode).should return the original text when passed an invalid regexp.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.replaceText function.executor&quot;: &quot;Run&quot;,
    &quot;Vitest.timeBetweenDates.executor&quot;: &quot;Run&quot;,
    &quot;git-widget-placeholder&quot;: &quot;main&quot;,
    &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
    &quot;kotlin-language-version-configured&quot;: &quot;true&quot;,
    &quot;last_opened_file_path&quot;: &quot;C:/Users/Ibrahima/IdeaProjects/omni-tools&quot;,
    &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
    &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
    &quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;,
    &quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;,
    &quot;nodejs_package_manager_path&quot;: &quot;npm&quot;,
    &quot;npm.build.executor&quot;: &quot;Run&quot;,
    &quot;npm.dev.executor&quot;: &quot;Run&quot;,
    &quot;npm.i18n:extract.executor&quot;: &quot;Run&quot;,
    &quot;npm.i18n:pull.executor&quot;: &quot;Run&quot;,
    &quot;npm.i18n:push.executor&quot;: &quot;Run&quot;,
    &quot;npm.i18n:sync.executor&quot;: &quot;Run&quot;,
    &quot;npm.lint.executor&quot;: &quot;Run&quot;,
    &quot;npm.prebuild.executor&quot;: &quot;Run&quot;,
    &quot;npm.script:create:tool.executor&quot;: &quot;Run&quot;,
    &quot;npm.test.executor&quot;: &quot;Run&quot;,
    &quot;npm.test:e2e.executor&quot;: &quot;Run&quot;,
    &quot;npm.test:e2e:run.executor&quot;: &quot;Run&quot;,
    &quot;npm.typecheck.executor&quot;: &quot;Run&quot;,
    &quot;prettierjs.PrettierConfiguration.Package&quot;: &quot;C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\prettier&quot;,
    &quot;project.structure.last.edited&quot;: &quot;Problems&quot;,
    &quot;project.structure.proportion&quot;: &quot;0.0&quot;,
    &quot;project.structure.side.proportion&quot;: &quot;0.2&quot;,
    &quot;settings.editor.selected.configurable&quot;: &quot;preferences.pluginManager&quot;,
    &quot;ts.external.directory.path&quot;: &quot;C:\\Users\\Ibrahima\\IdeaProjects\\omni-tools\\node_modules\\typescript\\lib&quot;,
    &quot;ts.rename.search.for.js.occurrences&quot;: &quot;false&quot;,
    &quot;vue.rearranger.settings.migration&quot;: &quot;true&quot;
  }
}</component>
  <component name="ReactDesignerToolWindowState">
    <option name="myId2Visible">
      <map>
        <entry key="com.intellij.reactbuddy.reactComponents" value="false" />
        <entry key="com.intellij.reactbuddy.reactInspector" value="false" />
        <entry key="com.intellij.reactbuddy.storybook" value="false" />
      </map>
    </option>
  </component>
  <component name="RecentsManager">
    <key name="CopyFile.RECENT_KEYS">
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\assets" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public\assets\fonts\quicksand" />
    </key>
    <key name="MoveFile.RECENT_KEYS">
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\@types" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\lib\ghostscript" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\public\assets" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\pages\tools" />
      <recent name="C:\Users\Ibrahima\IdeaProjects\omni-tools\src\pages\categories" />
    </key>
  </component>
  <component name="RunManager" selected="npm.dev">
    <configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
      <deployment type="dockerfile">
        <settings />
      </deployment>
      <method v="2" />
    </configuration>
    <configuration name="dev" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
      <package-json value="$PROJECT_DIR$/package.json" />
      <command value="run" />
      <scripts>
        <script value="dev" />
      </scripts>
      <node-interpreter value="project" />
      <envs>
        <env name="LOCIZE_API_KEY" value="a2ac4dc2-d10e-4d35-bcf7-92db87381711" />
        <env name="VITE_CONTRIBUTOR_MODE" value="true" />
      </envs>
      <method v="2" />
    </configuration>
    <configuration name="i18n:sync" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
      <package-json value="$PROJECT_DIR$/package.json" />
      <command value="run" />
      <scripts>
        <script value="i18n:sync" />
      </scripts>
      <node-interpreter value="project" />
      <envs>
        <env name="LOCIZE_API_KEY" value="a2ac4dc2-d10e-4d35-bcf7-92db87381711" />
      </envs>
      <method v="2" />
    </configuration>
    <configuration name="test" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
      <package-json value="$PROJECT_DIR$/package.json" />
      <command value="run" />
      <scripts>
        <script value="test" />
      </scripts>
      <node-interpreter value="project" />
      <envs />
      <method v="2" />
    </configuration>
    <configuration name="test:e2e" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
      <package-json value="$PROJECT_DIR$/package.json" />
      <command value="run" />
      <scripts>
        <script value="test:e2e" />
      </scripts>
      <node-interpreter value="project" />
      <envs />
      <method v="2" />
    </configuration>
    <configuration name="typecheck" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
      <package-json value="$PROJECT_DIR$/package.json" />
      <command value="run" />
      <scripts>
        <script value="typecheck" />
      </scripts>
      <node-interpreter value="project" />
      <envs />
      <method v="2" />
    </configuration>
    <list>
      <item itemvalue="npm.test" />
      <item itemvalue="npm.test:e2e" />
      <item itemvalue="npm.typecheck" />
      <item itemvalue="npm.i18n:sync" />
      <item itemvalue="npm.dev" />
    </list>
    <recent_temporary>
      <list>
        <item itemvalue="npm.dev" />
        <item itemvalue="npm.i18n:sync" />
        <item itemvalue="npm.test:e2e" />
        <item itemvalue="npm.test" />
        <item itemvalue="npm.typecheck" />
      </list>
    </recent_temporary>
  </component>
  <component name="SharedIndexes">
    <attachedChunks>
      <set>
        <option value="bundled-jdk-9823dce3aa75-125ca727e0f0-intellij.indexing.shared.core-IU-243.24978.46" />
        <option value="bundled-js-predefined-d6986cc7102b-76f8388c3a79-JavaScript-IU-243.24978.46" />
      </set>
    </attachedChunks>
  </component>
  <component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
  <component name="TaskManager">
    <task active="true" id="Default" summary="Default task">
      <changelist id="b30e2810-c4c1-4aad-b134-794e52cc1c7d" name="Changes" comment="" />
      <created>1718816243156</created>
      <option name="number" value="Default" />
      <option name="presentableId" value="Default" />
      <updated>1718816243156</updated>
      <workItem from="1718816244509" duration="13061000" />
      <workItem from="1718991004992" duration="25000" />
      <workItem from="1718991057845" duration="85000" />
      <workItem from="1718991144614" duration="6968000" />
      <workItem from="1718998317252" duration="8533000" />
      <workItem from="1719006887776" duration="7000" />
      <workItem from="1719006951159" duration="2377000" />
      <workItem from="1719021128819" duration="3239000" />
      <workItem from="1719083989394" duration="7971000" />
      <workItem from="1719092003308" duration="14856000" />
      <workItem from="1719164664347" duration="2033000" />
      <workItem from="1719166718305" duration="1783000" />
      <workItem from="1719168519203" duration="17675000" />
      <workItem from="1719197816332" duration="1453000" />
      <workItem from="1719273044735" duration="9847000" />
      <workItem from="1719294110005" duration="3842000" />
      <workItem from="1719339559458" duration="303000" />
      <workItem from="1719340295244" duration="772000" />
      <workItem from="1719363272227" duration="390000" />
      <workItem from="1719379971872" duration="8943000" />
      <workItem from="1719464673797" duration="38000" />
      <workItem from="1719475764139" duration="14903000" />
      <workItem from="1719492452780" duration="8000" />
      <workItem from="1719496624579" duration="6148000" />
      <workItem from="1720542757452" duration="5355000" />
      <workItem from="1720557527691" duration="3245000" />
      <workItem from="1720564427492" duration="1523000" />
      <workItem from="1720613598176" duration="8000" />
      <workItem from="1720655252208" duration="3975000" />
      <workItem from="1720661825389" duration="4305000" />
      <workItem from="1720729165596" duration="3258000" />
      <workItem from="1720911748039" duration="331000" />
      <workItem from="1720912096050" duration="3065000" />
      <workItem from="1740259920741" duration="7742000" />
      <workItem from="1740270391152" duration="690000" />
      <workItem from="1740274898695" duration="2231000" />
      <workItem from="1740295530385" duration="1120000" />
      <workItem from="1740300354462" duration="1059000" />
      <workItem from="1740301493702" duration="8924000" />
      <workItem from="1740318886545" duration="856000" />
      <workItem from="1740348963270" duration="388000" />
      <workItem from="1740399426653" duration="627000" />
      <workItem from="1740459961271" duration="66000" />
      <workItem from="1740460036909" duration="8299000" />
      <workItem from="1740490890760" duration="1889000" />
      <workItem from="1740503199053" duration="4853000" />
      <workItem from="1740584243965" duration="17000" />
      <workItem from="1740613094492" duration="9615000" />
      <workItem from="1740664266923" duration="145000" />
      <workItem from="1740665190253" duration="496000" />
      <workItem from="1740670449847" duration="4776000" />
      <workItem from="1740702343843" duration="657000" />
      <workItem from="1740788381920" duration="465000" />
      <workItem from="1740788856134" duration="659000" />
      <workItem from="1740880919391" duration="4395000" />
      <workItem from="1740923024259" duration="23000" />
      <workItem from="1740933006573" duration="3679000" />
      <workItem from="1741475969294" duration="4215000" />
      <workItem from="1741494053121" duration="178000" />
      <workItem from="1741537936314" duration="1294000" />
      <workItem from="1741539602311" duration="4557000" />
      <workItem from="1741547560596" duration="1671000" />
      <workItem from="1741567442768" duration="14127000" />
      <workItem from="1741971589699" duration="371000" />
      <workItem from="1743018497879" duration="3895000" />
      <workItem from="1743047367993" duration="986000" />
      <workItem from="1743103182313" duration="4264000" />
      <workItem from="1743348610793" duration="21855000" />
      <workItem from="1743397561176" duration="25000" />
      <workItem from="1743458576265" duration="13083000" />
      <workItem from="1743690613245" duration="77000" />
      <workItem from="1743691250813" duration="1550000" />
      <workItem from="1743699386059" duration="11195000" />
      <workItem from="1743782726563" duration="2444000" />
      <workItem from="1743811558991" duration="1279000" />
      <workItem from="1745523972292" duration="3000" />
      <workItem from="1745687713234" duration="1747000" />
      <workItem from="1745775228478" duration="1221000" />
      <workItem from="1745835676024" duration="68000" />
      <workItem from="1747171958176" duration="1105000" />
      <workItem from="1747217211469" duration="4000" />
      <workItem from="1747929815472" duration="843000" />
      <workItem from="1748026506667" duration="2536000" />
      <workItem from="1748282636141" duration="478000" />
      <workItem from="1749047510481" duration="879000" />
      <workItem from="1751846528195" duration="4358000" />
      <workItem from="1752070315115" duration="19000" />
      <workItem from="1752071020011" duration="1599000" />
      <workItem from="1752077170501" duration="4261000" />
      <workItem from="1752127185450" duration="1168000" />
      <workItem from="1752157409587" duration="2415000" />
      <workItem from="1752403829295" duration="13253000" />
      <workItem from="1752493585622" duration="11629000" />
      <workItem from="1752507105323" duration="9008000" />
      <workItem from="1752875788332" duration="3566000" />
      <workItem from="1753099267173" duration="21000" />
      <workItem from="1753123130080" duration="4054000" />
      <workItem from="1753201599796" duration="4449000" />
      <workItem from="1753206561770" duration="119000" />
      <workItem from="1753206717510" duration="3599000" />
      <workItem from="1759497758761" duration="1012000" />
      <workItem from="1759502144651" duration="1106000" />
    </task>
    <task id="LOCAL-00210" summary="feat: convert to jpg">
      <option name="closed" value="true" />
      <created>1752026153328</created>
      <option name="number" value="00210" />
      <option name="presentableId" value="LOCAL-00210" />
      <option name="project" value="LOCAL" />
      <updated>1752026153328</updated>
    </task>
    <task id="LOCAL-00211" summary="feat: edit image">
      <option name="closed" value="true" />
      <created>1752032092273</created>
      <option name="number" value="00211" />
      <option name="presentableId" value="LOCAL-00211" />
      <option name="project" value="LOCAL" />
      <updated>1752032092274</updated>
    </task>
    <task id="LOCAL-00212" summary="fix: favicons">
      <option name="closed" value="true" />
      <created>1752071147050</created>
      <option name="number" value="00212" />
      <option name="presentableId" value="LOCAL-00212" />
      <option name="project" value="LOCAL" />
      <updated>1752071147050</updated>
    </task>
    <task id="LOCAL-00213" summary="chore: examples button visibility">
      <option name="closed" value="true" />
      <created>1752079671580</created>
      <option name="number" value="00213" />
      <option name="presentableId" value="LOCAL-00213" />
      <option name="project" value="LOCAL" />
      <updated>1752079671580</updated>
    </task>
    <task id="LOCAL-00214" summary="feat: pdf editor">
      <option name="closed" value="true" />
      <created>1752079879005</created>
      <option name="number" value="00214" />
      <option name="presentableId" value="LOCAL-00214" />
      <option name="project" value="LOCAL" />
      <updated>1752079879005</updated>
    </task>
    <task id="LOCAL-00215" summary="chore: style link">
      <option name="closed" value="true" />
      <created>1752080307348</created>
      <option name="number" value="00215" />
      <option name="presentableId" value="LOCAL-00215" />
      <option name="project" value="LOCAL" />
      <updated>1752080307349</updated>
    </task>
    <task id="LOCAL-00216" summary="refactor: PDF editor">
      <option name="closed" value="true" />
      <created>1752157851370</created>
      <option name="number" value="00216" />
      <option name="presentableId" value="LOCAL-00216" />
      <option name="project" value="LOCAL" />
      <updated>1752157851371</updated>
    </task>
    <task id="LOCAL-00217" summary="docs: edit pdf meta">
      <option name="closed" value="true" />
      <created>1752158119802</created>
      <option name="number" value="00217" />
      <option name="presentableId" value="LOCAL-00217" />
      <option name="project" value="LOCAL" />
      <updated>1752158119802</updated>
    </task>
    <task id="LOCAL-00218" summary="fix: misc">
      <option name="closed" value="true" />
      <created>1752402313190</created>
      <option name="number" value="00218" />
      <option name="presentableId" value="LOCAL-00218" />
      <option name="project" value="LOCAL" />
      <updated>1752402313191</updated>
    </task>
    <task id="LOCAL-00219" summary="fix: i18n tsc">
      <option name="closed" value="true" />
      <created>1752408068771</created>
      <option name="number" value="00219" />
      <option name="presentableId" value="LOCAL-00219" />
      <option name="project" value="LOCAL" />
      <updated>1752408068771</updated>
    </task>
    <task id="LOCAL-00220" summary="fix: i18n tsc">
      <option name="closed" value="true" />
      <created>1752412149075</created>
      <option name="number" value="00220" />
      <option name="presentableId" value="LOCAL-00220" />
      <option name="project" value="LOCAL" />
      <updated>1752412149075</updated>
    </task>
    <task id="LOCAL-00221" summary="fix: tsc">
      <option name="closed" value="true" />
      <created>1752422405814</created>
      <option name="number" value="00221" />
      <option name="presentableId" value="LOCAL-00221" />
      <option name="project" value="LOCAL" />
      <updated>1752422405814</updated>
    </task>
    <task id="LOCAL-00222" summary="chore: locize upload">
      <option name="closed" value="true" />
      <created>1752423460080</created>
      <option name="number" value="00222" />
      <option name="presentableId" value="LOCAL-00222" />
      <option name="project" value="LOCAL" />
      <updated>1752423460080</updated>
    </task>
    <task id="LOCAL-00223" summary="chore: i18n in meta">
      <option name="closed" value="true" />
      <created>1752493634215</created>
      <option name="number" value="00223" />
      <option name="presentableId" value="LOCAL-00223" />
      <option name="project" value="LOCAL" />
      <updated>1752493634215</updated>
    </task>
    <task id="LOCAL-00224" summary="chore: add i18n to meta script">
      <option name="closed" value="true" />
      <created>1752497705915</created>
      <option name="number" value="00224" />
      <option name="presentableId" value="LOCAL-00224" />
      <option name="project" value="LOCAL" />
      <updated>1752497705915</updated>
    </task>
    <task id="LOCAL-00225" summary="fix: tsc">
      <option name="closed" value="true" />
      <created>1752501110885</created>
      <option name="number" value="00225" />
      <option name="presentableId" value="LOCAL-00225" />
      <option name="project" value="LOCAL" />
      <updated>1752501110885</updated>
    </task>
    <task id="LOCAL-00226" summary="chore: bundle translations at build time">
      <option name="closed" value="true" />
      <created>1752503206380</created>
      <option name="number" value="00226" />
      <option name="presentableId" value="LOCAL-00226" />
      <option name="project" value="LOCAL" />
      <updated>1752503206380</updated>
    </task>
    <task id="LOCAL-00227" summary="fix: tsc">
      <option name="closed" value="true" />
      <created>1752503720380</created>
      <option name="number" value="00227" />
      <option name="presentableId" value="LOCAL-00227" />
      <option name="project" value="LOCAL" />
      <updated>1752503720380</updated>
    </task>
    <task id="LOCAL-00228" summary="chore: remove unnecessary">
      <option name="closed" value="true" />
      <created>1752503770543</created>
      <option name="number" value="00228" />
      <option name="presentableId" value="LOCAL-00228" />
      <option name="project" value="LOCAL" />
      <updated>1752503770543</updated>
    </task>
    <task id="LOCAL-00229" summary="chore: saveMissing">
      <option name="closed" value="true" />
      <created>1752505593881</created>
      <option name="number" value="00229" />
      <option name="presentableId" value="LOCAL-00229" />
      <option name="project" value="LOCAL" />
      <updated>1752505593881</updated>
    </task>
    <task id="LOCAL-00230" summary="fix: translation related behaviors">
      <option name="closed" value="true" />
      <created>1752512678963</created>
      <option name="number" value="00230" />
      <option name="presentableId" value="LOCAL-00230" />
      <option name="project" value="LOCAL" />
      <updated>1752512678963</updated>
    </task>
    <task id="LOCAL-00231" summary="feat: password generator to test translation">
      <option name="closed" value="true" />
      <created>1752514466233</created>
      <option name="number" value="00231" />
      <option name="presentableId" value="LOCAL-00231" />
      <option name="project" value="LOCAL" />
      <updated>1752514466233</updated>
    </task>
    <task id="LOCAL-00232" summary="docs: translation docs">
      <option name="closed" value="true" />
      <created>1752515675314</created>
      <option name="number" value="00232" />
      <option name="presentableId" value="LOCAL-00232" />
      <option name="project" value="LOCAL" />
      <updated>1752515675314</updated>
    </task>
    <task id="LOCAL-00233" summary="fix: translations">
      <option name="closed" value="true" />
      <created>1752585351036</created>
      <option name="number" value="00233" />
      <option name="presentableId" value="LOCAL-00233" />
      <option name="project" value="LOCAL" />
      <updated>1752585351036</updated>
    </task>
    <task id="LOCAL-00234" summary="chore: delete unused i18n json files">
      <option name="closed" value="true" />
      <created>1752585829343</created>
      <option name="number" value="00234" />
      <option name="presentableId" value="LOCAL-00234" />
      <option name="project" value="LOCAL" />
      <updated>1752585829343</updated>
    </task>
    <task id="LOCAL-00235" summary="fix: create-tool.mjs to use i18n object">
      <option name="closed" value="true" />
      <created>1752586932190</created>
      <option name="number" value="00235" />
      <option name="presentableId" value="LOCAL-00235" />
      <option name="project" value="LOCAL" />
      <updated>1752586932190</updated>
    </task>
    <task id="LOCAL-00236" summary="fix: show Use this tool only if medium breakpoint">
      <option name="closed" value="true" />
      <created>1752591387066</created>
      <option name="number" value="00236" />
      <option name="presentableId" value="LOCAL-00236" />
      <option name="project" value="LOCAL" />
      <updated>1752591387066</updated>
    </task>
    <task id="LOCAL-00237" summary="chore: sync locales">
      <option name="closed" value="true" />
      <created>1752596436284</created>
      <option name="number" value="00237" />
      <option name="presentableId" value="LOCAL-00237" />
      <option name="project" value="LOCAL" />
      <updated>1752596436284</updated>
    </task>
    <task id="LOCAL-00238" summary="fix: i18n">
      <option name="closed" value="true" />
      <created>1752600606853</created>
      <option name="number" value="00238" />
      <option name="presentableId" value="LOCAL-00238" />
      <option name="project" value="LOCAL" />
      <updated>1752600606853</updated>
    </task>
    <task id="LOCAL-00239" summary="fix: i18n">
      <option name="closed" value="true" />
      <created>1752601115085</created>
      <option name="number" value="00239" />
      <option name="presentableId" value="LOCAL-00239" />
      <option name="project" value="LOCAL" />
      <updated>1752601115085</updated>
    </task>
    <task id="LOCAL-00240" summary="chore: remove prebuild">
      <option name="closed" value="true" />
      <created>1752601506346</created>
      <option name="number" value="00240" />
      <option name="presentableId" value="LOCAL-00240" />
      <option name="project" value="LOCAL" />
      <updated>1752601506346</updated>
    </task>
    <task id="LOCAL-00241" summary="fix: broken translations">
      <option name="closed" value="true" />
      <created>1752601987121</created>
      <option name="number" value="00241" />
      <option name="presentableId" value="LOCAL-00241" />
      <option name="project" value="LOCAL" />
      <updated>1752601987121</updated>
    </task>
    <task id="LOCAL-00242" summary="fix: i18n tsc">
      <option name="closed" value="true" />
      <created>1752604958929</created>
      <option name="number" value="00242" />
      <option name="presentableId" value="LOCAL-00242" />
      <option name="project" value="LOCAL" />
      <updated>1752604958929</updated>
    </task>
    <task id="LOCAL-00243" summary="chore: i18n pull dutch">
      <option name="closed" value="true" />
      <created>1752605940802</created>
      <option name="number" value="00243" />
      <option name="presentableId" value="LOCAL-00243" />
      <option name="project" value="LOCAL" />
      <updated>1752605940802</updated>
    </task>
    <task id="LOCAL-00244" summary="chore: sync locize">
      <option name="closed" value="true" />
      <created>1752805853344</created>
      <option name="number" value="00244" />
      <option name="presentableId" value="LOCAL-00244" />
      <option name="project" value="LOCAL" />
      <updated>1752805853344</updated>
    </task>
    <task id="LOCAL-00245" summary="feat: language browser detection">
      <option name="closed" value="true" />
      <created>1753124389709</created>
      <option name="number" value="00245" />
      <option name="presentableId" value="LOCAL-00245" />
      <option name="project" value="LOCAL" />
      <updated>1753124389709</updated>
    </task>
    <task id="LOCAL-00246" summary="fix: misc">
      <option name="closed" value="true" />
      <created>1753206794968</created>
      <option name="number" value="00246" />
      <option name="presentableId" value="LOCAL-00246" />
      <option name="project" value="LOCAL" />
      <updated>1753206794968</updated>
    </task>
    <task id="LOCAL-00247" summary="chore: show only necessary tags on a category">
      <option name="closed" value="true" />
      <created>1753207817041</created>
      <option name="number" value="00247" />
      <option name="presentableId" value="LOCAL-00247" />
      <option name="project" value="LOCAL" />
      <updated>1753207817041</updated>
    </task>
    <task id="LOCAL-00248" summary="chore: CATEGORIES_USER_TYPES_MAPPINGS">
      <option name="closed" value="true" />
      <created>1753209484099</created>
      <option name="number" value="00248" />
      <option name="presentableId" value="LOCAL-00248" />
      <option name="project" value="LOCAL" />
      <updated>1753209484099</updated>
    </task>
    <task id="LOCAL-00249" summary="chore: translate userTypes">
      <option name="closed" value="true" />
      <created>1753210033390</created>
      <option name="number" value="00249" />
      <option name="presentableId" value="LOCAL-00249" />
      <option name="project" value="LOCAL" />
      <updated>1753210033390</updated>
    </task>
    <task id="LOCAL-00250" summary="feat: remove temperature conversion from generic-calc&#10;&#10;This commit removes the temperature conversion tool from the&#10;generic-calc tool. This is because the tool was causing issues.&#10;&#10;The following files were modified:&#10;- src/pages/tools/number/generic-calc/data/index.ts&#10;- src/pages/tools/number/generic-calc/data/temperature.ts&#10;- package.json&#10;- .idea/workspace.xml">
      <option name="closed" value="true" />
      <created>1759439927012</created>
      <option name="number" value="00250" />
      <option name="presentableId" value="LOCAL-00250" />
      <option name="project" value="LOCAL" />
      <updated>1759439927012</updated>
    </task>
    <task id="LOCAL-00251" summary="feat: Remove onnxruntime-web dependency (main)&#10;&#10;This commit removes the onnxruntime-web package&#10;from package.json.&#10;```">
      <option name="closed" value="true" />
      <created>1759441368519</created>
      <option name="number" value="00251" />
      <option name="presentableId" value="LOCAL-00251" />
      <option name="project" value="LOCAL" />
      <updated>1759441368519</updated>
    </task>
    <task id="LOCAL-00252" summary="fix: onnxruntime-web version">
      <option name="closed" value="true" />
      <created>1759441908841</created>
      <option name="number" value="00252" />
      <option name="presentableId" value="LOCAL-00252" />
      <option name="project" value="LOCAL" />
      <updated>1759441908841</updated>
    </task>
    <task id="LOCAL-00253" summary="feat: Upgrade Node.js versions in CI (main)&#10;&#10;This commit updates the Node.js versions used in the CI&#10;workflows to version 20. This ensures that the CI&#10;environment uses a more up-to-date and supported version&#10;of Node.js.">
      <option name="closed" value="true" />
      <created>1759442128298</created>
      <option name="number" value="00253" />
      <option name="presentableId" value="LOCAL-00253" />
      <option name="project" value="LOCAL" />
      <updated>1759442128299</updated>
    </task>
    <task id="LOCAL-00254" summary="feat: Upgrade onnxruntime-web and onnxruntime-common (main)&#10;&#10;Upgrades onnxruntime-web and onnxruntime-common to versions&#10;1.23.0. This includes updates to dependencies and related&#10;packages.">
      <option name="closed" value="true" />
      <created>1759442775014</created>
      <option name="number" value="00254" />
      <option name="presentableId" value="LOCAL-00254" />
      <option name="project" value="LOCAL" />
      <updated>1759442775014</updated>
    </task>
    <task id="LOCAL-00255" summary="chore: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;This commit replaces the &quot;Buy me a coffee&quot; button with a&#10;&quot;Hire me&quot; button in the navbar. It also updates the&#10;corresponding translation in the `en/translation.json` file.&#10;The icon has been changed to a job search icon, and the&#10;link points to a Google Drive document.">
      <option name="closed" value="true" />
      <created>1759502472647</created>
      <option name="number" value="00255" />
      <option name="presentableId" value="LOCAL-00255" />
      <option name="project" value="LOCAL" />
      <updated>1759502472647</updated>
    </task>
    <task id="LOCAL-00256" summary="feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.">
      <option name="closed" value="true" />
      <created>1759502707923</created>
      <option name="number" value="00256" />
      <option name="presentableId" value="LOCAL-00256" />
      <option name="project" value="LOCAL" />
      <updated>1759502707923</updated>
    </task>
    <task id="LOCAL-00257" summary="feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.&#10;- Updated translation files in other languages with &quot;hireMe&quot;.">
      <option name="closed" value="true" />
      <created>1759503018626</created>
      <option name="number" value="00257" />
      <option name="presentableId" value="LOCAL-00257" />
      <option name="project" value="LOCAL" />
      <updated>1759503018627</updated>
    </task>
    <task id="LOCAL-00258" summary="fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar across all supported languages. The order of&#10;the elements was also fixed to be consistent.">
      <option name="closed" value="true" />
      <created>1759503051936</created>
      <option name="number" value="00258" />
      <option name="presentableId" value="LOCAL-00258" />
      <option name="project" value="LOCAL" />
      <updated>1759503051936</updated>
    </task>
    <option name="localTasksCounter" value="259" />
    <servers />
  </component>
  <component name="TypeScriptGeneratedFilesManager">
    <option name="version" value="3" />
  </component>
  <component name="Vcs.Log.History.Properties">
    <option name="COLUMN_ID_ORDER">
      <list>
        <option value="Default.Root" />
        <option value="Default.Author" />
        <option value="Default.Date" />
        <option value="Default.Subject" />
        <option value="Space.CommitStatus" />
      </list>
    </option>
  </component>
  <component name="Vcs.Log.Tabs.Properties">
    <option name="RECENT_FILTERS">
      <map>
        <entry key="Branch">
          <value>
            <list>
              <RecentGroup>
                <option name="FILTER_VALUES">
                  <option value="origin/main" />
                </option>
              </RecentGroup>
              <RecentGroup>
                <option name="FILTER_VALUES">
                  <option value="origin/examples" />
                </option>
              </RecentGroup>
            </list>
          </value>
        </entry>
      </map>
    </option>
    <option name="TAB_STATES">
      <map>
        <entry key="MAIN">
          <value>
            <State>
              <option name="FILTERS">
                <map>
                  <entry key="branch">
                    <value>
                      <list>
                        <option value="origin/main" />
                      </list>
                    </value>
                  </entry>
                </map>
              </option>
            </State>
          </value>
        </entry>
      </map>
    </option>
  </component>
  <component name="VcsManagerConfiguration">
    <option name="CHECK_CODE_SMELLS_BEFORE_PROJECT_COMMIT" value="false" />
    <option name="CHECK_NEW_TODO" value="false" />
    <option name="ADD_EXTERNAL_FILES_SILENTLY" value="true" />
    <MESSAGE value="feat: Upgrade Node.js versions in CI (main)&#10;&#10;This commit updates the Node.js versions used in the CI&#10;workflows to version 20. This ensures that the CI&#10;environment uses a more up-to-date and supported version&#10;of Node.js." />
    <MESSAGE value="feat" />
    <MESSAGE value="feat: Upgrade onnxruntime-web and onnxruntime-common (main)&#10;&#10;Up" />
    <MESSAGE value="feat: Upgrade onnxruntime-web and onnxruntime-common (main)&#10;&#10;Upgrades onnxruntime-web and onnxruntime-common to versions&#10;1" />
    <MESSAGE value="feat: Upgrade onnxruntime-web and onnxruntime-common (main)&#10;&#10;Upgrades onnxruntime-web and onnxruntime-common to versions&#10;1.23.0. This includes updates to dependencies and related&#10;packages.&#10;" />
    <MESSAGE value="feat: Upgrade onnxruntime-web and onnxruntime-common (main)&#10;&#10;Upgrades onnxruntime-web and onnxruntime-common to versions&#10;1.23.0. This includes updates to dependencies and related&#10;packages." />
    <MESSAGE value="```&#10;feat: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;" />
    <MESSAGE value="```&#10;feat: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;This commit replaces the &quot;Buy me a coffee&quot; button with a&#10;&quot;Hire" />
    <MESSAGE value="```&#10;feat: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;This commit replaces the &quot;Buy me a coffee&quot; button with a&#10;&quot;Hire me&quot; button in the navbar. It also updates the&#10;corresponding translation in the `en/translation.json` file.&#10;The icon has been changed to a" />
    <MESSAGE value="```&#10;feat: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;This commit replaces the &quot;Buy me a coffee&quot; button with a&#10;&quot;Hire me&quot; button in the navbar. It also updates the&#10;corresponding translation in the `en/translation.json` file.&#10;The icon has been changed to a job search icon, and the&#10;link points to a Google Drive document.&#10;```" />
    <MESSAGE value="chore: Replace &quot;Buy me a coffee&quot; with &quot;Hire me&quot; (main)&#10;&#10;This commit replaces the &quot;Buy me a coffee&quot; button with a&#10;&quot;Hire me&quot; button in the navbar. It also updates the&#10;corresponding translation in the `en/translation.json` file.&#10;The icon has been changed to a job search icon, and the&#10;link points to a Google Drive document." />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:" />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect" />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.&#10;```&#10;" />
    <MESSAGE value="feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys." />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following" />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  " />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.&#10;-" />
    <MESSAGE value="```&#10;feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.&#10;- Updated translation files in other languages with &quot;hireMe&quot;.&#10;```&#10;" />
    <MESSAGE value="feat: Update workspace and translation files (main)&#10;&#10;This commit includes the following changes:&#10;&#10;- Updated the workspace configuration in .idea/workspace.xml to&#10;  reflect the recent npm script execution.&#10;- Modified the English translation file (translation.json) by&#10;  reordering the &quot;navbar&quot; keys.&#10;- Updated translation files in other languages with &quot;hireMe&quot;." />
    <MESSAGE value="```" />
    <MESSAGE value="```&#10;fix(i18n): Correct &quot;hireMe&quot; translation in navbar" />
    <MESSAGE value="```&#10;fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar" />
    <MESSAGE value="```&#10;fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar across all supported languages. The order of&#10;the elements was also fixed to be consistent.&#10;```&#10;" />
    <MESSAGE value="fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar across all supported languages. The order of&#10;the elements was also fixed to be consistent." />
    <option name="LAST_COMMIT_MESSAGE" value="fix(i18n): Correct &quot;hireMe&quot; translation in navbar&#10;&#10;This commit corrects the translation of &quot;hireMe&quot; in the&#10;navigation bar across all supported languages. The order of&#10;the elements was also fixed to be consistent." />
  </component>
  <component name="VgoProject">
    <integration-enabled>false</integration-enabled>
    <settings-migrated>true</settings-migrated>
  </component>
  <component name="XSLT-Support.FileAssociations.UIState">
    <expand />
    <select />
  </component>
</project>

================================================
FILE: .prettierrc
================================================
{
  "trailingComma": "none",
  "singleQuote": true,
  "endOfLine": "auto"
}


================================================
FILE: .vitest/setup.ts
================================================
import '@testing-library/jest-dom/vitest';


================================================
FILE: .vscode/settings.json
================================================
{
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "files.associations": {
    "*.css": "tailwindcss"
  }
}


================================================
FILE: @types/i18n.d.ts
================================================
// types/i18next.d.ts
import 'i18next';
import { resources } from '../src/i18n';

declare module 'i18next' {
  interface CustomTypeOptions {
    resources: (typeof resources)['en'];
  }
}


================================================
FILE: @types/theme.d.ts
================================================
import '@mui/material/styles';

declare module '@mui/material/styles' {
  interface TypeBackground {
    hover?: string;
    lightSecondary?: string;
    darkSecondary?: string;
  }
}


================================================
FILE: CODEOWNERS
================================================
* @iib0011 @Chesterkxng


================================================
FILE: Dockerfile
================================================
FROM node:20 AS build

WORKDIR /app

COPY package.json package-lock.json ./
RUN npm install

COPY . .
RUN npm run build

FROM nginx:alpine

COPY --from=build /app/dist /usr/share/nginx/html

RUN sed -i 's/application\/javascript.*js;/application\/javascript                js mjs;/' /etc/nginx/mime.types

RUN sed -i 's|index  index.html index.htm;|index  index.html index.htm;\n        try_files $uri $uri/ /index.html;|' /etc/nginx/conf.d/default.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2024 Ibrahima Gaye Coulibaly

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

================================================
FILE: README.md
================================================
<div align="center">
        <img src="src/assets/logo.png" width="220" />
        <br /><br />
<a href="https://trendshift.io/repositories/13055" target="_blank"><img src="https://trendshift.io/api/badge/repositories/13055" alt="iib0011%2Fomni-tools | Trendshift" style="width: 200px;" width="200"/></a>
   <br /><br />
<a href="https://github.com/iib0011/omni-tools/releases">
          <img src="https://img.shields.io/badge/version-0.6.0-blue?style=for-the-badge" />
        </a>
        <a href="https://hub.docker.com/r/iib0011/omni-tools">
          <img src="https://img.shields.io/docker/pulls/iib0011/omni-tools?style=for-the-badge&logo=docker" />
        </a>
        <a href="https://github.com/iib0011">
          <img src="https://img.shields.io/github/stars/iib0011/omni-tools?style=for-the-badge&logo=github" />
        </a>
        <a href="https://github.com/iib0011/omni-tools/blob/main/LICENSE">
          <img src="https://img.shields.io/github/license/iib0011/omni-tools?style=for-the-badge" />
        </a>
        <a href="https://discord.gg/SDbbn3hT4b">
          <img src="https://img.shields.io/discord/1342971141823664179?label=Discord&style=for-the-badge" />
        </a>
        <br /><br />
</div>

Welcome to OmniTools, a self-hosted web app offering a variety of online tools to simplify everyday tasks.
Whether you are coding, manipulating images/videos, PDFs or crunching numbers, OmniTools has you covered. Please don't
forget to
star the repo to support us.
Here is the [demo](https://omnitools.app) website.

All files are processed entirely on the client side: nothing ever leaves your device.
Plus, the Docker image is super lightweight at just 28MB, making it fast to deploy and easy to self-host.

![img.png](docs-images/img.png)

## Table of Contents

- [Features](#features)
- [Self-host](#self-hostrun)
- [Contribute](#contribute)
- [Contact](#contact)
- [License](#license)

## Features

We strive to offer a variety of tools, including:

### **Image/Video/Audio Tools**

- Image Resizer
- Image Converter
- Image Editor
- Video Trimmer
- Video Reverser
- And more...

### **PDF Tools**

- PDF Splitter
- PDF Merger
- PDF Editor
- And more...

### **Text/List Tools**

- Case Converters
- List Shuffler
- Text Formatters
- And more...

### **Date and Time Tools**

- Date Calculators
- Time Zone Converters
- And more...

### **Math Tools**

- Generate Prime Numbers
- Calculate voltage, current, or resistance
- And more...

### **Data Tools**

- JSON Tools
- CSV Tools
- XML Tools
- And more...

Stay tuned as we continue to expand and improve our collection!

## Self-host/Run

### Docker

```bash
docker run -d --name omni-tools --restart unless-stopped -p 8080:80 iib0011/omni-tools:latest
```

### Docker Compose

```yaml
services:
  omni-tools:
    image: iib0011/omni-tools:latest
    container_name: omni-tools
    restart: unless-stopped
    ports:
      - "8080:80"

```

## Contribute

This is a React Project with Typescript Material UI. We use icons from [Iconify](https://icon-sets.iconify.design)

### Project setup

```bash
git clone https://github.com/iib0011/omni-tools.git
cd omni-tools
npm i
npm run dev
```

### Create a new tool

```bash
npm run script:create:tool my-tool-name folder1 # npm run script:create:tool split pdf
```

For tools located under multiple nested directories, use:

```bash
npm run script:create:tool my-tool-name folder1/folder2 # npm run script:create:tool compress image/png
```

Use `folder1\folder2` on Windows.

### Run tests

```bash
npm run test
```

- For e2e tests

```bash
npm run test:e2e
```

### i18n (Translations)
The translation files are [here](public/locales). Only edit these if you are a developer. For non developers, use [Locize](https://www.locize.app/register?invitation=YOIH0Dyz3KHh3uQFCGYe9v1QOUoq8W5ySgmlwjX9cSypeJmt8F40brDtVbXb71fK).

<img src="https://api.star-history.com/svg?repos=iib0011/omni-tools&type=Date"/>

## 🤝 Looking to contribute?

We welcome contributions! You can help by:

- Reporting bugs
- Suggesting new features in GitHub issues or [here](https://tally.so/r/nrkkx2)
- Translating in [Locize project](https://www.locize.app/register?invitation=YOIH0Dyz3KHh3uQFCGYe9v1QOUoq8W5ySgmlwjX9cSypeJmt8F40brDtVbXb71fK).
- Improving documentation
- Submitting pull requests


You can also join our [Discord server](https://discord.gg/SDbbn3hT4b)
## 🧡 Sponsors
<div align="center">
  <a href="https://www.locize.com/" target="_blank">
    <img src="docs-images/locizeSponsor.svg" alt="Locize" width="200"/>
  </a>
</div>

Thanks to [Locize](https://www.locize.com) for sponsoring OmniTools and supporting localization efforts.
They make translation management simple and developer-friendly.

## Contributors

<a href="https://github.com/iib0011/omni-tools/graphs/contributors">
  <img src="https://contrib.rocks/image?repo=iib0011/omni-tools" />
</a>

## Contact

For any questions or suggestions, feel free to open an issue or contact me at:
[ibracool99@gmail.com](mailto:ibracool99@gmail.com)

## License

This project is licensed under the MIT License. See the [LICENSE](LICENSE) file for details.


================================================
FILE: commitlint.config.js
================================================
module.exports = { extends: ['@commitlint/config-conventional'] };


================================================
FILE: index.html
================================================
<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96" />
  <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
  <link rel="shortcut icon" href="/favicon.ico" />
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png" />
  <meta name="apple-mobile-web-app-title" content="OmniTools" />
  <link rel="manifest" href="/site.webmanifest" />
  <link href="/assets/fonts/quicksand/quick-sand.css" rel="stylesheet" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>OmniTools</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/index.tsx"></script>
</body>
</html>


================================================
FILE: package.json
================================================
{
  "name": "omni-tools",
  "description": "This project offers a variety of online tools to help with everyday tasks, \nall available for free and open for community contributions",
  "version": "0.1.0",
  "private": true,
  "author": {
    "name": "Ibrahima Gaye Coulibaly",
    "email": "ibracool99@gmail.com",
    "url": "https://github.com/iib0011"
  },
  "bugs": {
    "url": "https://github.com/iib0011/omni-tools/issues",
    "email": "ibracool99@gmail.com"
  },
  "scripts": {
    "dev": "vite",
    "build": "tsc && vite build",
    "serve": "vite preview",
    "test": "vitest",
    "test:e2e": "playwright test",
    "test:ui": "vitest --ui",
    "script:create:tool": "node scripts/create-tool.mjs",
    "lint": "eslint src --max-warnings=0 --fix",
    "typecheck": "tsc --project tsconfig.json --noEmit",
    "prepare": "husky install",
    "i18n:pull": "locize download --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --path ./public/locales",
    "i18n:sync": "locize sync --project-id e7156a3e-66fb-4035-a0f0-cebf1c63a3ba --path ./public/locales --update-values true --reference-language-only false -compare-modification-time true"
  },
  "dependencies": {
    "@emotion/react": "^11.11.4",
    "@emotion/styled": "^11.11.5",
    "@ffmpeg/core": "^0.12.10",
    "@ffmpeg/ffmpeg": "^0.12.15",
    "@ffmpeg/util": "^0.12.2",
    "@imgly/background-removal": "^1.6.0",
    "@jimp/types": "^1.6.0",
    "@monaco-editor/react": "^4.7.0",
    "@mui/icons-material": "^5.15.20",
    "@mui/material": "^5.15.20",
    "@playwright/test": "^1.45.0",
    "@simplepdf/react-embed-pdf": "^1.9.0",
    "@types/ffmpeg": "^1.0.7",
    "@types/js-quantities": "^1.6.6",
    "@types/lodash": "^4.17.5",
    "@types/morsee": "^1.0.2",
    "@types/omggif": "^1.0.5",
    "@types/react-i18next": "^7.8.3",
    "browser-image-compression": "^2.0.2",
    "buffer": "^6.0.3",
    "color": "^4.2.3",
    "cron-validator": "^1.3.1",
    "cronstrue": "^3.0.0",
    "dayjs": "^1.11.13",
    "fast-xml-parser": "^5.2.5",
    "formik": "^2.4.6",
    "heic2any": "^0.0.4",
    "i18next": "^25.3.2",
    "i18next-browser-languagedetector": "^8.2.0",
    "i18next-http-backend": "^3.0.2",
    "jimp": "^0.22.12",
    "js-quantities": "^1.8.0",
    "jspdf": "^3.0.3",
    "jszip": "^3.10.1",
    "lint-staged": "^15.4.3",
    "locize": "^4.0.14",
    "lodash": "^4.17.21",
    "mime": "^4.0.6",
    "morsee": "^1.0.9",
    "nerdamer-prime": "^1.2.4",
    "notistack": "^3.0.1",
    "omggif": "^1.0.10",
    "onnxruntime-web": "1.21.0",
    "pdf-lib": "^1.17.1",
    "pdfjs-dist": "^5.2.133",
    "playwright": "^1.45.0",
    "qrcode": "^1.5.4",
    "rc-slider": "^11.1.8",
    "react": "^18.3.1",
    "react-dom": "^18.3.1",
    "react-filerobot-image-editor": "^4.9.1",
    "react-helmet": "^6.1.0",
    "react-i18next": "^15.6.0",
    "react-image-crop": "^11.0.7",
    "react-konva": "^18.2.10",
    "react-router-dom": "^6.23.1",
    "styled-components": "^6.1.19",
    "tesseract.js": "^6.0.0",
    "type-fest": "^4.35.0",
    "use-deep-compare-effect": "^1.8.1",
    "yup": "^1.4.0"
  },
  "devDependencies": {
    "@commitlint/cli": "^19.3.0",
    "@commitlint/config-conventional": "^19.2.2",
    "@iconify/react": "^5.2.0",
    "@testing-library/jest-dom": "^6.4.5",
    "@testing-library/react": "^14.3.1",
    "@types/color": "^3.0.6",
    "@types/color-rgba": "^2.1.2",
    "@types/node": "^20.12.12",
    "@types/qrcode": "^1.5.5",
    "@types/react": "^18.3.3",
    "@types/react-dom": "^18.3.0",
    "@types/react-helmet": "^6.1.11",
    "@types/trusted-types": "^1.0.6",
    "@typescript-eslint/eslint-plugin": "^6.21.0",
    "@typescript-eslint/parser": "^6.21.0",
    "@vitejs/plugin-react-swc": "^3.7.0",
    "@vitest/ui": "^1.6.0",
    "autoprefixer": "^10.4.19",
    "eslint": "^8.57.0",
    "eslint-config-prettier": "^9.1.0",
    "eslint-plugin-prettier": "^5.1.3",
    "eslint-plugin-react": "^7.34.1",
    "eslint-plugin-react-hooks": "^4.6.2",
    "eslint-plugin-tailwindcss": "^3.17.0",
    "happy-dom": "^12.10.3",
    "husky": "^9.0.11",
    "i18next-locize-backend": "^7.0.4",
    "locize-cli": "^10.1.1",
    "monaco-editor": "^0.53.0",
    "postcss": "^8.4.38",
    "prettier": "3.1.1",
    "start-server-and-test": "^2.0.4",
    "tailwindcss": "^3.4.3",
    "typescript": "^5.4.5",
    "vite": "^5.2.11",
    "vite-tsconfig-paths": "^4.3.2",
    "vitest": "^1.6.0"
  },
  "lint-staged": {
    "*.{ts,tsx,js,jsx,json}": "prettier --write"
  }
}


================================================
FILE: playwright.config.ts
================================================
import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './src',
  testMatch: /\.e2e\.(spec\.)?ts$/,
  fullyParallel: true,
  retries: 1,
  reporter: [['html', { open: 'never' }]],
  use: {
    baseURL: 'http://localhost:4173',
    trace: 'on-first-retry'
  },
  webServer: {
    command: 'npm run build && npm run serve',
    url: 'http://localhost:4173'
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] }
    },
    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] }
    },

    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] }
    }
  ]
});


================================================
FILE: postcss.config.mjs
================================================
export default {
  plugins: {
    tailwindcss: {},
    autoprefixer: {}
  }
};


================================================
FILE: public/_redirects
================================================
/*    /index.html   200


================================================
FILE: public/assets/fonts/quicksand/quick-sand.css
================================================
@font-face {
  font-family: "Quicksand";
  font-weight: 100 900;
  font-display: swap;
  font-style: normal;
  font-named-instance: "Regular";
  src: url("Quicksand-VariableFont_wght.ttf");
}

@font-face {
  font-family: "Quicksand";
  font-weight: 100 900;
  font-display: swap;
  font-style: italic;
  font-named-instance: "Italic";
  src: url("quicksand-italic.ttf");
}


================================================
FILE: public/gs.js
================================================
// This is a placeholder file for the actual Ghostscript WASM implementation
// In a real implementation, this would be the compiled Ghostscript WASM module

// You would need to download the actual Ghostscript WASM files from:
// https://github.com/ochachacha/ps2pdf-wasm or compile it yourself

// This simulates the Module loading process that would occur with the real WASM file
(function () {
  // Simulate WASM loading
  console.log('Loading Ghostscript WASM module...');

  // Expose a simulated Module to the window
  window.Module = window.Module || {};

  // Simulate filesystem
  window.FS = {
    writeFile: function (name, data) {
      console.log(`[Simulated] Writing file: ${name}`);
      return true;
    },
    readFile: function (name, options) {
      console.log(`[Simulated] Reading file: ${name}`);
      // Return a sample Uint8Array that would represent a PDF
      return new Uint8Array(10);
    }
  };

  // Mark module as initialized after a delay to simulate loading
  setTimeout(function () {
    window.Module.calledRun = true;
    console.log('Ghostscript WASM module loaded');

    // Add callMain method for direct calling
    window.Module.callMain = function (args) {
      console.log('[Simulated] Running Ghostscript with args:', args);
      // In a real implementation, this would execute the WASM module with the given arguments
    };
  }, 1000);
})();


================================================
FILE: public/locales/de/audio.json
================================================
{
  "changeSpeed": {
    "description": "Ändern Sie die Wiedergabegeschwindigkeit von Audiodateien. Beschleunigen oder verlangsamen Sie die Wiedergabe, ohne die Tonhöhe zu verändern.",
    "inputTitle": "Audioeingang",
    "newAudioSpeed": "Neue Audiogeschwindigkeit",
    "outputFormat": "Ausgabeformat",
    "resultTitle": "Bearbeitetes Audio",
    "settingSpeed": "Geschwindigkeit einstellen",
    "shortDescription": "Ändern Sie die Geschwindigkeit von Audiodateien",
    "speedDescription": "Standardmultiplikator: 2 bedeutet 2x schneller",
    "title": "Audiogeschwindigkeit ändern",
    "toolInfo": {
      "title": "Was ist {{title}}?"
    }
  },
  "extractAudio": {
    "description": "Extrahieren Sie Audiospuren aus Videodateien.",
    "extractingAudio": "Audio extrahieren",
    "inputTitle": "Eingangsvideo",
    "outputFormat": "Ausgabeformat",
    "outputFormatDescription": "Wählen Sie das Format für das zu extrahierende Audio aus.",
    "resultTitle": "Extrahiertes Audio",
    "shortDescription": "Extrahieren Sie Audio aus Videodateien (MP4, MOV usw.) in AAC, MP3 oder WAV.",
    "title": "Audio aus Video extrahieren",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie die Audiospur aus Videodateien extrahieren. Sie können zwischen verschiedenen Audioformaten wählen, darunter AAC, MP3 und WAV.",
      "title": "Was ist {{title}}?"
    }
  },
  "mergeAudio": {
    "description": "Kombinieren Sie mehrere Audiodateien zu einer einzigen Audiodatei, indem Sie sie der Reihe nach aneinanderreihen.",
    "inputTitle": "Audiodateien eingeben",
    "longDescription": "Mit diesem Tool können Sie mehrere Audiodateien in der Reihenfolge des Hochladens zu einer einzigen Datei zusammenfügen. Ideal zum Kombinieren von Podcast-Segmenten, Musiktiteln oder anderen Audiodateien. Unterstützt verschiedene Audioformate, darunter MP3, AAC und WAV.",
    "mergingAudio": "Audio zusammenführen",
    "outputFormat": "Ausgabeformat",
    "resultTitle": "Zusammengeführtes Audio",
    "shortDescription": "Mehrere Audiodateien zu einer zusammenführen (MP3, AAC, WAV).",
    "title": "Audio zusammenführen",
    "toolInfo": {
      "title": "Was ist {{title}}?"
    }
  },
  "trim": {
    "description": "Schneiden und trimmen Sie Audiodateien, um bestimmte Segmente durch Angabe von Start- und Endzeiten zu extrahieren.",
    "endTime": "Endzeit",
    "endTimeDescription": "Endzeit im Format HH:MM:SS (z. B. 00:01:30)",
    "inputTitle": "Audioeingang",
    "longDescription": "Mit diesem Tool können Sie Audiodateien durch Festlegen von Start- und Endzeiten kürzen. Sie können bestimmte Abschnitte aus längeren Audiodateien extrahieren, unerwünschte Teile entfernen oder kürzere Clips erstellen. Unterstützt verschiedene Audioformate, darunter MP3, AAC und WAV. Ideal für Podcast-Bearbeitung, Musikproduktion und alle anderen Audiobearbeitungsaufgaben.",
    "outputFormat": "Ausgabeformat",
    "resultTitle": "Getrimmtes Audio",
    "shortDescription": "Schneiden Sie Audiodateien, um bestimmte Zeitsegmente zu extrahieren (MP3, AAC, WAV).",
    "startTime": "Startzeit",
    "startTimeDescription": "Startzeit im Format HH:MM:SS (z. B. 00:00:30)",
    "timeSettings": "Zeiteinstellungen",
    "title": "Audio trimmen",
    "toolInfo": {
      "title": "Was ist {{title}}?"
    },
    "trimmingAudio": "Audio trimmen"
  }
}


================================================
FILE: public/locales/de/converters.json
================================================
{
  "audioConverter": {
    "title": "Audio-Konverter",
    "description": "Konvertieren Sie Audiodateien zwischen verschiedenen Formaten.",
    "shortDescription": "Konvertieren Sie Audiodateien in verschiedene Formate.",
    "longDescription": "Dieses Tool ermöglicht es Ihnen, Audiodateien von einem Format in ein anderes zu konvertieren und unterstützt eine breite Palette von Audioformaten für eine nahtlose Konvertierung.",
    "outputFormat": "Ausgabeformat",
    "outputFormatDescription": "Wählen Sie das gewünschte Audioausgabeformat",
    "inputTitle": "Audioeingabe",
    "outputTitle": "Konvertierte Audio"
  }
}


================================================
FILE: public/locales/de/csv.json
================================================
{
  "changeCsvSeparator": {
    "description": "Ändern Sie das Trennzeichen in CSV-Dateien. Konvertieren Sie zwischen verschiedenen CSV-Formaten wie Komma, Semikolon, Tabulator oder benutzerdefinierten Trennzeichen.",
    "shortDescription": "CSV-Dateitrennzeichen ändern",
    "title": "CSV-Trennzeichen ändern"
  },
  "csvRowsToColumns": {
    "description": "Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Es extrahiert die horizontalen Zeilen einzeln aus der CSV-Eingabedatei, dreht sie um 90 Grad und gibt sie als vertikale Spalten nacheinander, durch Kommas getrennt, aus.', longDescription: 'Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Wenn die CSV-Eingabedaten beispielsweise sechs Zeilen haben, enthält die Ausgabe sechs Spalten, und die Elemente der Zeilen werden von oben nach unten angeordnet. In einer korrekt formatierten CSV-Datei ist die Anzahl der Werte in jeder Zeile gleich. Fehlende Felder in Zeilen können vom Programm korrigiert werden. Sie haben die Wahl zwischen verschiedenen Optionen: Füllen Sie fehlende Daten mit leeren Elementen auf oder ersetzen Sie fehlende Daten durch benutzerdefinierte Elemente wie \"missing\", \"?\" oder \"x\". Während der Konvertierung bereinigt das Tool die CSV-Datei außerdem von unnötigen Informationen wie Leerzeilen (Zeilen ohne sichtbare Informationen) und Kommentaren. Damit das Tool Kommentare korrekt erkennt, können Sie in den Optionen das Symbol am Zeilenanfang angeben, mit dem ein Kommentar beginnt. Dieses Symbol ist typischerweise ein Rautezeichen (#) oder ein doppelter Schrägstrich (//). CSV-abulous!",
    "longDescription": "Dieses Tool konvertiert Zeilen einer CSV-Datei (Comma Separated Values) in Spalten. Wenn die CSV-Eingabedaten beispielsweise sechs Zeilen umfassen, enthält die Ausgabe sechs Spalten, und die Elemente der Zeilen werden von oben nach unten angeordnet. In einer korrekt formatierten CSV-Datei ist die Anzahl der Werte in jeder Zeile gleich. Sollten in Zeilen jedoch Felder fehlen, kann das Programm diese korrigieren. Sie haben die Wahl zwischen verschiedenen Optionen: Füllen Sie fehlende Daten mit leeren Elementen auf oder ersetzen Sie fehlende Daten durch benutzerdefinierte Elemente, wie z. B.",
    "shortDescription": "Konvertieren Sie CSV-Zeilen in Spalten.",
    "title": "CSV-Zeilen in Spalten konvertieren"
  },
  "csvToJson": {
    "columnSeparator": "Spaltentrennzeichen (z. B. , ; \\t)",
    "commentSymbol": "Kommentarsymbol (z. B. #)",
    "conversionOptions": "Konvertierungsoptionen",
    "description": "Konvertieren Sie CSV-Dateien in das JSON-Format mit anpassbaren Optionen für Trennzeichen, Anführungszeichen und Ausgabeformatierung. Unterstützt werden Header, Kommentare und dynamische Typkonvertierung.",
    "dynamicTypes": "Dynamische Typen",
    "dynamicTypesDescription": "Automatische Konvertierung von Zahlen und Booleschen Werten",
    "error": "Fehler",
    "errorParsing": "Fehler beim Parsen der CSV-Datei: {{error}}",
    "fieldQuote": "Feld Zitat (z. B. \")",
    "inputCsvFormat": "Eingabe-CSV-Format",
    "inputTitle": "Eingabe-CSV",
    "invalidCsvFormat": "Ungültiges CSV-Format",
    "resultTitle": "JSON-Ausgabe",
    "shortDescription": "Konvertieren Sie CSV-Daten in das JSON-Format.",
    "skipEmptyLines": "Leere Zeilen überspringen",
    "skipEmptyLinesDescription": "Leere Zeilen in der CSV-Eingabe ignorieren",
    "title": "Konvertieren Sie CSV in JSON",
    "toolInfo": {
      "description": "Dieses Tool konvertiert CSV-Dateien (Comma Separated Values) in JSON-Datenstrukturen (JavaScript Object Notation). Es unterstützt verschiedene CSV-Formate mit anpassbaren Trennzeichen, Anführungszeichen und Kommentarsymbolen. Der Konverter kann die erste Zeile als Überschrift behandeln, Leerzeilen überspringen und Datentypen wie Zahlen und Boolesche Werte automatisch erkennen. Das resultierende JSON kann für Datenmigration, Backups oder als Eingabe für andere Anwendungen verwendet werden.",
      "title": "Was ist ein CSV-zu-JSON-Konverter?"
    },
    "useHeaders": "Verwenden Sie Überschriften",
    "useHeadersDescription": "Behandeln Sie die erste Zeile als Spaltenüberschrift"
  },
  "csvToTsv": {
    "description": "Laden Sie Ihre CSV-Datei im untenstehenden Formular hoch. Sie wird automatisch in eine TSV-Datei konvertiert. In den Tool-Optionen können Sie das CSV-Eingabeformat anpassen – Feldtrennzeichen, Anführungszeichen und Kommentarsymbol festlegen, leere CSV-Zeilen überspringen und festlegen, ob CSV-Spaltenüberschriften beibehalten werden sollen.",
    "longDescription": "Dieses Tool wandelt CSV-Daten (Comma Separated Values) in TSV-Daten (Tab Separated Values) um. Sowohl CSV als auch TSV sind gängige Dateiformate zur Speicherung tabellarischer Daten, verwenden jedoch unterschiedliche Trennzeichen zur Trennung der Werte – CSV verwendet Kommas (",
    "shortDescription": "Konvertieren Sie CSV-Daten in das TSV-Format.",
    "title": "Konvertieren Sie CSV in TSV"
  },
  "csvToXml": {
    "description": "Konvertieren Sie CSV-Dateien mit anpassbaren Optionen in das XML-Format.",
    "shortDescription": "Konvertieren Sie CSV-Daten in das XML-Format.",
    "title": "Konvertieren Sie CSV in XML"
  },
  "csvToYaml": {
    "description": "Laden Sie Ihre CSV-Datei einfach im untenstehenden Formular hoch. Sie wird dann automatisch in eine YAML-Datei konvertiert. In den Tool-Optionen können Sie Feldtrennzeichen, Anführungszeichen und Kommentarzeichen festlegen, um das Tool an benutzerdefinierte CSV-Formate anzupassen. Zusätzlich können Sie das YAML-Ausgabeformat auswählen: eines, das CSV-Header beibehält, oder eines, das CSV-Header ausschließt.",
    "longDescription": "Dieses Tool wandelt CSV-Daten (Comma Separated Values) in YAML-Daten (Yet Another Markup Language) um. CSV ist ein einfaches, tabellarisches Format zur Darstellung matrixartiger Datentypen mit Zeilen und Spalten. YAML hingegen ist ein erweitertes Format (eigentlich eine Obermenge von JSON), das besser lesbare Daten für die Serialisierung erzeugt und Listen, Wörterbücher und verschachtelte Objekte unterstützt. Das Programm unterstützt verschiedene CSV-Eingabeformate – die Eingabedaten können durch Kommas (Standard), Semikolons, Pipes oder ein anderes Trennzeichen getrennt sein. Sie können das genaue Trennzeichen Ihrer Daten in den Optionen festlegen. Ebenso können Sie in den Optionen das Anführungszeichen festlegen, das zum Umschließen von CSV-Feldern verwendet wird (standardmäßig ein doppeltes Anführungszeichen). Sie können auch Zeilen überspringen, die mit Kommentaren beginnen, indem Sie die Kommentarsymbole in den Optionen angeben. So halten Sie Ihre Daten übersichtlich, indem Sie unnötige Zeilen überspringen. Es gibt zwei Möglichkeiten, CSV in YAML zu konvertieren. Die erste Methode konvertiert jede CSV-Zeile in eine YAML-Liste. Die zweite Methode extrahiert Header aus der ersten CSV-Zeile und erstellt YAML-Objekte mit Schlüsseln basierend auf diesen Headern. Sie können das YAML-Ausgabeformat auch anpassen, indem Sie die Anzahl der Leerzeichen für die Einrückung von YAML-Strukturen angeben. Wenn Sie die umgekehrte Konvertierung durchführen, d. h. YAML in CSV umwandeln möchten, können Sie unser Tool „YAML in CSV konvertieren“ verwenden. CSV-genial!",
    "shortDescription": "Konvertieren Sie schnell eine CSV-Datei in eine YAML-Datei.",
    "title": "Konvertieren Sie CSV in YAML"
  },
  "findIncompleteCsvRecords": {
    "checkingOptions": "Optionen prüfen",
    "commentCharacterDescription": "Geben Sie das Zeichen ein, das den Beginn einer Kommentarzeile kennzeichnet. Zeilen, die mit diesem Symbol beginnen, werden übersprungen.",
    "csvInputOptions": "CSV-Eingabeoptionen",
    "csvSeparatorDescription": "Geben Sie das Zeichen ein, das zum Trennen von Spalten in der CSV-Eingabedatei verwendet wird.",
    "deleteLinesWithNoData": "Zeilen ohne Daten löschen",
    "deleteLinesWithNoDataDescription": "Entfernen Sie leere Zeilen aus der CSV-Eingabedatei.",
    "description": "Laden Sie einfach Ihre CSV-Datei im untenstehenden Formular hoch. Das Tool prüft automatisch, ob in Zeilen und Spalten Werte fehlen. In den Tool-Optionen können Sie das Eingabedateiformat anpassen (Trennzeichen, Anführungszeichen und Kommentarzeichen festlegen). Zusätzlich können Sie die Prüfung auf leere Werte aktivieren, leere Zeilen überspringen und die Anzahl der Fehlermeldungen in der Ausgabe begrenzen.",
    "findEmptyValues": "Leere Werte finden",
    "findEmptyValuesDescription": "Zeigt eine Meldung zu leeren CSV-Feldern an (das sind keine fehlenden Felder, sondern Felder, die nichts enthalten).",
    "inputTitle": "Eingabe-CSV",
    "limitNumberOfMessages": "Anzahl der Nachrichten begrenzen",
    "messageLimitDescription": "Legen Sie die Begrenzung der Anzahl der Nachrichten in der Ausgabe fest.",
    "quoteCharacterDescription": "Geben Sie das Anführungszeichen ein, das zum Zitieren der CSV-Eingabefelder verwendet wird.",
    "resultTitle": "CSV-Status",
    "shortDescription": "Finden Sie schnell Zeilen und Spalten in CSV, in denen Werte fehlen.",
    "title": "Unvollständige CSV-Datensätze finden",
    "toolInfo": {
      "title": "Was ist ein {{title}}?"
    }
  },
  "insertCsvColumns": {
    "appendColumns": "Spalten anhängen",
    "commentCharacterDescription": "Geben Sie das Zeichen ein, das den Beginn einer Kommentarzeile kennzeichnet. Zeilen, die mit diesem Symbol beginnen, werden übersprungen.",
    "csvOptions": "CSV-Optionen",
    "csvSeparator": "CSV-Trennzeichen",
    "csvToInsert": "CSV zum Einfügen",
    "csvToInsertDescription": "Geben Sie eine oder mehrere Spalten ein, die Sie in die CSV-Datei einfügen möchten. Das Zeichen zur Spaltentrennung muss mit dem Zeichen in der CSV-Eingabedatei übereinstimmen. Hinweis: Leere Zeilen werden ignoriert.",
    "customFillDescription": "Wenn die CSV-Eingabedatei unvollständig ist (fehlende Werte), fügen Sie den Datensätzen dann leere Felder oder benutzerdefinierte Symbole hinzu, um eine wohlgeformte CSV-Datei zu erstellen?",
    "customFillValueDescription": "Verwenden Sie diesen benutzerdefinierten Wert, um fehlende Felder auszufüllen. (Funktioniert nur mit dem oben beschriebenen Modus „Benutzerdefinierte Werte“).",
    "customPosition": "Benutzerdefinierte Position",
    "customPositionOptionsDescription": "Wählen Sie die Methode zum Einfügen der Spalten in die CSV-Datei.",
    "description": "Fügen Sie den CSV-Daten an angegebenen Positionen neue Spalten hinzu.",
    "fillWithCustomValues": "Mit Zollwerten füllen",
    "fillWithEmptyValues": "Mit leeren Werten füllen",
    "headerName": "Kopfzeilenname",
    "headerNameDescription": "Überschrift der Spalte, nach der Sie Spalten einfügen möchten.",
    "inputTitle": "Eingabe-CSV",
    "insertingPositionDescription": "Geben Sie an, wo die Spalten in der CSV-Datei eingefügt werden sollen.",
    "position": "Position",
    "positionOptions": "Positionsoptionen",
    "prependColumns": "Spalten voranstellen",
    "quoteCharDescription": "Geben Sie das Anführungszeichen ein, das zum Zitieren der CSV-Eingabefelder verwendet wird.",
    "resultTitle": "Ausgabe-CSV",
    "rowNumberDescription": "Nummer der Spalte, nach der Sie Spalten einfügen möchten.",
    "separatorDescription": "Geben Sie das Zeichen ein, das zum Trennen von Spalten in der CSV-Eingabedatei verwendet wird.",
    "shortDescription": "Fügen Sie schnell eine oder mehrere neue Spalten an beliebiger Stelle in einer CSV-Datei ein.",
    "title": "CSV-Spalten einfügen",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie neue Spalten an bestimmten Positionen in CSV-Daten einfügen. Sie können Spalten basierend auf Überschriftennamen oder Spaltennummern an benutzerdefinierten Positionen voranstellen, anhängen oder einfügen.",
      "title": "CSV-Spalten einfügen"
    }
  },
  "swapCsvColumns": {
    "description": "Laden Sie einfach Ihre CSV-Datei im untenstehenden Formular hoch und geben Sie die zu tauschenden Spalten an. Das Tool ändert dann automatisch die Positionen der angegebenen Spalten in der Ausgabedatei. In den Tool-Optionen können Sie die zu tauschenden Spaltenpositionen oder -namen angeben, unvollständige Daten korrigieren und optional leere und auskommentierte Datensätze entfernen.",
    "longDescription": "Dieses Tool reorganisiert CSV-Daten, indem es die Positionen der Spalten tauscht. Das Tauschen von Spalten verbessert die Lesbarkeit einer CSV-Datei, indem häufig verwendete Daten zusammen oder nach vorne platziert werden, um den Vergleich und die Bearbeitung zu erleichtern. Sie können beispielsweise die erste Spalte mit der letzten oder die zweite Spalte mit der dritten tauschen. Um Spalten basierend auf ihren Positionen zu tauschen, wählen Sie das",
    "shortDescription": "CSV-Spalten neu anordnen.",
    "title": "CSV-Spalten austauschen"
  },
  "transposeCsv": {
    "description": "Laden Sie einfach Ihre CSV-Datei in das untenstehende Formular hoch. Das Tool transponiert Ihre CSV-Datei automatisch. In den Tool-Optionen können Sie das Zeichen angeben, mit dem die Kommentarzeilen in der CSV-Datei beginnen, um diese zu entfernen. Falls die CSV-Datei unvollständig ist (fehlende Werte), können Sie fehlende Werte durch ein Leerzeichen oder ein benutzerdefiniertes Zeichen ersetzen.",
    "longDescription": "Dieses Tool transponiert Komma-getrennte Werte (CSV). Es behandelt die CSV-Datei wie eine Datenmatrix und spiegelt alle Elemente entlang der Hauptdiagonale. Die Ausgabe enthält dieselben CSV-Daten wie die Eingabe, wobei nun alle Zeilen zu Spalten und alle Spalten zu Zeilen werden. Nach der Transposition weist die CSV-Datei entgegengesetzte Dimensionen auf. Wenn die Eingabedatei beispielsweise 4 Spalten und 3 Zeilen enthält, enthält die Ausgabedatei 3 Spalten und 4 Zeilen. Während der Konvertierung bereinigt das Programm die Daten außerdem von unnötigen Zeilen und korrigiert unvollständige Daten. Insbesondere löscht das Tool automatisch alle leeren Datensätze und Kommentare, die mit einem bestimmten Zeichen beginnen, das Sie in den Optionen festlegen können. Sollten die CSV-Daten beschädigt oder verloren gehen, ergänzt das Dienstprogramm die Datei zusätzlich mit leeren Feldern oder benutzerdefinierten Feldern, die Sie in den Optionen festlegen können. CSV-unverständlich!",
    "shortDescription": "Transponieren Sie schnell eine CSV-Datei.",
    "title": "CSV transponieren"
  },
  "tsvToJson": {
    "description": "Konvertieren Sie TSV-Daten (Tab-Separated Values) in das JSON-Format. Transformieren Sie tabellarische Daten in strukturierte JSON-Objekte.",
    "shortDescription": "Konvertieren Sie TSV in das JSON-Format",
    "title": "TSV zu JSON"
  }
}


================================================
FILE: public/locales/de/image.json
================================================
{
  "changeColors": {
    "description": "Welt",
    "shortDescription": "Schnelles Austauschen der Farben in einem Bild",
    "title": "Farben im Bild ändern"
  },
  "changeOpacity": {
    "description": "Passen Sie die Transparenz Ihrer Bilder ganz einfach an. Laden Sie einfach Ihr Bild hoch, stellen Sie mit dem Schieberegler die gewünschte Deckkraft zwischen 0 (vollständig transparent) und 1 (vollständig undurchsichtig) ein und laden Sie das geänderte Bild herunter.",
    "shortDescription": "Transparenz von Bildern anpassen",
    "title": "Bilddeckkraft ändern"
  },
  "compress": {
    "compressedSize": "Komprimierte Größe",
    "compressionOptions": "Komprimierungsoptionen",
    "description": "Reduzieren Sie die Bilddateigröße, ohne die Qualität zu beeinträchtigen.",
    "failedToCompress": "Das Komprimieren des Bilds ist fehlgeschlagen. Bitte versuchen Sie es erneut.",
    "fileSizes": "Dateigrößen",
    "inputTitle": "Eingabebild",
    "maxFileSizeDescription": "Maximale Dateigröße in Megabyte",
    "originalSize": "Originalgröße",
    "qualityDescription": "Bildqualität in Prozent (niedriger bedeutet kleinere Dateigröße)",
    "resultTitle": "Komprimiertes Bild",
    "shortDescription": "Komprimieren Sie Bilder, um die Dateigröße zu reduzieren und gleichzeitig eine angemessene Qualität beizubehalten.",
    "title": "Bild komprimieren"
  },
  "compressPng": {
    "description": "Dies ist ein Programm zum Komprimieren von PNG-Bildern. Sobald Sie Ihr PNG-Bild in den Eingabebereich einfügen, komprimiert das Programm es und zeigt das Ergebnis im Ausgabebereich an. In den Optionen können Sie den Komprimierungsgrad anpassen und die alte und neue Bilddateigröße einsehen.",
    "shortDescription": "PNG schnell komprimieren",
    "title": "PNG komprimieren"
  },
  "convertJgpToPng": {
    "description": "Konvertieren Sie Ihre JPG-Bilder schnell in PNG. Importieren Sie einfach Ihr PNG-Bild im Editor links",
    "shortDescription": "Konvertieren Sie Ihre JPG-Bilder schnell in PNG",
    "title": "Konvertieren Sie JPG in PNG"
  },
  "convertToJpg": {
    "description": "Konvertieren Sie verschiedene Bildformate (PNG, GIF, TIF, PSD, SVG, WEBP, HEIC, RAW) in JPG mit anpassbaren Qualitäts- und Hintergrundfarbeinstellungen.",
    "shortDescription": "Konvertieren Sie Bilder mit Qualitätskontrolle in JPG",
    "title": "Bilder in JPG konvertieren"
  },
  "createTransparent": {
    "description": "Welt",
    "shortDescription": "Machen Sie ein Bild schnell transparent",
    "title": "Transparentes PNG erstellen"
  },
  "crop": {
    "description": "Schneiden Sie Bilder zu, um unerwünschte Bereiche zu entfernen.",
    "inputTitle": "Eingabebild",
    "resultTitle": "Zugeschnittenes Bild",
    "shortDescription": "Bilder schnell zuschneiden.",
    "title": "Bild zuschneiden"
  },
  "editor": {
    "description": "Erweiterter Bildeditor mit Werkzeugen zum Zuschneiden, Drehen, Kommentieren, Anpassen von Farben und Hinzufügen von Wasserzeichen. Bearbeiten Sie Ihre Bilder mit professionellen Werkzeugen direkt in Ihrem Browser.",
    "shortDescription": "Bearbeiten Sie Bilder mit erweiterten Tools und Funktionen",
    "title": "Bildeditor"
  },
  "imageToText": {
    "description": "Extrahieren Sie Text aus Bildern (JPG, PNG) mithilfe der optischen Zeichenerkennung (OCR).",
    "shortDescription": "Extrahieren Sie mithilfe von OCR Text aus Bildern.",
    "title": "Bild zu Text (OCR)"
  },
  "qrCode": {
    "description": "Generieren Sie QR-Codes für verschiedene Datentypen: URL, Text, E-Mail, Telefon, SMS, WLAN, vCard und mehr.",
    "shortDescription": "Erstellen Sie individuelle QR-Codes für verschiedene Datenformate.",
    "title": "QR-Code-Generator"
  },
  "removeBackground": {
    "description": "Welt",
    "shortDescription": "Hintergründe automatisch aus Bildern entfernen",
    "title": "Hintergrund aus Bild entfernen"
  },
  "resize": {
    "description": "Passen Sie die Größe von Bildern an andere Abmessungen an.",
    "dimensionType": "Dimensionstyp",
    "heightDescription": "Höhe (in Pixeln)",
    "inputTitle": "Eingabebild",
    "maintainAspectRatio": "Seitenverhältnis beibehalten",
    "maintainAspectRatioDescription": "Behalten Sie das ursprüngliche Seitenverhältnis des Bildes bei.",
    "percentage": "Prozentsatz",
    "percentageDescription": "Prozentsatz der Originalgröße (z. B. 50 für halbe Größe, 200 für doppelte Größe)",
    "resizeByPercentage": "Größe um Prozent ändern",
    "resizeByPercentageDescription": "Ändern Sie die Größe, indem Sie einen Prozentsatz der Originalgröße angeben.",
    "resizeByPixels": "Größe in Pixeln ändern",
    "resizeByPixelsDescription": "Ändern Sie die Größe, indem Sie die Abmessungen in Pixeln angeben.",
    "resizeMethod": "Größenänderungsmethode",
    "resultTitle": "Bildgröße geändert",
    "setHeight": "Höhe festlegen",
    "setHeightDescription": "Geben Sie die Höhe in Pixeln an und berechnen Sie die Breite basierend auf dem Seitenverhältnis.",
    "setWidth": "Breite festlegen",
    "setWidthDescription": "Geben Sie die Breite in Pixeln an und berechnen Sie die Höhe basierend auf dem Seitenverhältnis.",
    "shortDescription": "Ändern Sie die Größe von Bildern ganz einfach.",
    "title": "Bildgröße ändern",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie die Größe von JPG-, PNG-, SVG- und GIF-Bildern ändern. Sie können die Größe ändern, indem Sie die Abmessungen in Pixeln oder Prozent angeben und das ursprüngliche Seitenverhältnis beibehalten.",
      "title": "Bildgröße ändern"
    },
    "widthDescription": "Breite (in Pixeln)"
  },
  "rotate": {
    "description": "Drehen Sie ein Bild um einen bestimmten Winkel.",
    "shortDescription": "Drehen Sie ein Bild ganz einfach.",
    "title": "Bild drehen"
  }
}


================================================
FILE: public/locales/de/json.json
================================================
{
  "comparison": {
    "description": "Vergleichen Sie zwei JSON-Objekte, um Unterschiede in Struktur und Werten zu erkennen.",
    "shortDescription": "Unterschiede zwischen zwei JSON-Objekten finden",
    "title": "JSON vergleichen"
  },
  "escapeJson": {
    "description": "Escapen Sie Sonderzeichen in JSON-Strings. Konvertieren Sie JSON-Daten in ein korrekt maskiertes Format für eine sichere Übertragung oder Speicherung.",
    "shortDescription": "Escape-Sonderzeichen in JSON",
    "title": "Escape-JSON"
  },
  "jsonToXml": {
    "description": "Konvertieren Sie JSON-Daten in das XML-Format. Transformieren Sie strukturierte JSON-Objekte in wohlgeformte XML-Dokumente.",
    "shortDescription": "Konvertieren Sie JSON in das XML-Format",
    "title": "JSON zu XML"
  },
  "minify": {
    "description": "Entfernen Sie alle unnötigen Leerzeichen aus JSON.",
    "inputTitle": "JSON-Eingabe",
    "resultTitle": "Minimiertes JSON",
    "shortDescription": "Minimieren Sie JSON durch Entfernen von Leerzeichen",
    "title": "JSON minimieren",
    "toolInfo": {
      "description": "Bei der JSON-Minimierung werden alle unnötigen Leerzeichen aus JSON-Daten entfernt, ohne dass deren Gültigkeit verloren geht. Dazu gehören Leerzeichen, Zeilenumbrüche und Einrückungen, die für die korrekte JSON-Analyse nicht erforderlich sind. Durch die Minimierung wird die Größe von JSON-Daten reduziert, wodurch die Speicherung und Übertragung effizienter wird, während die Datenstruktur und die Werte unverändert bleiben.",
      "title": "Was ist JSON-Minimierung?"
    }
  },
  "prettify": {
    "description": "Formatieren Sie JSON mit den richtigen Einrückungen und Abständen.",
    "indentation": "Vertiefung",
    "inputTitle": "JSON-Eingabe",
    "resultTitle": "Verschönertes JSON",
    "shortDescription": "Formatieren und Verschönern von JSON-Code",
    "title": "JSON verschönern",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie JSON-Daten mit den richtigen Einrückungen und Abständen formatieren, sodass sie besser lesbar und einfacher zu bearbeiten sind.",
      "title": "JSON verschönern"
    },
    "useSpaces": "Räume verwenden",
    "useSpacesDescription": "Ausgabe mit Leerzeichen einrücken",
    "useTabs": "Verwenden von Registerkarten",
    "useTabsDescription": "Einrücken der Ausgabe mit Tabulatoren."
  },
  "stringify": {
    "description": "Konvertieren Sie JavaScript-Objekte in das JSON-String-Format. Serialisieren Sie Datenstrukturen zur Speicherung oder Übertragung in JSON-Strings.",
    "shortDescription": "Konvertieren Sie Objekte in JSON-Zeichenfolgen",
    "title": "Stringify JSON"
  },
  "validateJson": {
    "description": "Überprüfen Sie, ob JSON gültig und wohlgeformt ist.",
    "inputTitle": "JSON-Eingabe",
    "invalidJson": "❌ {{error}}",
    "resultTitle": "Validierungsergebnis",
    "shortDescription": "JSON-Code auf Fehler überprüfen",
    "title": "JSON validieren",
    "toolInfo": {
      "description": "JSON (JavaScript Object Notation) ist ein einfaches Datenaustauschformat. Die JSON-Validierung stellt sicher, dass die Datenstruktur dem JSON-Standard entspricht. Ein gültiges JSON-Objekt muss Folgendes enthalten: – Eigenschaftsnamen in doppelten Anführungszeichen. – Ausgewogene geschweifte Klammern {}. – Keine abschließenden Kommas nach dem letzten Schlüssel-Wert-Paar. – Korrekte Verschachtelung von Objekten und Arrays. Dieses Tool prüft das eingegebene JSON und gibt Feedback, um häufige Fehler zu identifizieren und zu beheben.",
      "title": "Was ist JSON-Validierung?"
    },
    "validJson": "✅ Gültiges JSON"
  }
}


================================================
FILE: public/locales/de/list.json
================================================
{
  "duplicate": {
    "concatenate": "Verketten",
    "concatenateDescription": "Kopien verketten (wenn nicht aktiviert, werden die Elemente miteinander verwoben)",
    "copyDescription": "Anzahl der Kopien (kann Bruchteile sein)",
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Duplizieren von Listeneinträgen. Geben Sie Ihre Liste ein und legen Sie die Duplizierungskriterien fest, um Kopien von Einträgen zu erstellen. Ideal für Datenerweiterungen, Tests oder die Erstellung wiederkehrender Muster.",
    "duplicationOptions": "Duplizierungsoptionen",
    "error": "Fehler",
    "example1Description": "Dieses Beispiel zeigt, wie eine Liste von Wörtern dupliziert wird.",
    "example1Title": "Einfache Vervielfältigung",
    "example2Description": "Dieses Beispiel zeigt, wie eine Liste in umgekehrter Reihenfolge dupliziert wird.",
    "example2Title": "Rückwärtsduplizierung",
    "example3Description": "Dieses Beispiel zeigt, wie Elemente miteinander verwoben werden, anstatt sie zu verketten.",
    "example3Title": "Verweben von Gegenständen",
    "example4Description": "Dieses Beispiel zeigt, wie eine Liste mit einer Bruchzahl von Kopien dupliziert wird.",
    "example4Title": "Bruchduplizierung",
    "examples": {
      "fractional": {
        "description": "Dieses Beispiel zeigt, wie eine Liste mit einer Bruchzahl von Kopien dupliziert wird.",
        "title": "Bruchduplizierung"
      },
      "interweave": {
        "description": "Dieses Beispiel zeigt, wie Elemente miteinander verwoben werden, anstatt sie zu verketten.",
        "title": "Verweben von Gegenständen"
      },
      "reverse": {
        "description": "Dieses Beispiel zeigt, wie eine Liste in umgekehrter Reihenfolge dupliziert wird.",
        "title": "Rückwärtsduplizierung"
      },
      "simple": {
        "description": "Dieses Beispiel zeigt, wie eine Liste von Wörtern dupliziert wird.",
        "title": "Einfache Vervielfältigung"
      }
    },
    "inputTitle": "Eingabeliste",
    "joinSeparatorDescription": "Trennzeichen zum Verbinden der duplizierten Liste",
    "resultTitle": "Duplizierte Liste",
    "reverse": "Umkehren",
    "reverseDescription": "Umkehren der duplizierten Elemente",
    "shortDescription": "Doppelte Listenelemente mit angegebenen Kriterien",
    "splitByRegex": "Aufteilen nach regulärem Ausdruck",
    "splitBySymbol": "Nach Symbol teilen",
    "splitOptions": "Teilungsoptionen",
    "splitSeparatorDescription": "Trennzeichen zum Teilen der Liste",
    "title": "Duplikat",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie Elemente einer Liste duplizieren. Sie können die Anzahl der Kopien (einschließlich Bruchzahlen) festlegen, steuern, ob Elemente verknüpft oder verwoben werden, und sogar die Duplikate umkehren. Es ist nützlich, um wiederkehrende Muster zu erstellen, Testdaten zu generieren oder Listen mit vorhersehbarem Inhalt zu erweitern.",
      "title": "Listenduplizierung"
    },
    "unknownError": "Ein unbekannter Fehler ist aufgetreten",
    "validation": {
      "copyMustBeNumber": "Die Anzahl der Kopien muss eine Zahl sein",
      "copyMustBePositive": "Die Anzahl der Kopien muss positiv sein",
      "copyRequired": "Anzahl der Kopien ist erforderlich",
      "joinSeparatorRequired": "Der Join-Separator ist erforderlich",
      "separatorRequired": "Das Trennzeichen ist erforderlich"
    }
  },
  "findMostPopular": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Auffinden der beliebtesten Elemente in einer Liste. Geben Sie Ihre Liste ein und erhalten Sie sofort die am häufigsten vorkommenden Elemente. Ideal für Datenanalysen, Trenderkennung oder die Suche nach gemeinsamen Elementen.",
    "displayFormatDescription": "Wie werden die beliebtesten Listenelemente angezeigt?",
    "displayOptions": {
      "count": "Anzahl der Elemente anzeigen",
      "percentage": "Artikelprozentsatz anzeigen",
      "total": "Artikelsumme anzeigen"
    },
    "extractListItems": "Wie extrahiere ich Listenelemente?",
    "ignoreItemCase": "Groß-/Kleinschreibung ignorieren",
    "ignoreItemCaseDescription": "Vergleichen Sie alle Listenelemente in Kleinbuchstaben.",
    "inputTitle": "Eingabeliste",
    "itemComparison": "Artikelvergleich",
    "outputFormat": "Ausgabeformat für Top-Elemente",
    "removeEmptyItems": "Leere Elemente entfernen",
    "removeEmptyItemsDescription": "Leere Elemente beim Vergleich ignorieren.",
    "resultTitle": "Die beliebtesten Artikel",
    "shortDescription": "Am häufigsten vorkommende Elemente finden",
    "sortOptions": {
      "alphabetic": "Alphabetisch sortieren",
      "count": "Nach Anzahl sortieren"
    },
    "sortingMethodDescription": "Wählen Sie eine Sortiermethode aus.",
    "splitOperators": {
      "regex": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
        "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
      },
      "symbol": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste durch ein Zeichen.",
        "title": "Verwenden Sie ein Symbol zum Teilen"
      }
    },
    "splitSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "title": "Finden Sie die beliebtesten",
    "trimItems": "Top-Listenelemente kürzen",
    "trimItemsDescription": "Entfernen Sie führende und nachfolgende Leerzeichen, bevor Sie Elemente vergleichen"
  },
  "findUnique": {
    "caseSensitiveItems": "Groß- und Kleinschreibung beachten",
    "caseSensitiveItemsDescription": "Geben Sie Elemente mit unterschiedlicher Groß-/Kleinschreibung als eindeutige Elemente in der Liste aus.",
    "delimiterDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Auffinden eindeutiger Elemente in einer Liste. Geben Sie Ihre Liste ein und erhalten Sie sofort alle eindeutigen Werte, ohne Duplikate. Ideal für Datenbereinigung, Deduplizierung oder das Auffinden eindeutiger Elemente.",
    "findAbsolutelyUniqueItems": "Finden Sie absolut einzigartige Artikel",
    "findAbsolutelyUniqueItemsDescription": "Zeigen Sie nur die Elemente der Liste an, die in einer einzigen Kopie vorhanden sind.",
    "inputListDelimiter": "Eingabelisten-Trennzeichen",
    "inputTitle": "Eingabeliste",
    "outputListDelimiter": "Ausgabelisten-Trennzeichen",
    "resultTitle": "Einzigartige Gegenstände",
    "shortDescription": "Suchen Sie nach eindeutigen Elementen in einer Liste",
    "skipEmptyItems": "Leere Elemente überspringen",
    "skipEmptyItemsDescription": "Schließen Sie die leeren Listenelemente nicht in die Ausgabe ein.",
    "title": "Finden Sie einzigartige",
    "trimItems": "Listenelemente kürzen",
    "trimItemsDescription": "Entfernen Sie vor dem Vergleichen von Elementen führende und nachfolgende Leerzeichen.",
    "uniqueItemOptions": "Einzigartige Artikeloptionen"
  },
  "group": {
    "deleteEmptyItems": "Leere Elemente löschen",
    "deleteEmptyItemsDescription": "Ignorieren Sie leere Elemente und nehmen Sie sie nicht in die Gruppen auf.",
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Gruppieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie Gruppierungskriterien fest, um Elemente in logische Gruppen zu ordnen. Ideal zum Kategorisieren von Daten, Organisieren von Informationen oder Erstellen strukturierter Listen. Unterstützt benutzerdefinierte Trennzeichen und verschiedene Gruppierungsoptionen.",
    "emptyItemsAndPadding": "Leere Elemente und Polsterung",
    "groupNumberDescription": "Anzahl der Elemente in einer Gruppe",
    "groupSeparatorDescription": "Gruppentrennzeichen",
    "groupSizeAndSeparators": "Gruppengröße und Trennzeichen",
    "inputItemSeparator": "Eingabeelement-Trennzeichen",
    "inputTitle": "Eingabeliste",
    "itemSeparatorDescription": "Elementtrennzeichen",
    "leftWrapDescription": "Linkes Umbruchsymbol der Gruppe.",
    "padNonFullGroups": "Nicht volle Gruppen auffüllen",
    "padNonFullGroupsDescription": "Füllen Sie nicht volle Gruppen mit einem benutzerdefinierten Element (unten eingeben).",
    "paddingCharDescription": "Verwenden Sie dieses Zeichen oder Element, um nicht volle Gruppen aufzufüllen.",
    "resultTitle": "Gruppierte Elemente",
    "rightWrapDescription": "Rechtes Umbruchsymbol der Gruppe.",
    "shortDescription": "Gruppieren Sie Listenelemente nach gemeinsamen Eigenschaften",
    "splitOperators": {
      "regex": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
        "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
      },
      "symbol": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste durch ein Zeichen.",
        "title": "Verwenden Sie ein Symbol zum Teilen"
      }
    },
    "splitSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "title": "Gruppe"
  },
  "reverse": {
    "description": "Diese einfache browserbasierte Anwendung druckt alle Listenelemente rückwärts. Die Eingabeelemente können durch ein beliebiges Symbol getrennt werden. Sie können auch das Trennzeichen der umgekehrten Listenelemente ändern.",
    "inputTitle": "Eingabeliste",
    "itemSeparator": "Elementtrennzeichen",
    "itemSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "outputListOptions": "Ausgabelistenoptionen",
    "outputSeparatorDescription": "Trennzeichen für Ausgabelistenelemente.",
    "resultTitle": "Umgekehrte Liste",
    "shortDescription": "Schnelles Umkehren einer Liste",
    "splitOperators": {
      "regex": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
        "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
      },
      "symbol": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste durch ein Zeichen.",
        "title": "Verwenden Sie ein Symbol zum Teilen"
      }
    },
    "splitterMode": "Splitter-Modus",
    "title": "Umkehren",
    "toolInfo": {
      "description": "Mit diesem Dienstprogramm können Sie die Reihenfolge der Elemente in einer Liste umkehren. Das Dienstprogramm zerlegt die Eingabeliste zunächst in einzelne Elemente und durchläuft diese dann vom letzten bis zum ersten Element. Dabei wird jedes Element ausgegeben. Die Eingabeliste kann alles enthalten, was sich als Text darstellen lässt, z. B. Ziffern, Zahlen, Zeichenfolgen, Wörter, Sätze usw. Das Trennzeichen für die Eingabeelemente kann auch ein regulärer Ausdruck sein. Beispielsweise ermöglicht der reguläre Ausdruck /[;,]/ die Verwendung von Elementen, die entweder durch Kommas oder Semikolons getrennt sind. Die Trennzeichen für die Elemente der Eingabe- und Ausgabeliste können in den Optionen angepasst werden. Standardmäßig sind sowohl die Eingabe- als auch die Ausgabelisten durch Kommas getrennt. Listabulous!",
      "title": "Was ist ein Listenumkehrer?"
    }
  },
  "rotate": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Rotieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie den Rotationsgrad fest, um die Elemente um eine bestimmte Anzahl von Positionen zu verschieben. Ideal für Datenmanipulation, zyklische Verschiebungen oder das Neuordnen von Listen.",
    "shortDescription": "Listenelemente um angegebene Positionen rotieren",
    "title": "Drehen"
  },
  "shuffle": {
    "delimiterDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Mischen von Listenelementen. Geben Sie Ihre Liste ein und erhalten Sie sofort eine zufällige Version mit Elementen in zufälliger Reihenfolge. Perfekt, um Abwechslung zu schaffen, Zufälligkeit zu testen oder geordnete Daten zu vermischen.",
    "inputListSeparator": "Eingabelistentrennzeichen",
    "inputTitle": "Eingabeliste",
    "joinSeparatorDescription": "Verwenden Sie dieses Trennzeichen in der zufälligen Liste.",
    "outputLengthDescription": "So viele zufällige Elemente ausgeben",
    "resultTitle": "Gemischte Liste",
    "shortDescription": "Zufällige Reihenfolge der Listenelemente",
    "shuffledListLength": "Länge der gemischten Liste",
    "shuffledListSeparator": "Trennzeichen für gemischte Listen",
    "title": "Shuffle"
  },
  "sort": {
    "caseSensitive": "Groß-/Kleinschreibung beachten",
    "caseSensitiveDescription": "Groß- und Kleinbuchstaben werden getrennt sortiert. Großbuchstaben stehen in aufsteigender Reihenfolge vor Kleinbuchstaben. (Funktioniert nur im alphabetischen Sortiermodus.)",
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Sortieren von Listenelementen. Geben Sie Ihre Liste ein und legen Sie Sortierkriterien fest, um die Elemente in auf- oder absteigender Reihenfolge zu sortieren. Ideal für die Datenorganisation, Textverarbeitung oder das Erstellen sortierter Listen.",
    "inputItemSeparator": "Trennzeichen für Eingabeelemente",
    "inputTitle": "Eingabeliste",
    "joinSeparatorDescription": "Verwenden Sie dieses Symbol als Verbindung zwischen Elementen in einer sortierten Liste.",
    "orderDescription": "Wählen Sie eine Sortierreihenfolge aus.",
    "orderOptions": {
      "decreasing": "Absteigende Reihenfolge",
      "increasing": "Zunehmende Ordnung"
    },
    "removeDuplicates": "Duplikate entfernen",
    "removeDuplicatesDescription": "Löschen Sie doppelte Listenelemente.",
    "resultTitle": "Sortierte Liste",
    "shortDescription": "Listenelemente in angegebener Reihenfolge sortieren",
    "sortMethod": "Sortiermethode",
    "sortMethodDescription": "Wählen Sie eine Sortiermethode aus.",
    "sortOptions": {
      "alphabetic": "Alphabetisch sortieren",
      "length": "Nach Länge sortieren",
      "numeric": "Numerisch sortieren"
    },
    "sortedItemProperties": "Sortierte Artikeleigenschaften",
    "splitOperators": {
      "regex": {
        "description": "Begrenzen Sie die Elemente der Eingabeliste mit einem regulären Ausdruck.",
        "title": "Verwenden Sie einen regulären Ausdruck zum Aufteilen"
      },
      "symbol": {
        "description": "Trennen Sie die Elemente der Eingabeliste durch ein Zeichen.",
        "title": "Verwenden Sie ein Symbol zum Teilen"
      }
    },
    "splitSeparatorDescription": "Legen Sie ein Trennsymbol oder einen regulären Ausdruck fest.",
    "title": "Sortieren"
  },
  "truncate": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Kürzen von Listen. Geben Sie Ihre Liste ein und legen Sie die maximale Anzahl der zu behaltenden Elemente fest. Ideal für die Datenverarbeitung, Listenverwaltung oder die Begrenzung der Inhaltslänge.",
    "shortDescription": "Liste auf die angegebene Anzahl von Elementen kürzen",
    "title": "Kürzen"
  },
  "unwrap": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Entpacken von Listenelementen. Geben Sie Ihre verpackte Liste ein und legen Sie Entpackkriterien fest, um organisierte Elemente zu vereinfachen. Ideal für die Datenverarbeitung, Textbearbeitung oder das Extrahieren von Inhalten aus strukturierten Listen.",
    "shortDescription": "Listenelemente aus strukturiertem Format auspacken",
    "title": "Auspacken"
  },
  "wrap": {
    "description": "Fügen Sie vor und nach jedem Listenelement Text hinzu.",
    "inputTitle": "Eingabeliste",
    "joinSeparatorDescription": "Trennzeichen zum Verbinden der umschlossenen Liste",
    "leftTextDescription": "Vor jedem Element hinzuzufügender Text",
    "removeEmptyItems": "Leere Elemente entfernen",
    "resultTitle": "Umbrochene Liste",
    "rightTextDescription": "Nach jedem Element hinzuzufügender Text",
    "shortDescription": "Listenelemente mit angegebenen Kriterien umbrechen",
    "splitByRegex": "Aufteilen nach regulärem Ausdruck",
    "splitBySymbol": "Nach Symbol teilen",
    "splitOptions": "Teilungsoptionen",
    "splitSeparatorDescription": "Trennzeichen zum Teilen der Liste",
    "title": "Wickeln",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie vor und nach jedem Listenelement Text hinzufügen. Sie können für die linke und rechte Seite unterschiedlichen Text festlegen und die Verarbeitung der Liste steuern. Es ist nützlich, um Listenelemente mit Anführungszeichen, Klammern oder anderen Formatierungen zu versehen, Daten für verschiedene Formate vorzubereiten oder strukturierten Text zu erstellen.",
      "title": "Listenumbruch"
    },
    "wrapOptions": "Wrap-Optionen"
  }
}


================================================
FILE: public/locales/de/number.json
================================================
{
  "arithmeticSequence": {
    "commonDifferenceDescription": "Gemeinsamer Unterschied zwischen Begriffen (d)",
    "description": "Generieren Sie arithmetische Folgen mit anpassbaren Parametern.",
    "firstTermDescription": "Erster Term der Folge (a₁)",
    "numberOfTermsDescription": "Anzahl der zu generierenden Terme (n)",
    "outputFormat": "Ausgabeformat",
    "resultTitle": "Generierte Sequenz",
    "separatorDescription": "Trennzeichen zwischen Begriffen",
    "sequenceParameters": "Sequenzparameter",
    "shortDescription": "Arithmetische Folgen generieren",
    "title": "Arithmetische Folge",
    "toolInfo": {
      "description": "Eine arithmetische Folge ist eine Zahlenfolge, bei der die Differenz zwischen den aufeinanderfolgenden Termen konstant ist. Diese konstante Differenz wird als gemeinsame Differenz bezeichnet. Gegeben sind der erste Term (a₁) und die gemeinsame Differenz (d). Jeder Term kann durch Addition der gemeinsamen Differenz zum vorherigen Term ermittelt werden.",
      "title": "Was ist eine arithmetische Folge?"
    }
  },
  "generate": {
    "arithmeticSequenceOption": "Arithmetische Sequenzoption",
    "description": "Generieren Sie eine Zahlenfolge mit anpassbaren Parametern.",
    "numberOfElementsDescription": "Anzahl der Elemente in der Sequenz.",
    "resultTitle": "Generierte Zahlen",
    "separator": "Separator",
    "separatorDescription": "Trennen Sie Elemente in der arithmetischen Folge durch dieses Zeichen.",
    "shortDescription": "Generieren Sie Zufallszahlen in angegebenen Bereichen",
    "startSequenceDescription": "Starten Sie die Sequenz ab dieser Nummer.",
    "stepDescription": "Erhöhen Sie jedes Element um diesen Betrag",
    "title": "Erzeugen",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie eine Zahlenfolge mit anpassbaren Parametern generieren. Sie können den Startwert, die Schrittweite und die Anzahl der Elemente festlegen.",
      "title": "Zahlen generieren"
    }
  },
  "ohmsLaw": {
    "description": "Berechnet Spannung, Strom und Widerstand",
    "longDescription": "Dieser Rechner wendet das Ohmsche Gesetz (V = I × R) an, um drei elektrische Parameter zu bestimmen, wenn die beiden anderen bekannt sind. Das Ohmsche Gesetz ist ein grundlegendes Prinzip der Elektrotechnik und beschreibt die Beziehung zwischen Spannung (V), Stromstärke (I) und Widerstand (R). Dieses Tool ist unverzichtbar für Elektronikbastler, Elektroingenieure und Studierende, die mit Schaltkreisen arbeiten, um unbekannte Werte in ihren elektrischen Konstruktionen schnell zu berechnen.",
    "shortDescription": "Berechnen Sie Spannung, Strom oder Widerstand in Stromkreisen mit dem Ohmschen Gesetz",
    "title": "Ohmsches Gesetz"
  },
  "randomNumberGenerator": {
    "description": "Generieren Sie Zufallszahlen innerhalb eines angegebenen Bereichs mit anpassbaren Optionen.",
    "error": {
      "generationFailed": "Zufallszahlen konnten nicht generiert werden. Bitte überprüfen Sie Ihre Eingabeparameter."
    },
    "info": {
      "description": "Ein Zufallszahlengenerator erzeugt unvorhersehbare Zahlen innerhalb eines festgelegten Bereichs. Dieses Tool verwendet kryptografisch sichere Zufallszahlengenerierung, um wirklich zufällige Ergebnisse zu gewährleisten. Nützlich für Simulationen, Spiele, statistische Stichproben und Testszenarien.",
      "title": "Was ist ein Zufallszahlengenerator?"
    },
    "longDescription": "Generieren Sie Zufallszahlen innerhalb eines festgelegten Bereichs mit Optionen für Ganzzahlen oder Dezimalzahlen, erlauben oder verhindern Sie Duplikate und sortieren Sie die Ergebnisse. Ideal für Simulationen, Tests, Spiele und statistische Analysen.",
    "options": {
      "generation": {
        "allowDecimals": {
          "description": "Generieren Sie Dezimalzahlen anstelle von Ganzzahlen",
          "title": "Dezimalzahlen zulassen"
        },
        "allowDuplicates": {
          "description": "Erlauben Sie, dass dieselbe Nummer mehrmals erscheint",
          "title": "Duplikate zulassen"
        },
        "countDescription": "Anzahl der zu generierenden Zufallszahlen (1-10.000)",
        "sortResults": {
          "description": "Sortieren Sie die generierten Zahlen in aufsteigender Reihenfolge",
          "title": "Ergebnisse sortieren"
        },
        "title": "Generierungsoptionen"
      },
      "output": {
        "separatorDescription": "Zeichen zum Trennen der generierten Zahlen",
        "title": "Ausgabeeinstellungen"
      },
      "range": {
        "maxDescription": "Maximalwert (einschließlich)",
        "minDescription": "Mindestwert (einschließlich)",
        "title": "Bereichseinstellungen"
      }
    },
    "result": {
      "count": "Zählen",
      "hasDuplicates": "Enthält Duplikate",
      "isSorted": "Sortiert",
      "range": "Reichweite",
      "title": "Generierte Zufallszahlen"
    },
    "shortDescription": "Generieren Sie Zufallszahlen in benutzerdefinierten Bereichen",
    "title": "Zufallszahlengenerator"
  },
  "randomPortGenerator": {
    "description": "Generieren Sie zufällige Netzwerkports innerhalb angegebener Bereiche mit anpassbaren Optionen.",
    "error": {
      "generationFailed": "Fehler beim Generieren zufälliger Ports. Bitte überprüfen Sie Ihre Eingabeparameter."
    },
    "info": {
      "description": "Ein Zufallsgenerator für Ports erstellt unvorhersehbare Netzwerk-Portnummern innerhalb festgelegter Bereiche. Dieses Tool folgt den IANA-Portnummernstandards und ermöglicht die Identifizierung gängiger Dienste. Nützlich für Entwicklung, Tests, Netzwerkkonfiguration und zur Vermeidung von Portkonflikten.",
      "title": "Was ist ein Zufallsgenerator?"
    },
    "longDescription": "Generiert zufällige Netzwerkports innerhalb festgelegter Bereiche (bekannt, registriert, dynamisch oder benutzerdefiniert). Ideal für Entwicklung, Tests und Netzwerkkonfiguration. Inklusive Port-Service-Identifikation für gängige Ports.",
    "options": {
      "generation": {
        "allowDuplicates": {
          "description": "Mehrfaches Erscheinen desselben Ports zulassen",
          "title": "Duplikate zulassen"
        },
        "countDescription": "Anzahl der zu generierenden zufälligen Ports (1–1.000)",
        "sortResults": {
          "description": "Sortieren Sie die generierten Ports in aufsteigender Reihenfolge",
          "title": "Ergebnisse sortieren"
        },
        "title": "Generierungsoptionen"
      },
      "output": {
        "separatorDescription": "Zeichen zum Trennen der generierten Ports",
        "title": "Ausgabeeinstellungen"
      },
      "range": {
        "custom": "Benutzerdefinierter Bereich",
        "dynamic": "Dynamische Ports (49152-65535)",
        "maxPortDescription": "Maximale Portnummer (1-65535)",
        "minPortDescription": "Minimale Portnummer (1-65535)",
        "registered": "Registrierte Ports (1024-49151)",
        "title": "Portbereichseinstellungen",
        "wellKnown": "Bekannte Ports (1-1023)"
      }
    },
    "result": {
      "count": "Zählen",
      "hasDuplicates": "Enthält Duplikate",
      "isSorted": "Sortiert",
      "portDetails": "Hafendetails",
      "range": "Portbereich",
      "title": "Generierte zufällige Ports"
    },
    "shortDescription": "Zufällige Netzwerkports generieren",
    "title": "Zufalls-Port-Generator"
  },
  "slackline": {
    "description": "Berechnet die Spannung einer Slackline",
    "longDescription": "Dieser Rechner geht von einer Last in der Mitte des Seils aus",
    "shortDescription": "Berechne die ungefähre Spannung einer Slackline oder Wäscheleine. Verlasse dich aus Sicherheitsgründen nicht darauf.",
    "title": "Slackline-Spannung"
  },
  "sphereArea": {
    "description": "Fläche einer Kugel",
    "longDescription": "Dieser Rechner berechnet die Oberfläche einer Kugel mit der Formel A = 4πr². Sie können entweder den Radius eingeben, um die Oberfläche zu berechnen, oder die Oberfläche eingeben, um den gewünschten Radius zu berechnen. Dieses Tool ist nützlich für Geometriestudenten, Ingenieure, die mit sphärischen Objekten arbeiten, und alle, die Berechnungen mit sphärischen Oberflächen durchführen müssen.",
    "shortDescription": "Berechnen Sie die Oberfläche einer Kugel anhand ihres Radius",
    "title": "Fläche einer Kugel"
  },
  "sphereVolume": {
    "description": "Volumen einer Kugel",
    "longDescription": "Dieser Rechner berechnet das Volumen einer Kugel mit der Formel V = (4/3)πr³. Sie können entweder den Radius oder den Durchmesser eingeben, um das Volumen zu ermitteln, oder das Volumen eingeben, um den gewünschten Radius zu bestimmen. Das Tool ist nützlich für Studierende, Ingenieure und Fachleute, die mit kugelförmigen Objekten in Bereichen wie Physik, Ingenieurwesen und Fertigung arbeiten.",
    "shortDescription": "Berechnen Sie das Volumen einer Kugel anhand des Radius oder Durchmessers",
    "title": "Volumen einer Kugel"
  },
  "sum": {
    "description": "Berechnen Sie die Summe einer Zahlenliste. Geben Sie die Zahlen durch Kommas oder Zeilenumbrüche getrennt ein, um die Gesamtsumme zu erhalten.",
    "example1Description": "In diesem Beispiel berechnen wir die Summe von zehn positiven Ganzzahlen. Diese Ganzzahlen werden als Spalte aufgelistet und ihre Gesamtsumme beträgt 19494.",
    "example1Title": "Summe von zehn positiven Zahlen",
    "example2Description": "Dieses Beispiel kehrt eine Spalte mit zwanzig dreisilbigen Nomen um und gibt alle Wörter von unten nach oben aus. Zur Trennung der Listenelemente wird das Zeichen \\n als Eingabeelementtrennzeichen verwendet, sodass jedes Element in einer eigenen Zeile steht.",
    "example2Title": "Bäume im Park zählen",
    "example3Description": "In diesem Beispiel addieren wir neunzig verschiedene Werte – positive Zahlen, negative Zahlen, Ganzzahlen und Dezimalbrüche. Als Trennzeichen für die Eingabe setzen wir ein Komma. Nach der Addition aller Werte erhalten wir 0 als Ausgabe.",
    "example3Title": "Summe der Ganzzahlen und Dezimalzahlen",
    "example4Description": "In diesem Beispiel berechnen wir die Summe aller zehn Ziffern und aktivieren die Option „Laufende Summe drucken“. Die Zwischenwerte der Summe erhalten wir durch Addition. Die Ausgabe lautet daher: 0, 1 (0 + 1), 3 (0 + 1 + 2), 6 (0 + 1 + 2 + 3), 10 (0 + 1 + 2 + 3 + 4) usw.",
    "example4Title": "Laufende Summe der Zahlen",
    "extractionTypes": {
      "delimiter": {
        "description": "Passen Sie hier das Zahlentrennzeichen an. (Standardmäßig ein Zeilenumbruch.)",
        "title": "Zahlentrennzeichen"
      },
      "smart": {
        "description": "Automatische Erkennung von Zahlen in der Eingabe.",
        "title": "Smart Sum"
      }
    },
    "inputTitle": "Eingang",
    "numberExtraction": "Zahlenextraktion",
    "printRunningSum": "Laufende Summe drucken",
    "printRunningSumDescription": "Zeigen Sie die Summe an, während sie Schritt für Schritt berechnet wird.",
    "resultTitle": "Gesamt",
    "runningSum": "Laufende Summe",
    "shortDescription": "Summe der Zahlen berechnen",
    "title": "Summe",
    "toolInfo": {
      "description": "Dies ist ein browserbasiertes Online-Dienstprogramm zum Berechnen der Summe mehrerer Zahlen. Sie können die Zahlen durch Komma, Leerzeichen oder ein beliebiges anderes Zeichen (einschließlich Zeilenumbruch) getrennt eingeben. Sie können auch einfach einen Textabschnitt mit numerischen Werten einfügen, die Sie summieren möchten. Das Dienstprogramm extrahiert diese und berechnet deren Summe.",
      "title": "Was ist ein Zahlensummenrechner?"
    }
  },
  "voltageDropInWire": {
    "description": "Berechnet die Rundreisespannung und den Leistungsverlust in einem 2-adrigen Kabel",
    "longDescription": "Dieser Rechner hilft bei der Ermittlung des Spannungsabfalls und der Verlustleistung in einem zweiadrigen Elektrokabel. Er berücksichtigt Kabellänge, Drahtquerschnitt, Materialwiderstand und Stromfluss. Das Tool berechnet den Hin- und Rückspannungsabfall, den Gesamtwiderstand des Kabels und die in Wärme umgewandelte Leistung. Dies ist besonders nützlich für Elektroingenieure, Elektriker und Bastler bei der Konstruktion elektrischer Systeme, um sicherzustellen, dass die Spannungspegel an der Last innerhalb akzeptabler Grenzen bleiben.",
    "shortDescription": "Berechnen Sie Spannungsabfall und Leistungsverlust in elektrischen Kabeln basierend auf Länge, Material und Stromstärke",
    "title": "Hin- und Rückspannungsabfall im Kabel"
  }
}


================================================
FILE: public/locales/de/pdf.json
================================================
{
  "compressPdf": {
    "compressedFileSize": "Komprimierte Dateigröße",
    "compressingPdf": "PDF wird komprimiert...",
    "compressionLevel": "Komprimierungsstufe",
    "compressionSettings": "Komprimierungseinstellungen",
    "description": "Reduzieren Sie die PDF-Dateigröße bei gleichbleibender Qualität mit Ghostscript",
    "errorCompressingPdf": "PDF konnte nicht komprimiert werden: {{error}}",
    "errorReadingPdf": "PDF-Datei konnte nicht gelesen werden. Bitte stellen Sie sicher, dass es sich um eine gültige PDF-Datei handelt.",
    "fileSize": "Originaldateigröße",
    "highCompression": "Hohe Kompression",
    "highCompressionDescription": "Maximale Reduzierung der Dateigröße mit gewissem Qualitätsverlust",
    "inputTitle": "Eingabe-PDF",
    "longDescription": "Komprimieren Sie PDF-Dateien sicher in Ihrem Browser mit Ghostscript. Ihre Dateien verlassen nie Ihr Gerät. Das gewährleistet absolute Privatsphäre und reduziert gleichzeitig die Dateigröße für den E-Mail-Austausch, das Hochladen auf Websites oder zum Sparen von Speicherplatz. Unterstützt durch WebAssembly-Technologie.",
    "lowCompression": "Geringe Kompression",
    "lowCompressionDescription": "Reduzieren Sie die Dateigröße leicht mit minimalem Qualitätsverlust",
    "mediumCompression": "Mittlere Kompression",
    "mediumCompressionDescription": "Gleichgewicht zwischen Dateigröße und Qualität",
    "pages": "Seitenanzahl",
    "resultTitle": "Komprimiertes PDF",
    "shortDescription": "Komprimieren Sie PDF-Dateien sicher in Ihrem Browser",
    "title": "PDF komprimieren"
  },
  "editor": {
    "description": "Erweiterter PDF-Editor mit Funktionen zum Kommentieren, Ausfüllen von Formularen, Hervorheben und Exportieren. Bearbeiten Sie Ihre PDFs direkt im Browser mit professionellen Tools wie Texteinfügung, Zeichnen, Hervorheben, Unterschreiben und Ausfüllen von Formularen.",
    "shortDescription": "Bearbeiten Sie PDFs mit erweiterten Werkzeugen zum Kommentieren, Signieren und Bearbeiten",
    "title": "PDF Editor"
  },
  "merge": {
    "inputTitle": "Eingabe-PDF",
    "loadingText": "Seiten extrahieren",
    "resultTitle": "Zusammengeführtes PDF ausgeben",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen. Laden Sie dazu einfach die zusammenzuführenden PDF-Dateien hoch. Das Tool fügt dann alle Seiten der Eingabedateien zu einem einzigen PDF-Dokument zusammen.",
      "title": "Wie verwende ich das Tool zum Zusammenführen von PDFs?"
    }
  },
  "mergePdf": {
    "description": "Kombinieren Sie mehrere PDF-Dateien zu einem einzigen Dokument.",
    "inputTitle": "Eingabe-PDFs",
    "mergingPdfs": "PDFs zusammenführen",
    "pdfOptions": "PDF-Optionen",
    "resultTitle": "Zusammengeführte PDF",
    "shortDescription": "Mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen",
    "sortByFileName": "Nach Dateinamen sortieren",
    "sortByFileNameDescription": "PDFs alphabetisch nach Dateinamen sortieren",
    "sortByUploadOrder": "Nach Upload-Reihenfolge sortieren",
    "sortByUploadOrderDescription": "Behalten Sie PDFs in der Reihenfolge bei, in der sie hochgeladen wurden",
    "title": "PDF zusammenführen",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie mehrere PDF-Dateien zu einem einzigen Dokument zusammenführen. Sie können die Sortierung der PDFs wählen, und das Tool fügt sie in der angegebenen Reihenfolge zusammen.",
      "title": "PDF-Dateien zusammenführen"
    }
  },
  "pdfToEpub": {
    "description": "Wandeln Sie PDF-Dokumente in EPUB-Dateien um, um eine bessere E-Reader-Kompatibilität zu erzielen.",
    "shortDescription": "Konvertieren Sie PDF-Dateien in das EPUB-Format",
    "title": "PDF zu EPUB"
  },
  "pdfToPng": {
    "description": "Wandeln Sie PDF-Dokumente in PNG-Panels um.",
    "longDescription": "Laden Sie eine PDF-Datei hoch und konvertieren Sie jede Seite direkt in Ihrem Browser in ein hochwertiges PNG-Bild. Dieses Tool eignet sich ideal zum Extrahieren visueller Inhalte oder zum Teilen einzelner Seiten. Es werden keine Daten hochgeladen – alles läuft lokal.",
    "shortDescription": "Konvertieren Sie PDF in PNG-Bilder",
    "title": "PDF zu PNG"
  },
  "convertToPdf": {
    "title": "Bilder in PDF konvertieren",
    "description": "Verschiedene Bildformate (PNG, GIF, JPG, TIF, PSD, SVG, WEBP, HEIC, RAW) in PDF konvertieren, mit Optionen zum Skalieren des Bildes und zur Wahl der Seitenorientierung.",
    "shortDescription": "Bilder in PDF mit Skalierungs- und Orientierungskontrolle konvertieren"
  },
  "protectPdf": {
    "description": "Fügen Sie Ihren PDF-Dateien sicher in Ihrem Browser einen Passwortschutz hinzu",
    "shortDescription": "PDF-Dateien sicher mit einem Passwort schützen",
    "title": "PDF schützen"
  },
  "rotatePdf": {
    "allPagesWillBeRotated": "Alle {{count}} Seiten werden gedreht",
    "angleOptions": {
      "clockwise90": "90° im Uhrzeigersinn",
      "counterClockwise270": "270° (90° gegen den Uhrzeigersinn)",
      "upsideDown180": "180° (auf den Kopf gestellt)"
    },
    "applyToAllPages": "Auf alle Seiten anwenden",
    "description": "Drehen Sie Seiten in einem PDF-Dokument.",
    "inputTitle": "Eingabe-PDF",
    "longDescription": "Ändern Sie die Ausrichtung von PDF-Seiten, indem Sie sie um 90, 180 oder 270 Grad drehen. Nützlich zum Korrigieren falsch gescannter Dokumente oder zum Vorbereiten von PDFs für den Druck.",
    "pageRangesDescription": "Geben Sie Seitenzahlen oder Bereiche durch Kommas getrennt ein (z. B. 1,3,5-7).",
    "pageRangesPlaceholder": "z.B. 1,5-8",
    "pagesWillBeRotated": "{{count}} Seite{{count !== 1 ? 's' : ''}} wird gedreht",
    "pdfPageCount": "PDF hat {{count}} Seite{{count !== 1 ? 's' : ''}}",
    "resultTitle": "Gedrehtes PDF",
    "rotatingPages": "Seiten drehen",
    "rotationAngle": "Drehwinkel",
    "rotationSettings": "Rotationseinstellungen",
    "shortDescription": "Seiten in einem PDF-Dokument drehen",
    "title": "PDF drehen",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie Seiten in einem PDF-Dokument drehen. Sie können alle Seiten drehen oder einzelne Seiten auswählen. Wählen Sie einen Drehwinkel: 90° im Uhrzeigersinn, 180° (auf dem Kopf) oder 270° (90° gegen den Uhrzeigersinn). Um bestimmte Seiten zu drehen, deaktivieren Sie „Auf alle Seiten anwenden“ und geben Sie Seitenzahlen oder -bereiche durch Kommas getrennt ein (z. B. 1, 3, 5-7).",
      "title": "So verwenden Sie das Tool zum Drehen von PDFs"
    }
  },
  "splitPdf": {
    "description": "Extrahieren Sie bestimmte Seiten aus einem PDF-Dokument.",
    "extractingPages": "Seiten extrahieren",
    "inputTitle": "Eingabe-PDF",
    "pageExtractionPreview": "{{count}} Seite{{count !== 1 ? 's' : ''}} wird extrahiert",
    "pageRangesDescription": "Geben Sie Seitenzahlen oder Bereiche durch Kommas getrennt ein (z. B. 1,3,5-7).",
    "pageRangesPlaceholder": "z.B. 1,5-8",
    "pageSelection": "Seitenauswahl",
    "pdfPageCount": "PDF hat {{count}} Seite{{count !== 1 ? 's' : ''}}",
    "resultTitle": "Extrahiertes PDF",
    "shortDescription": "Extrahieren Sie bestimmte Seiten aus einer PDF-Datei",
    "title": "PDF teilen",
    "toolInfo": {
      "description": "Mit diesem Tool können Sie bestimmte Seiten aus einem PDF-Dokument extrahieren. Sie können einzelne Seiten oder Seitenbereiche zum Extrahieren angeben.",
      "title": "PDF teilen"
    }
  }
}


================================================
FILE: public/locales/de/string.json
================================================
{
  "base64": {
    "decode": "Base64-Dekodierung",
    "description": "Kodieren oder dekodieren Sie Text mit der Base64-Kodierung.",
    "encode": "Base64-Kodierung",
    "inputTitle": "Eingabedaten",
    "optionsTitle": "Base64-Optionen",
    "resultTitle": "Ergebnis",
    "shortDescription": "Kodieren oder dekodieren Sie Daten mit Base64.",
    "title": "Base64-Encoder/Decoder",
    "toolInfo": {
      "description": "Base64 ist ein Kodierungsschema, das Daten im ASCII-String-Format darstellt, indem es sie in eine Radix-64-Darstellung übersetzt. Obwohl es zur Kodierung von Strings verwendet werden kann, wird es üblicherweise zur Kodierung binärer Daten für die Übertragung über Medien verwendet, die für die Verarbeitung von Textdaten ausgelegt sind.",
      "title": "Was ist Base64?"
    }
  },
  "censor": {
    "description": "Dienstprogramm zum Zensieren von Wörtern in Texten. Laden Sie Ihren Text in das Eingabeformular links, geben Sie alle Schimpfwörter in den Optionen an, und Sie erhalten sofort zensierten Text im Ausgabebereich., longDescription: 'Mit diesem Online-Tool können Sie bestimmte Wörter in jedem Text zensieren. Sie können eine Liste unerwünschter Wörter (z. B. Schimpfwörter oder Geheimwörter) angeben, die das Programm durch alternative Wörter ersetzt und einen lesbaren Text erstellt. Die Wörter können in einem mehrzeiligen Textfeld in den Optionen angegeben werden, indem Sie pro Zeile ein Wort eingeben.', keywords: ['text', 'zensieren', 'wörter', 'zeichen'], component: lazy(() => import('./index')), i18n: { name: 'string:censor.title', description: 'string:censor.description",
    "shortDescription": "Maskieren Sie Schimpfwörter schnell oder ersetzen Sie sie durch alternative Wörter.",
    "title": "Textzensur"
  },
  "createPalindrome": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Erstellen von Palindromen aus beliebigem Text. Geben Sie Text ein und verwandeln Sie ihn sofort in ein Palindrom, das vorwärts und rückwärts gleich gelesen wird. Ideal für Wortspiele, das Erstellen symmetrischer Textmuster oder das Erkunden sprachlicher Kuriositäten.",
    "shortDescription": "Erstellen Sie Text, der vorwärts und rückwärts gleich gelesen wird",
    "title": "Palindrom erstellen"
  },
  "extractSubstring": {
    "description": "Das weltweit einfachste browserbasierte Dienstprogramm zum Extrahieren von Teilzeichenfolgen aus Text. Geben Sie Ihren Text ein und legen Sie Start- und Endposition fest, um den gewünschten Teil zu extrahieren. Ideal für die Datenverarbeitung, Textanalyse oder das Extrahieren spezifischer Inhalte aus größeren Textblöcken.",
    "shortDescription": "Extrahieren Sie einen Textabschnitt zwischen angegebenen Positionen",
    "title": "Teilzeichenfolge extrahieren"
  },
  "hiddenCharacterDetector": {
    "analysisOptions": "Analyseoptionen",
    "category": "Kategorie",
    "description": "Erkennen Sie versteckte Unicode-Zeichen, insbesondere RTL-Override-Zeichen, die für Angriffe verwendet werden könnten.",
    "foundChars": "Gefunden {{count}} versteckte(s) Zeichen:",
    "inputPlaceholder": "Geben Sie Text ein, um nach versteckten Zeichen zu suchen ...",
    "inputTitle": "Zu analysierender Text",
    "invisibleChar": "Unsichtbarer Charakter",
    "invisibleFound": "Unsichtbare Zeichen gefunden",
    "longDescription": "Mit diesem Tool können Sie versteckte Unicode-Zeichen in Texten erkennen, insbesondere Rechts-nach-Links-Override-Zeichen (RTL), die für Angriffe missbraucht werden können. Es erkennt unsichtbare Zeichen, Zeichen mit der Breite Null und andere potenziell schädliche Unicode-Sequenzen, die in scheinbar harmlosem Text versteckt sein können.",
    "noHiddenChars": "Im Text wurden keine versteckten Zeichen erkannt.",
    "optionsDescription": "Konfigurieren Sie, welche Arten von versteckten Zeichen erkannt werden sollen und wie die Ergebnisse angezei
Download .txt
gitextract_qdwcsdfo/

├── .dockerignore
├── .editorconfig
├── .eslintrc
├── .github/
│   ├── FUNDING.yml
│   └── workflows/
│       └── ci.yml
├── .gitignore
├── .husky/
│   └── pre-commit
├── .idea/
│   ├── codeStyles/
│   │   ├── Project.xml
│   │   └── codeStyleConfig.xml
│   ├── inspectionProfiles/
│   │   └── Project_Default.xml
│   ├── modules.xml
│   ├── omni-tools.iml
│   ├── prettier.xml
│   ├── shelf/
│   │   ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/
│   │   │   └── shelved.patch
│   │   ├── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]1/
│   │   │   └── shelved.patch
│   │   └── Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM__Changes_.xml
│   ├── vcs.xml
│   └── workspace.xml
├── .prettierrc
├── .vitest/
│   └── setup.ts
├── .vscode/
│   └── settings.json
├── @types/
│   ├── i18n.d.ts
│   └── theme.d.ts
├── CODEOWNERS
├── Dockerfile
├── LICENSE
├── README.md
├── commitlint.config.js
├── index.html
├── package.json
├── playwright.config.ts
├── postcss.config.mjs
├── public/
│   ├── _redirects
│   ├── assets/
│   │   └── fonts/
│   │       └── quicksand/
│   │           └── quick-sand.css
│   ├── gs.js
│   ├── locales/
│   │   ├── de/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── en/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── es/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── fr/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── hi/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── ja/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── nl/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── pt/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   ├── ru/
│   │   │   ├── audio.json
│   │   │   ├── converters.json
│   │   │   ├── csv.json
│   │   │   ├── image.json
│   │   │   ├── json.json
│   │   │   ├── list.json
│   │   │   ├── number.json
│   │   │   ├── pdf.json
│   │   │   ├── string.json
│   │   │   ├── time.json
│   │   │   ├── translation.json
│   │   │   ├── video.json
│   │   │   └── xml.json
│   │   └── zh/
│   │       ├── audio.json
│   │       ├── converters.json
│   │       ├── csv.json
│   │       ├── image.json
│   │       ├── json.json
│   │       ├── list.json
│   │       ├── number.json
│   │       ├── pdf.json
│   │       ├── string.json
│   │       ├── time.json
│   │       ├── translation.json
│   │       ├── video.json
│   │       └── xml.json
│   ├── robots.txt
│   └── site.webmanifest
├── scripts/
│   ├── add-i18n-to-meta.js
│   ├── cleanup-empty-directories.js
│   ├── create-tool.mjs
│   ├── locize-upload.js
│   └── update-i18n-from-meta.js
├── src/
│   ├── @types/
│   │   └── i18n.d.ts
│   ├── components/
│   │   ├── App.tsx
│   │   ├── BackButton.tsx
│   │   ├── Hero.tsx
│   │   ├── InputHeader.tsx
│   │   ├── Loading.css
│   │   ├── Loading.tsx
│   │   ├── Navbar/
│   │   │   └── index.tsx
│   │   ├── ScrollToTopButton.tsx
│   │   ├── Separator.tsx
│   │   ├── ToolBreadcrumb.tsx
│   │   ├── ToolContent.tsx
│   │   ├── ToolHeader.tsx
│   │   ├── ToolInfo.tsx
│   │   ├── ToolInputAndResult.tsx
│   │   ├── ToolLayout.tsx
│   │   ├── UserTypeFilter.tsx
│   │   ├── allTools/
│   │   │   ├── AllTools.tsx
│   │   │   └── ToolCard.tsx
│   │   ├── examples/
│   │   │   ├── ExampleCard.tsx
│   │   │   ├── ExampleOptions.tsx
│   │   │   └── ToolExamples.tsx
│   │   ├── index.css
│   │   ├── input/
│   │   │   ├── BaseFileInput.tsx
│   │   │   ├── InputFooter.tsx
│   │   │   ├── NumericInputWithUnit.tsx
│   │   │   ├── ToolAudioInput.tsx
│   │   │   ├── ToolCodeInput.tsx
│   │   │   ├── ToolImageInput.tsx
│   │   │   ├── ToolMultipleAudioInput.tsx
│   │   │   ├── ToolMultipleImageInput.tsx
│   │   │   ├── ToolMultiplePdfInput.tsx
│   │   │   ├── ToolMultipleVideoInput.tsx
│   │   │   ├── ToolPdfInput.tsx
│   │   │   ├── ToolTextInput.tsx
│   │   │   ├── ToolVideoInput.tsx
│   │   │   └── file-input-utils.ts
│   │   ├── options/
│   │   │   ├── CheckboxWithDesc.tsx
│   │   │   ├── ColorSelector.tsx
│   │   │   ├── RadioWithTextField.tsx
│   │   │   ├── SelectWithDesc.tsx
│   │   │   ├── SimpleRadio.tsx
│   │   │   ├── TextFieldWithDesc.tsx
│   │   │   ├── ToolOptionGroups.tsx
│   │   │   └── ToolOptions.tsx
│   │   └── result/
│   │       ├── ResultFooter.tsx
│   │       ├── ToolFileResult.tsx
│   │       ├── ToolMultiFileResult.tsx
│   │       └── ToolTextResult.tsx
│   ├── config/
│   │   ├── muiConfig.ts
│   │   ├── routesConfig.tsx
│   │   └── uiConfig.ts
│   ├── contexts/
│   │   └── CustomSnackBarContext.tsx
│   ├── datatables/
│   │   ├── data/
│   │   │   ├── material_electrical_properties.ts
│   │   │   └── wire_gauge.ts
│   │   ├── index.ts
│   │   └── types.ts
│   ├── hooks/
│   │   ├── index.ts
│   │   ├── useDebounce.ts
│   │   ├── usePrevious.ts
│   │   ├── useTimeout.ts
│   │   └── useUpdateEffect.ts
│   ├── i18n/
│   │   └── index.ts
│   ├── index.tsx
│   ├── lib/
│   │   └── ghostscript/
│   │       ├── background-worker.js
│   │       ├── gs-worker.js
│   │       └── worker-init.ts
│   ├── pages/
│   │   ├── home/
│   │   │   ├── Categories.tsx
│   │   │   └── index.tsx
│   │   ├── tools/
│   │   │   ├── audio/
│   │   │   │   ├── change-speed/
│   │   │   │   │   ├── change-speed.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── extract-audio/
│   │   │   │   │   ├── extract-audio.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── merge-audio/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── merge-audio.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── trim/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       ├── trim.service.test.ts
│   │   │   │       └── types.ts
│   │   │   ├── converters/
│   │   │   │   ├── audio-converter/
│   │   │   │   │   ├── audio-converter.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── index.ts
│   │   │   ├── csv/
│   │   │   │   ├── change-csv-separator/
│   │   │   │   │   ├── change-csv-separator.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── csv-rows-to-columns/
│   │   │   │   │   ├── csv-rows-to-columns.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-json/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-tsv/
│   │   │   │   │   ├── csv-to-tsv.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-xml/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── csv-to-yaml/
│   │   │   │   │   ├── csv-to-yaml.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── find-incomplete-csv-records/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── insert-csv-columns/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── insert-csv-columns.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── swap-csv-columns/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── swap-csv-columns.service.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── transpose-csv/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── transpose-csv.service.test.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── tsv-to-json/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── types.ts
│   │   │   ├── image/
│   │   │   │   ├── generic/
│   │   │   │   │   ├── change-colors/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── service.ts
│   │   │   │   │   ├── change-opacity/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── service.ts
│   │   │   │   │   ├── compress/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── convert-to-jpg/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── create-transparent/
│   │   │   │   │   │   ├── create-transparent.e2e.spec.ts
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── crop/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── editor/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── image-to-text/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── index.ts
│   │   │   │   │   ├── qr-code/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   ├── remove-background/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   ├── resize/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   ├── meta.ts
│   │   │   │   │   │   ├── service.ts
│   │   │   │   │   │   └── types.ts
│   │   │   │   │   └── rotate/
│   │   │   │   │       ├── index.tsx
│   │   │   │   │       ├── meta.ts
│   │   │   │   │       ├── service.ts
│   │   │   │   │       └── type.ts
│   │   │   │   ├── index.ts
│   │   │   │   └── png/
│   │   │   │       ├── compress-png/
│   │   │   │       │   ├── index.tsx
│   │   │   │       │   ├── meta.ts
│   │   │   │       │   └── service.ts
│   │   │   │       ├── convert-jgp-to-png/
│   │   │   │       │   ├── convert-jgp-to-png.e2e.spec.ts
│   │   │   │       │   ├── index.tsx
│   │   │   │       │   └── meta.ts
│   │   │   │       └── index.ts
│   │   │   ├── json/
│   │   │   │   ├── escape-json/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── json-comparison/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── json-to-csv/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── json-to-xml/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── minify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── prettify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── stringify/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── validateJson/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       └── service.ts
│   │   │   ├── list/
│   │   │   │   ├── duplicate/
│   │   │   │   │   ├── duplicate.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── find-most-popular/
│   │   │   │   │   ├── find-most-popular.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── find-unique/
│   │   │   │   │   ├── find-unique.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── group/
│   │   │   │   │   ├── group.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── reverse.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── shuffle/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── shuffle.service.test.ts
│   │   │   │   ├── sort/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── sort.service.test.ts
│   │   │   │   ├── truncate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── truncate.service.test.ts
│   │   │   │   ├── unwrap/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── unwrap.service.test.ts
│   │   │   │   └── wrap/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── wrap.service.test.ts
│   │   │   ├── number/
│   │   │   │   ├── arithmetic-sequence/
│   │   │   │   │   ├── arithmetic-sequence.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── byte-converter/
│   │   │   │   │   ├── byte-converter.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── generate/
│   │   │   │   │   ├── generate.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── generic-calc/
│   │   │   │   │   ├── data/
│   │   │   │   │   │   ├── index.ts
│   │   │   │   │   │   ├── ohmsLaw.ts
│   │   │   │   │   │   ├── slackline.ts
│   │   │   │   │   │   ├── sphereArea.ts
│   │   │   │   │   │   ├── sphereVolume.ts
│   │   │   │   │   │   ├── types.ts
│   │   │   │   │   │   └── voltageDropInWire.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── random-number-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── random-number-generator.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── random-port-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── random-port-generator.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   └── sum/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── sum.service.test.ts
│   │   │   ├── pdf/
│   │   │   │   ├── compress-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── convert-to-pdf/
│   │   │   │   │   ├── convert-to-pdf.service.test.tsx
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── editor/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── meta.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── merge-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── pdf-to-epub/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── pdf-to-png/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── protect-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── rotate-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate-pdf.service.test.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── split-pdf/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── utils.ts
│   │   │   ├── string/
│   │   │   │   ├── base64/
│   │   │   │   │   ├── base64.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── censor/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── create-palindrome/
│   │   │   │   │   ├── create-palindrome.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── extract-substring/
│   │   │   │   │   ├── extract-substring.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── hidden-character-detector/
│   │   │   │   │   ├── hidden-character-detector.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── join/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── string-join.e2e.spec.ts
│   │   │   │   │   └── string-join.service.test.ts
│   │   │   │   ├── palindrome/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── palindrome.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── password-generator/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── password-generator.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── quote/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── quote.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── randomize-case/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── randomize-case.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── remove-duplicate-lines/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── remove-duplicate-lines.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── repeat/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── repeatText.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── reverse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── reverse.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rot13/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rot13.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── rotate.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── split/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── string-split.service.test.ts
│   │   │   │   ├── statistic/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── text-replacer/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── replaceText.service.test.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── to-morse/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── to-morse.service.test.ts
│   │   │   │   ├── truncate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── initialValues.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── truncateText.service.test.ts
│   │   │   │   ├── unicode/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   ├── types.ts
│   │   │   │   │   └── unicode.service.test.ts
│   │   │   │   ├── uppercase/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── uppercase.service.test.ts
│   │   │   │   ├── url-decode/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   └── url-encode/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── types.ts
│   │   │   ├── time/
│   │   │   │   ├── check-leap-years/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-days-to-hours/
│   │   │   │   │   ├── convert-days-to-hours.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-hours-to-days/
│   │   │   │   │   ├── convert-hours-to-days.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-seconds-to-time/
│   │   │   │   │   ├── convert-seconds-to-time.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-time-to-decimal/
│   │   │   │   │   ├── convert-time-to-decimal.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── convert-time-to-seconds/
│   │   │   │   │   ├── convert-time-to-seconds.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── convert-unix-to-date/
│   │   │   │   │   ├── convert-unix-to-date.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── crontab-guru/
│   │   │   │   │   ├── crontab-guru.service.test.ts
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── discord-timestamp/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── time-between-dates/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── time-between-dates.service.test.ts
│   │   │   │   └── truncate-clock-time/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       ├── service.ts
│   │   │   │       └── truncate-clock-time.service.test.ts
│   │   │   ├── video/
│   │   │   │   ├── change-speed/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── compress/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── crop-video/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── flip/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── gif/
│   │   │   │   │   ├── change-speed/
│   │   │   │   │   │   ├── index.tsx
│   │   │   │   │   │   └── meta.ts
│   │   │   │   │   └── index.ts
│   │   │   │   ├── index.ts
│   │   │   │   ├── loop/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── merge-video/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── merge-video.service.test.ts
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   ├── service.ts
│   │   │   │   │   └── types.ts
│   │   │   │   ├── rotate/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   ├── meta.ts
│   │   │   │   │   └── service.ts
│   │   │   │   ├── trim/
│   │   │   │   │   ├── index.tsx
│   │   │   │   │   └── meta.ts
│   │   │   │   └── video-to-gif/
│   │   │   │       ├── index.tsx
│   │   │   │       ├── meta.ts
│   │   │   │       └── types.ts
│   │   │   └── xml/
│   │   │       ├── index.ts
│   │   │       ├── xml-beautifier/
│   │   │       │   ├── index.tsx
│   │   │       │   ├── meta.ts
│   │   │       │   ├── service.ts
│   │   │       │   ├── types.ts
│   │   │       │   └── xml-beautifier.service.test.ts
│   │   │       └── xml-validator/
│   │   │           ├── index.tsx
│   │   │           ├── meta.ts
│   │   │           ├── service.ts
│   │   │           ├── types.ts
│   │   │           └── xml-validator.service.test.ts
│   │   └── tools-by-category/
│   │       └── index.tsx
│   ├── providers/
│   │   └── UserTypeFilterProvider.tsx
│   ├── tools/
│   │   ├── defineTool.tsx
│   │   ├── index.test.ts
│   │   └── index.ts
│   └── utils/
│       ├── array.ts
│       ├── bookmark.ts
│       ├── color.ts
│       ├── csv.ts
│       ├── file.ts
│       ├── gif.ts
│       ├── index.ts
│       ├── json.ts
│       ├── number.ts
│       ├── string.ts
│       └── time.ts
├── tailwind.config.mjs
├── tsconfig.json
└── vite.config.ts
Download .txt
SYMBOL INDEX (827 symbols across 329 files)

FILE: @types/i18n.d.ts
  type CustomTypeOptions (line 6) | interface CustomTypeOptions {

FILE: @types/theme.d.ts
  type TypeBackground (line 4) | interface TypeBackground {

FILE: scripts/add-i18n-to-meta.js
  constant TYPE_MAPPING (line 4) | const TYPE_MAPPING = { 'image-generic': 'image', png: 'image' };
  function toCamelCase (line 6) | function toCamelCase(str) {
  function parseMeta (line 11) | function parseMeta(filePath) {
  function hasI18nField (line 47) | function hasI18nField(filePath) {
  function addI18nToMeta (line 53) | function addI18nToMeta(filePath, category, toolName, hasLongDescription) {
  function getCategoryI18nPath (line 87) | function getCategoryI18nPath(category) {
  function loadCategoryI18n (line 103) | function loadCategoryI18n(category) {
  function saveCategoryI18n (line 124) | function saveCategoryI18n(category, data) {
  constant PROJECT_ROOT (line 133) | const PROJECT_ROOT = path.resolve(__dirname, '..');
  function findMetaFiles (line 139) | function findMetaFiles(dir) {

FILE: scripts/cleanup-empty-directories.js
  function deleteEmptyFolders (line 10) | function deleteEmptyFolders(dirPath, deleteRoot = false) {
  function cleanupEmptyFolders (line 74) | function cleanupEmptyFolders(targetPath) {

FILE: scripts/create-tool.mjs
  function capitalizeFirstLetter (line 23) | function capitalizeFirstLetter(string) {
  function createFolderStructure (line 27) | function createFolderStructure(basePath, foldersToCreateIndexCount) {

FILE: scripts/locize-upload.js
  constant LOCIZE_PROJECT_ID (line 8) | const LOCIZE_PROJECT_ID = 'e7156a3e-66fb-4035-a0f0-cebf1c63a3ba';
  constant LOCIZE_API_KEY (line 9) | const LOCIZE_API_KEY = process.env.LOCIZE_API_KEY;
  constant LOCIZE_VERSION (line 10) | const LOCIZE_VERSION = 'latest';
  function flattenJson (line 107) | function flattenJson(obj, prefix = '') {
  function uploadToLocize (line 131) | function uploadToLocize(lang, namespace, data) {
  function main (line 167) | async function main() {

FILE: scripts/update-i18n-from-meta.js
  function toCamelCase (line 5) | function toCamelCase(str) {
  function findMetaFiles (line 10) | function findMetaFiles(dir) {
  function parseMeta (line 32) | function parseMeta(filePath) {
  constant PROJECT_ROOT (line 70) | const PROJECT_ROOT = path.resolve(__dirname, '..');
  function getCategoryI18nPath (line 73) | function getCategoryI18nPath(category) {
  function loadCategoryI18n (line 85) | function loadCategoryI18n(category) {
  function saveCategoryI18n (line 106) | function saveCategoryI18n(category, data) {

FILE: src/@types/i18n.d.ts
  type CustomTypeOptions (line 18) | interface CustomTypeOptions {

FILE: src/components/App.tsx
  type Mode (line 17) | type Mode = 'dark' | 'light' | 'system';
  function App (line 27) | function App() {
  function getTheme (line 83) | function getTheme(mode: Mode): Theme {
  function nextMode (line 96) | function nextMode(mode: Mode): Mode {

FILE: src/components/Hero.tsx
  type ToolInfo (line 45) | type ToolInfo = {
  function Hero (line 50) | function Hero() {

FILE: src/components/InputHeader.tsx
  function InputHeader (line 4) | function InputHeader({ title }: { title: string }) {

FILE: src/components/Loading.tsx
  function Loading (line 5) | function Loading() {

FILE: src/components/Navbar/index.tsx
  type NavbarProps (line 27) | interface NavbarProps {

FILE: src/components/ScrollToTopButton.tsx
  function ScrollToTopButton (line 5) | function ScrollToTopButton() {

FILE: src/components/Separator.tsx
  type SeparatorProps (line 4) | type SeparatorProps = {
  function Separator (line 9) | function Separator({ backgroundColor, margin }: SeparatorProps) {

FILE: src/components/ToolBreadcrumb.tsx
  type BreadcrumbItem (line 5) | interface BreadcrumbItem {
  type BreadcrumbComponentProps (line 10) | interface BreadcrumbComponentProps {

FILE: src/components/ToolContent.tsx
  type ToolContentProps (line 41) | interface ToolContentProps<Options, Input> extends ToolComponentProps {
  function ToolContent (line 66) | function ToolContent<T extends FormikValues, I>({

FILE: src/components/ToolHeader.tsx
  type ToolHeaderProps (line 24) | interface ToolHeaderProps {
  function ToolLinks (line 32) | function ToolLinks() {
  function ToolHeader (line 90) | function ToolHeader({

FILE: src/components/ToolInfo.tsx
  type ExampleProps (line 3) | interface ExampleProps {
  function ToolInfo (line 8) | function ToolInfo({ title, description }: ExampleProps) {

FILE: src/components/ToolInputAndResult.tsx
  function ToolInputAndResult (line 4) | function ToolInputAndResult({

FILE: src/components/ToolLayout.tsx
  function ToolLayout (line 17) | function ToolLayout({

FILE: src/components/UserTypeFilter.tsx
  type UserTypeFilterProps (line 6) | interface UserTypeFilterProps {
  function UserTypeFilter (line 12) | function UserTypeFilter({

FILE: src/components/allTools/AllTools.tsx
  type ToolCardProps (line 7) | interface ToolCardProps {
  type AllToolsProps (line 14) | interface AllToolsProps {
  function AllTools (line 19) | function AllTools({ title, toolCards }: AllToolsProps) {

FILE: src/components/allTools/ToolCard.tsx
  function ToolCard (line 15) | function ToolCard({

FILE: src/components/examples/ExampleCard.tsx
  type ExampleCardProps (line 14) | interface ExampleCardProps<T> {
  function ExampleCard (line 24) | function ExampleCard<T>({

FILE: src/components/examples/ExampleOptions.tsx
  function ExampleOptions (line 5) | function ExampleOptions<T>({

FILE: src/components/examples/ToolExamples.tsx
  type CardExampleType (line 8) | type CardExampleType<T> = Omit<
  type ExampleProps (line 13) | interface ExampleProps<T> {
  function ToolExamples (line 21) | function ToolExamples<T>({

FILE: src/components/input/BaseFileInput.tsx
  type BaseFileInputComponentProps (line 17) | interface BaseFileInputComponentProps extends BaseFileInputProps {
  function BaseFileInput (line 22) | function BaseFileInput({

FILE: src/components/input/InputFooter.tsx
  function InputFooter (line 8) | function InputFooter({

FILE: src/components/input/NumericInputWithUnit.tsx
  function NumericInputWithUnit (line 20) | function NumericInputWithUnit(props: {

FILE: src/components/input/ToolAudioInput.tsx
  type AudioFileInputProps (line 7) | interface AudioFileInputProps extends Omit<BaseFileInputProps, 'accept'> {
  constant AUDIO_ACCEPT_TYPES (line 11) | const AUDIO_ACCEPT_TYPES = [
  function ToolAudioInput (line 16) | function ToolAudioInput({

FILE: src/components/input/ToolCodeInput.tsx
  function ToolCodeInput (line 13) | function ToolCodeInput({

FILE: src/components/input/ToolImageInput.tsx
  type ImageFileInputProps (line 9) | interface ImageFileInputProps extends BaseFileInputProps {
  function ToolImageInput (line 20) | function ToolImageInput({

FILE: src/components/input/ToolMultipleAudioInput.tsx
  type MultiAudioInputComponentProps (line 11) | interface MultiAudioInputComponentProps {
  type MultiAudioInput (line 19) | interface MultiAudioInput {
  function ToolMultipleAudioInput (line 24) | function ToolMultipleAudioInput({

FILE: src/components/input/ToolMultipleImageInput.tsx
  type MultiImageInputComponentProps (line 9) | interface MultiImageInputComponentProps {
  type MultiImageInput (line 17) | interface MultiImageInput {
  function ToolMultiImageInput (line 23) | function ToolMultiImageInput({

FILE: src/components/input/ToolMultiplePdfInput.tsx
  type MultiPdfInputComponentProps (line 11) | interface MultiPdfInputComponentProps {
  type MultiPdfInput (line 19) | interface MultiPdfInput {
  function ToolMultiFileInput (line 24) | function ToolMultiFileInput({

FILE: src/components/input/ToolMultipleVideoInput.tsx
  type MultiVideoInputComponentProps (line 10) | interface MultiVideoInputComponentProps {
  type MultiVideoInput (line 18) | interface MultiVideoInput {
  function ToolMultipleVideoInput (line 23) | function ToolMultipleVideoInput({

FILE: src/components/input/ToolPdfInput.tsx
  type PdfFileInputProps (line 5) | interface PdfFileInputProps extends BaseFileInputProps {}
  function ToolPdfInput (line 7) | function ToolPdfInput({ ...props }: PdfFileInputProps) {

FILE: src/components/input/ToolTextInput.tsx
  function ToolTextInput (line 8) | function ToolTextInput({

FILE: src/components/input/ToolVideoInput.tsx
  type VideoFileInputProps (line 8) | interface VideoFileInputProps extends Omit<BaseFileInputProps, 'accept'> {
  function ToolVideoInput (line 16) | function ToolVideoInput({

FILE: src/components/input/file-input-utils.ts
  type BaseFileInputProps (line 1) | interface BaseFileInputProps {

FILE: src/components/options/ColorSelector.tsx
  type ColorSelectorProps (line 8) | interface ColorSelectorProps {

FILE: src/components/options/SelectWithDesc.tsx
  type Option (line 10) | interface Option<T extends string | boolean> {

FILE: src/components/options/SimpleRadio.tsx
  type SimpleRadioProps (line 7) | interface SimpleRadioProps {

FILE: src/components/options/TextFieldWithDesc.tsx
  type OwnProps (line 5) | type OwnProps = {

FILE: src/components/options/ToolOptionGroups.tsx
  type ToolOptionGroup (line 5) | interface ToolOptionGroup {
  function ToolOptionGroups (line 10) | function ToolOptionGroups({

FILE: src/components/options/ToolOptions.tsx
  type UpdateField (line 9) | type UpdateField<T> = <Y extends keyof T>(field: Y, value: T[Y]) => void;
  type NonEmptyArray (line 10) | type NonEmptyArray<T> = [T, ...T[]];
  type GetGroupsType (line 11) | type GetGroupsType<T> = (
  function ToolOptions (line 15) | function ToolOptions<T extends FormikValues>({

FILE: src/components/result/ResultFooter.tsx
  function ResultFooter (line 8) | function ResultFooter({

FILE: src/components/result/ToolFileResult.tsx
  function ToolFileResult (line 10) | function ToolFileResult({

FILE: src/components/result/ToolMultiFileResult.tsx
  function ToolMultiFileResult (line 16) | function ToolMultiFileResult({

FILE: src/components/result/ToolTextResult.tsx
  function ToolTextResult (line 11) | function ToolTextResult({

FILE: src/contexts/CustomSnackBarContext.tsx
  type CustomSnackBarContext (line 5) | type CustomSnackBarContext = {
  type Props (line 14) | interface Props {

FILE: src/datatables/index.ts
  function dataTableLookup (line 4) | function dataTableLookup(table: DataTable, key: string): any {

FILE: src/datatables/types.ts
  type DataTable (line 6) | interface DataTable {

FILE: src/hooks/useDebounce.ts
  function useDebounce (line 10) | function useDebounce<T extends (...args: never[]) => void>(

FILE: src/hooks/usePrevious.ts
  function usePrevious (line 7) | function usePrevious<T>(value: T): T | undefined {

FILE: src/hooks/useTimeout.ts
  function useTimeout (line 8) | function useTimeout(callback: () => void, delay: number) {

FILE: src/i18n/index.ts
  type I18nNamespaces (line 22) | type I18nNamespaces = (typeof validNamespaces)[number];
  type FullI18nKey (line 23) | type FullI18nKey = {

FILE: src/lib/ghostscript/background-worker.js
  function loadScript (line 3) | function loadScript() {
  function compressPdf (line 9) | function compressPdf(dataStruct, responseCallback) {
  function protectPdf (line 85) | function protectPdf(dataStruct, responseCallback) {

FILE: src/lib/ghostscript/gs-worker.js
  function locateFile (line 57) | function locateFile(path) {
  function assert (line 446) | function assert(condition, text) {
  function updateMemoryViews (line 476) | function updateMemoryViews() {
  function writeStackCookie (line 513) | function writeStackCookie() {
  function checkStackCookie (line 531) | function checkStackCookie() {
  function preRun (line 578) | function preRun() {
  function initRuntime (line 589) | function initRuntime() {
  function preMain (line 602) | function preMain() {
  function exitRuntime (line 608) | function exitRuntime() {
  function postRun (line 618) | function postRun() {
  function addOnPreRun (line 632) | function addOnPreRun(cb) {
  function addOnInit (line 636) | function addOnInit(cb) {
  function addOnPreMain (line 640) | function addOnPreMain(cb) {
  function addOnExit (line 644) | function addOnExit(cb) {
  function addOnPostRun (line 648) | function addOnPostRun(cb) {
  function getUniqueRunDependency (line 690) | function getUniqueRunDependency(id) {
  function addRunDependency (line 698) | function addRunDependency(id) {
  function removeRunDependency (line 732) | function removeRunDependency(id) {
  function abort (line 757) | function abort(what) {
  function createExportWrapper (line 808) | function createExportWrapper(name) {
  function getBinarySync (line 832) | function getBinarySync(file) {
  function getBinaryPromise (line 842) | function getBinaryPromise(binaryFile) {
  function instantiateArrayBuffer (line 875) | function instantiateArrayBuffer(binaryFile, imports, receiver) {
  function instantiateAsync (line 893) | function instantiateAsync(binary, binaryFile, imports, callback) {
  function createWasm (line 933) | function createWasm() {
  function legacyModuleProp (line 1010) | function legacyModuleProp(prop, newName, incoming = true) {
  function ignoredModuleProp (line 1024) | function ignoredModuleProp(prop) {
  function isExportedByForceFilesystem (line 1033) | function isExportedByForceFilesystem(name) {
  function missingGlobal (line 1047) | function missingGlobal(sym, msg) {
  function missingLibrarySymbol (line 1062) | function missingLibrarySymbol(sym) {
  function unexportedRuntimeSymbol (line 1095) | function unexportedRuntimeSymbol(sym) {
  function dbg (line 1112) | function dbg(...args) {
  function ExitStatus (line 1122) | function ExitStatus(status) {
  function getValue (line 1139) | function getValue(ptr, type = 'i8') {
  function setValue (line 1177) | function setValue(ptr, value, type = 'i8') {
  function trim (line 1453) | function trim(arr) {
  function intArrayFromString (line 1563) | function intArrayFromString(stringy, dontAddNull, length) {
  method init (line 1627) | init() {
  method shutdown (line 1637) | shutdown() {
  method register (line 1648) | register(dev, ops) {
  method open (line 1653) | open(stream) {
  method close (line 1661) | close(stream) {
  method fsync (line 1665) | fsync(stream) {
  method read (line 1668) | read(stream, buffer, offset, length, pos /* ignored */) {
  method write (line 1692) | write(stream, buffer, offset, length, pos) {
  method get_char (line 1710) | get_char(tty) {
  method put_char (line 1713) | put_char(tty, val) {
  method fsync (line 1721) | fsync(tty) {
  method ioctl_tcgets (line 1727) | ioctl_tcgets(tty) {
  method ioctl_tcsets (line 1741) | ioctl_tcsets(tty, optional_actions, data) {
  method ioctl_tiocgwinsz (line 1745) | ioctl_tiocgwinsz(tty) {
  method put_char (line 1750) | put_char(tty, val) {
  method fsync (line 1758) | fsync(tty) {
  method mount (line 1783) | mount(mount) {
  method createNode (line 1786) | createNode(parent, name, mode, dev) {
  method getFileDataAsTypedArray (line 1866) | getFileDataAsTypedArray(node) {
  method expandFileStorage (line 1872) | expandFileStorage(node, newCapacity) {
  method resizeFileStorage (line 1890) | resizeFileStorage(node, newSize) {
  method getattr (line 1907) | getattr(node) {
  method setattr (line 1935) | setattr(node, attr) {
  method lookup (line 1946) | lookup(parent, name) {
  method mknod (line 1949) | mknod(parent, name, mode, dev) {
  method rename (line 1952) | rename(old_node, new_dir, new_name) {
  method unlink (line 1973) | unlink(parent, name) {
  method rmdir (line 1977) | rmdir(parent, name) {
  method readdir (line 1985) | readdir(node) {
  method symlink (line 1992) | symlink(parent, newname, oldpath) {
  method readlink (line 1997) | readlink(node) {
  method read (line 2005) | read(stream, buffer, offset, length, position) {
  method write (line 2019) | write(stream, buffer, offset, length, position, canOwn) {
  method llseek (line 2069) | llseek(stream, offset, whence) {
  method allocate (line 2083) | allocate(stream, offset, length) {
  method mmap (line 2087) | mmap(stream, length, position, prot, flags) {
  method msync (line 2122) | msync(stream, buffer, offset, length, mmapFlags) {
  function processData (line 2189) | function processData(byteArray) {
  method constructor (line 2501) | constructor(errno) {
  method constructor (line 2519) | constructor() {
  method object (line 2524) | get object() {
  method object (line 2527) | set object(val) {
  method isRead (line 2530) | get isRead() {
  method isWrite (line 2533) | get isWrite() {
  method isAppend (line 2536) | get isAppend() {
  method flags (line 2539) | get flags() {
  method flags (line 2542) | set flags(val) {
  method position (line 2545) | get position() {
  method position (line 2548) | set position(val) {
  method constructor (line 2553) | constructor(parent, name, mode, rdev) {
  method read (line 2569) | get read() {
  method read (line 2572) | set read(val) {
  method write (line 2575) | get write() {
  method write (line 2578) | set write(val) {
  method isFolder (line 2581) | get isFolder() {
  method isDevice (line 2584) | get isDevice() {
  method lookupPath (line 2588) | lookupPath(path, opts = {}) {
  method getPath (line 2651) | getPath(node) {
  method hashName (line 2665) | hashName(parentid, name) {
  method hashAddNode (line 2673) | hashAddNode(node) {
  method hashRemoveNode (line 2678) | hashRemoveNode(node) {
  method lookupNode (line 2693) | lookupNode(parent, name) {
  method createNode (line 2708) | createNode(parent, name, mode, rdev) {
  method destroyNode (line 2716) | destroyNode(node) {
  method isRoot (line 2719) | isRoot(node) {
  method isMountpoint (line 2722) | isMountpoint(node) {
  method isFile (line 2725) | isFile(mode) {
  method isDir (line 2728) | isDir(mode) {
  method isLink (line 2731) | isLink(mode) {
  method isChrdev (line 2734) | isChrdev(mode) {
  method isBlkdev (line 2737) | isBlkdev(mode) {
  method isFIFO (line 2740) | isFIFO(mode) {
  method isSocket (line 2743) | isSocket(mode) {
  method flagsToPermissionString (line 2746) | flagsToPermissionString(flag) {
  method nodePermissions (line 2753) | nodePermissions(node, perms) {
  method mayLookup (line 2767) | mayLookup(dir) {
  method mayCreate (line 2774) | mayCreate(dir, name) {
  method mayDelete (line 2781) | mayDelete(dir, name, isdir) {
  method mayOpen (line 2806) | mayOpen(node, flags) {
  method nextfd (line 2824) | nextfd() {
  method getStreamChecked (line 2832) | getStreamChecked(fd) {
  method createStream (line 2840) | createStream(stream, fd = -1) {
  method closeStream (line 2850) | closeStream(fd) {
  method dupStream (line 2853) | dupStream(origStream, fd = -1) {
  method open (line 2859) | open(stream) {
  method llseek (line 2866) | llseek() {
  method registerDevice (line 2873) | registerDevice(dev, ops) {
  method getMounts (line 2877) | getMounts(mount) {
  method syncfs (line 2891) | syncfs(populate, callback) {
  method mount (line 2935) | mount(type, opts, mountpoint) {
  method unmount (line 2988) | unmount(mountpoint) {
  method lookup (line 3022) | lookup(parent, name) {
  method mknod (line 3025) | mknod(path, mode, dev) {
  method create (line 3041) | create(path, mode) {
  method mkdir (line 3047) | mkdir(path, mode) {
  method mkdirTree (line 3053) | mkdirTree(path, mode) {
  method mkdev (line 3066) | mkdev(path, mode, dev) {
  method symlink (line 3074) | symlink(oldpath, newpath) {
  method rename (line 3093) | rename(old_path, new_path) {
  method rmdir (line 3175) | rmdir(path) {
  method readdir (line 3193) | readdir(path) {
  method unlink (line 3201) | unlink(path) {
  method readlink (line 3225) | readlink(path) {
  method stat (line 3239) | stat(path, dontFollow) {
  method lstat (line 3250) | lstat(path) {
  method chmod (line 3253) | chmod(path, mode, dontFollow) {
  method lchmod (line 3269) | lchmod(path, mode) {
  method fchmod (line 3272) | fchmod(fd, mode) {
  method chown (line 3276) | chown(path, uid, gid, dontFollow) {
  method lchown (line 3292) | lchown(path, uid, gid) {
  method fchown (line 3295) | fchown(fd, uid, gid) {
  method truncate (line 3299) | truncate(path, len) {
  method ftruncate (line 3328) | ftruncate(fd, len) {
  method utime (line 3335) | utime(path, atime, mtime) {
  method open (line 3342) | open(path, flags, mode) {
  method close (line 3432) | close(stream) {
  method isClosed (line 3448) | isClosed(stream) {
  method llseek (line 3451) | llseek(stream, offset, whence) {
  method read (line 3465) | read(stream, buffer, offset, length, position) {
  method write (line 3498) | write(stream, buffer, offset, length, position, canOwn) {
  method allocate (line 3536) | allocate(stream, offset, length) {
  method mmap (line 3554) | mmap(stream, length, position, prot, flags) {
  method msync (line 3576) | msync(stream, buffer, offset, length, mmapFlags) {
  method ioctl (line 3583) | ioctl(stream, cmd, arg) {
  method readFile (line 3589) | readFile(path, opts = {}) {
  method writeFile (line 3609) | writeFile(path, data, opts = {}) {
  method chdir (line 3624) | chdir(path) {
  method createDefaultDirectories (line 3638) | createDefaultDirectories() {
  method createDefaultDevices (line 3643) | createDefaultDevices() {
  method createSpecialDirectories (line 3676) | createSpecialDirectories() {
  method createStandardStreams (line 3706) | createStandardStreams() {
  method staticInit (line 3739) | staticInit() {
  method init (line 3758) | init(input, output, error) {
  method quit (line 3772) | quit() {
  method findObject (line 3785) | findObject(path, dontResolveLastLink) {
  method analyzePath (line 3792) | analyzePath(path, dontResolveLastLink) {
  method createPath (line 3826) | createPath(parent, path, canRead, canWrite) {
  method createFile (line 3842) | createFile(parent, name, properties, canRead, canWrite) {
  method createDataFile (line 3850) | createDataFile(parent, name, data, canRead, canWrite, canOwn) {
  method createDevice (line 3873) | createDevice(parent, name, input, output) {
  method forceLoadFile (line 3930) | forceLoadFile(obj) {
  method createLazyFile (line 3950) | createLazyFile(parent, name, url, canRead, canWrite) {
  method absolutePath (line 4136) | absolutePath() {
  method createFolder (line 4139) | createFolder() {
  method createLink (line 4142) | createLink() {
  method joinPath (line 4145) | joinPath() {
  method mmapAlloc (line 4148) | mmapAlloc() {
  method standardizePath (line 4151) | standardizePath() {
  method calculateAt (line 4158) | calculateAt(dirfd, path, allowEmpty) {
  method doStat (line 4178) | doStat(func, path, buf) {
  method doMsync (line 4261) | doMsync(addr, stream, len, flags, offset) {
  method get (line 4273) | get() {
  method getp (line 4280) | getp() {
  method getStr (line 4283) | getStr(ptr) {
  method getStreamFromFD (line 4287) | getStreamFromFD(fd) {
  function ___syscall_dup (line 4292) | function ___syscall_dup(fd) {
  function ___syscall_dup3 (line 4302) | function ___syscall_dup3(fd, newfd, flags) {
  function ___syscall_fcntl64 (line 4316) | function ___syscall_fcntl64(fd, cmd, varargs) {
  function ___syscall_fstat64 (line 4361) | function ___syscall_fstat64(fd, buf) {
  function ___syscall_getdents64 (line 4379) | function ___syscall_getdents64(fd, dirp, count) {
  function ___syscall_ioctl (line 4453) | function ___syscall_ioctl(fd, op, varargs) {
  function ___syscall_lstat64 (line 4554) | function ___syscall_lstat64(path, buf) {
  function ___syscall_newfstatat (line 4564) | function ___syscall_newfstatat(dirfd, path, buf, flags) {
  function ___syscall_openat (line 4579) | function ___syscall_openat(dirfd, path, flags, varargs) {
  function ___syscall_renameat (line 4592) | function ___syscall_renameat(olddirfd, oldpath, newdirfd, newpath) {
  function ___syscall_rmdir (line 4606) | function ___syscall_rmdir(path) {
  function ___syscall_stat64 (line 4617) | function ___syscall_stat64(path, buf) {
  function ___syscall_unlinkat (line 4627) | function ___syscall_unlinkat(dirfd, path, flags) {
  function __gmtime_js (line 4659) | function __gmtime_js(time_low, time_high, tmPtr) {
  function __localtime_js (line 4695) | function __localtime_js(time_low, time_high, tmPtr) {
  function extractZone (line 4812) | function extractZone(date) {
  function _fd_close (line 5022) | function _fd_close(fd) {
  function _fd_pread (line 5051) | function _fd_pread(fd, iov, iovcnt, offset_low, offset_high, pnum) {
  function _fd_pwrite (line 5083) | function _fd_pwrite(fd, iov, iovcnt, offset_low, offset_high, pnum) {
  function _fd_read (line 5098) | function _fd_read(fd, iov, iovcnt, pnum) {
  function _fd_seek (line 5110) | function _fd_seek(fd, offset_low, offset_high, whence, newOffset) {
  function _fd_write (line 5138) | function _fd_write(fd, iov, iovcnt, pnum) {
  function checkIncomingModuleAPI (line 5195) | function checkIncomingModuleAPI() {
  function invoke_vi (line 5345) | function invoke_vi(index, a1) {
  function invoke_ii (line 5356) | function invoke_ii(index, a1) {
  function invoke_vii (line 5367) | function invoke_vii(index, a1, a2) {
  function invoke_iii (line 5378) | function invoke_iii(index, a1, a2) {
  function invoke_viii (line 5389) | function invoke_viii(index, a1, a2, a3) {
  function invoke_iiii (line 5400) | function invoke_iiii(index, a1, a2, a3) {
  function invoke_viiii (line 5411) | function invoke_viiii(index, a1, a2, a3, a4) {
  function invoke_iiiii (line 5422) | function invoke_iiiii(index, a1, a2, a3, a4) {
  function callMain (line 5727) | function callMain(args = []) {
  function stackCheckInit (line 5761) | function stackCheckInit() {
  function run (line 5770) | function run(args = arguments_) {
  function flushMessages (line 5841) | function flushMessages() {
  function messageResender (line 5852) | function messageResender() {

FILE: src/lib/ghostscript/worker-init.ts
  constant COMPRESS_ACTION (line 1) | const COMPRESS_ACTION = 'compress-pdf';
  constant PROTECT_ACTION (line 2) | const PROTECT_ACTION = 'protect-pdf';
  function compressWithGhostScript (line 4) | async function compressWithGhostScript(dataStruct: {
  function protectWithGhostScript (line 15) | async function protectWithGhostScript(dataStruct: {

FILE: src/pages/home/Categories.tsx
  type ArrayElement (line 14) | type ArrayElement<ArrayType extends readonly unknown[]> =
  function Categories (line 116) | function Categories() {

FILE: src/pages/home/index.tsx
  function Home (line 8) | function Home() {

FILE: src/pages/tools-by-category/index.tsx
  function ToolsByCategory (line 36) | function ToolsByCategory() {

FILE: src/pages/tools/audio/change-speed/index.tsx
  function ChangeSpeed (line 25) | function ChangeSpeed({

FILE: src/pages/tools/audio/change-speed/service.ts
  function computeAudioFilter (line 5) | function computeAudioFilter(speed: number): string {
  function changeAudioSpeed (line 23) | async function changeAudioSpeed(

FILE: src/pages/tools/audio/change-speed/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/audio/extract-audio/extract-audio.service.test.ts
  function createMockVideoFile (line 16) | function createMockVideoFile(): File {

FILE: src/pages/tools/audio/extract-audio/index.tsx
  function ExtractAudio (line 17) | function ExtractAudio({

FILE: src/pages/tools/audio/extract-audio/service.ts
  function extractAudioFromVideo (line 7) | async function extractAudioFromVideo(

FILE: src/pages/tools/audio/extract-audio/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/audio/merge-audio/index.tsx
  function MergeAudio (line 24) | function MergeAudio({

FILE: src/pages/tools/audio/merge-audio/service.ts
  function mergeAudioFiles (line 7) | async function mergeAudioFiles(

FILE: src/pages/tools/audio/merge-audio/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/audio/trim/index.tsx
  function Trim (line 25) | function Trim({ title, longDescription }: ToolComponentProps) {

FILE: src/pages/tools/audio/trim/service.ts
  function trimAudio (line 7) | async function trimAudio(

FILE: src/pages/tools/audio/trim/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/converters/audio-converter/index.tsx
  function AudioConverter (line 17) | function AudioConverter({ title }: ToolComponentProps) {

FILE: src/pages/tools/converters/audio-converter/service.ts
  function loadFFmpeg (line 13) | async function loadFFmpeg() {
  function convertAudio (line 28) | async function convertAudio(

FILE: src/pages/tools/converters/audio-converter/types.ts
  constant AUDIO_FORMATS (line 1) | const AUDIO_FORMATS = {
  type AudioFormat (line 12) | type AudioFormat = keyof typeof AUDIO_FORMATS;
  type InitialValuesType (line 14) | type InitialValuesType = {

FILE: src/pages/tools/csv/change-csv-separator/index.tsx
  function ChangeCsvDelimiter (line 118) | function ChangeCsvDelimiter({

FILE: src/pages/tools/csv/change-csv-separator/service.ts
  function changeCsvSeparator (line 4) | function changeCsvSeparator(

FILE: src/pages/tools/csv/change-csv-separator/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/csv/csv-rows-to-columns/index.tsx
  type InitialValuesType (line 18) | type InitialValuesType = typeof initialValues;
  function CsvRowsToColumns (line 77) | function CsvRowsToColumns({

FILE: src/pages/tools/csv/csv-rows-to-columns/service.ts
  function compute (line 1) | function compute(rows: string[][], columnCount: number): string[][] {
  function csvRowsToColumns (line 14) | function csvRowsToColumns(

FILE: src/pages/tools/csv/csv-to-json/index.tsx
  type InitialValuesType (line 13) | type InitialValuesType = {
  function CsvToJson (line 115) | function CsvToJson({ title }: ToolComponentProps) {

FILE: src/pages/tools/csv/csv-to-json/service.ts
  type CsvToJsonOptions (line 1) | type CsvToJsonOptions = {
  function containsOnlyCustomCharAndSpaces (line 100) | function containsOnlyCustomCharAndSpaces(str: string, customChar: string) {

FILE: src/pages/tools/csv/csv-to-tsv/index.tsx
  type InitialValuesType (line 20) | type InitialValuesType = typeof initialValues;
  function CsvToTsv (line 98) | function CsvToTsv({

FILE: src/pages/tools/csv/csv-to-tsv/service.ts
  function csvToTsv (line 2) | function csvToTsv(

FILE: src/pages/tools/csv/csv-to-xml/index.tsx
  type InitialValuesType (line 12) | type InitialValuesType = {
  function CsvToXml (line 52) | function CsvToXml({ title }: ToolComponentProps) {

FILE: src/pages/tools/csv/csv-to-xml/service.ts
  type CsvToXmlOptions (line 1) | type CsvToXmlOptions = {

FILE: src/pages/tools/csv/csv-to-yaml/index.tsx
  function CsvToYaml (line 111) | function CsvToYaml({

FILE: src/pages/tools/csv/csv-to-yaml/service.ts
  function toYaml (line 5) | function toYaml(
  function main (line 43) | function main(input: string, options: InitialValuesType): string {

FILE: src/pages/tools/csv/csv-to-yaml/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/csv/find-incomplete-csv-records/index.tsx
  function FindIncompleteCsvRecords (line 103) | function FindIncompleteCsvRecords({

FILE: src/pages/tools/csv/find-incomplete-csv-records/service.ts
  function generateMessage (line 4) | function generateMessage(
  function findIncompleteCsvRecords (line 44) | function findIncompleteCsvRecords(

FILE: src/pages/tools/csv/find-incomplete-csv-records/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/csv/insert-csv-columns/index.tsx
  function InsertCsvColumns (line 122) | function InsertCsvColumns({

FILE: src/pages/tools/csv/insert-csv-columns/service.ts
  function main (line 5) | function main(input: string, options: InitialValuesType): string {

FILE: src/pages/tools/csv/insert-csv-columns/types.ts
  type insertingPosition (line 1) | type insertingPosition = 'prepend' | 'append' | 'custom';
  type customPostion (line 2) | type customPostion = 'headerName' | 'rowNumber';
  type InitialValuesType (line 4) | type InitialValuesType = {

FILE: src/pages/tools/csv/swap-csv-columns/index.tsx
  function CsvToTsv (line 135) | function CsvToTsv({

FILE: src/pages/tools/csv/swap-csv-columns/service.ts
  function retrieveFromAndTo (line 4) | function retrieveFromAndTo(
  function swap (line 25) | function swap(lines: string[][], from: number, to: number): string[][] {
  function csvColumnsSwap (line 36) | function csvColumnsSwap(input: string, options: InitialValuesType) {

FILE: src/pages/tools/csv/swap-csv-columns/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/csv/transpose-csv/index.tsx
  function TransposeCsv (line 90) | function TransposeCsv({

FILE: src/pages/tools/csv/transpose-csv/service.ts
  function transposeCSV (line 5) | function transposeCSV(

FILE: src/pages/tools/csv/transpose-csv/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/csv/tsv-to-json/index.tsx
  function TsvToJson (line 124) | function TsvToJson({

FILE: src/pages/tools/csv/tsv-to-json/service.ts
  function convertTsvToJson (line 5) | function convertTsvToJson(
  function containsOnlyCustomCharAndSpaces (line 92) | function containsOnlyCustomCharAndSpaces(str: string, customChar: string) {

FILE: src/pages/tools/csv/tsv-to-json/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/image/generic/change-colors/index.tsx
  function ChangeColorsInImage (line 22) | function ChangeColorsInImage({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/change-opacity/index.tsx
  type InitialValuesType (line 13) | type InitialValuesType = {
  function ChangeOpacity (line 83) | function ChangeOpacity({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/change-opacity/service.ts
  type OpacityOptions (line 1) | interface OpacityOptions {
  function changeOpacity (line 12) | async function changeOpacity(
  function applySolidOpacity (line 53) | function applySolidOpacity(
  function applyGradientOpacity (line 63) | function applyGradientOpacity(
  function createLinearGradient (line 82) | function createLinearGradient(
  function createRadialGradient (line 98) | function createRadialGradient(

FILE: src/pages/tools/image/generic/compress/index.tsx
  function CompressImage (line 22) | function CompressImage({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/compress/types.ts
  type InitialValuesType (line 1) | interface InitialValuesType {

FILE: src/pages/tools/image/generic/convert-to-jpg/index.tsx
  function ConvertToJpg (line 21) | function ConvertToJpg({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/create-transparent/index.tsx
  function CreateTransparent (line 23) | function CreateTransparent({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/crop/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = typeof initialValues;
  function CropImage (line 35) | function CropImage({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/editor/index.tsx
  function ImageEditor (line 12) | function ImageEditor({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/image-to-text/index.tsx
  function ImageToText (line 25) | function ImageToText({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/image-to-text/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/image/generic/qr-code/index.tsx
  function QRCodeGenerator (line 170) | function QRCodeGenerator({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/qr-code/types.ts
  type QRCodeType (line 1) | type QRCodeType =
  type WifiEncryptionType (line 10) | type WifiEncryptionType = 'WPA' | 'WEP' | 'None';
  type InitialValuesType (line 12) | interface InitialValuesType {

FILE: src/pages/tools/image/generic/remove-background/index.tsx
  function RemoveBackgroundFromImage (line 14) | function RemoveBackgroundFromImage({

FILE: src/pages/tools/image/generic/resize/index.tsx
  function ResizeImage (line 48) | function ResizeImage({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/resize/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/image/generic/rotate/index.tsx
  function RotateImage (line 32) | function RotateImage({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/generic/rotate/type.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/image/png/compress-png/index.tsx
  function ChangeColorsInPng (line 19) | function ChangeColorsInPng({ title }: ToolComponentProps) {

FILE: src/pages/tools/image/png/convert-jgp-to-png/index.tsx
  function ConvertJgpToPng (line 19) | function ConvertJgpToPng({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/escape-json/index.tsx
  type InitialValuesType (line 16) | type InitialValuesType = typeof initialValues;
  function EscapeJsonTool (line 57) | function EscapeJsonTool({

FILE: src/pages/tools/json/json-comparison/index.tsx
  type InitialValuesType (line 9) | type InitialValuesType = {};
  function JsonComparison (line 13) | function JsonComparison({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/json-to-csv/index.tsx
  function JsonToCsv (line 74) | function JsonToCsv({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/json-to-csv/service.ts
  function flattenRecursive (line 9) | function flattenRecursive(
  function flattenToRows (line 43) | function flattenToRows(json: unknown): Record<string, string>[] {
  function quoteCell (line 60) | function quoteCell(value: string, options: InitialValuesType): string {
  function convertJsonToCsv (line 79) | function convertJsonToCsv(

FILE: src/pages/tools/json/json-to-csv/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/json/json-to-xml/index.tsx
  type InitialValuesType (line 12) | type InitialValuesType = {
  function JsonToXml (line 59) | function JsonToXml({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/json-to-xml/service.ts
  type JsonToXmlOptions (line 1) | type JsonToXmlOptions = {

FILE: src/pages/tools/json/minify/index.tsx
  type InitialValuesType (line 10) | type InitialValuesType = Record<string, never>;
  function MinifyJson (line 50) | function MinifyJson({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/prettify/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = {
  function PrettifyJson (line 118) | function PrettifyJson({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/stringify/index.tsx
  type InitialValuesType (line 14) | type InitialValuesType = {
  function StringifyJson (line 80) | function StringifyJson({ title }: ToolComponentProps) {

FILE: src/pages/tools/json/validateJson/index.tsx
  function ValidateJson (line 49) | function ValidateJson({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/duplicate/index.tsx
  type InitialValuesType (line 16) | interface InitialValuesType {
  function Duplicate (line 104) | function Duplicate({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/duplicate/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function interweave (line 3) | function interweave(array1: string[], array2: string[]) {
  function duplicate (line 13) | function duplicate(
  function duplicateList (line 58) | function duplicateList(

FILE: src/pages/tools/list/find-most-popular/index.tsx
  function FindMostPopular (line 46) | function FindMostPopular({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/find-most-popular/service.ts
  type SplitOperatorType (line 3) | type SplitOperatorType = 'symbol' | 'regex';
  type DisplayFormat (line 4) | type DisplayFormat = 'count' | 'percentage' | 'total';
  type SortingMethod (line 5) | type SortingMethod = 'count' | 'alphabetic';
  function dictSorter (line 8) | function dictSorter(
  function displayFormater (line 32) | function displayFormater(
  function TopItemsList (line 61) | function TopItemsList(

FILE: src/pages/tools/list/find-unique/index.tsx
  function FindUnique (line 38) | function FindUnique() {

FILE: src/pages/tools/list/find-unique/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function uniqueListBuilder (line 4) | function uniqueListBuilder(
  function findUniqueCompute (line 24) | function findUniqueCompute(

FILE: src/pages/tools/list/group/index.tsx
  type InitialValuesType (line 28) | type InitialValuesType = typeof initialValues;
  function ChunkList (line 121) | function ChunkList({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/group/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function chunkMaker (line 4) | function chunkMaker(array: string[], chunkNumber: number): string[][] {
  function chunkFiller (line 13) | function chunkFiller(
  function chunkJoinerAndWrapper (line 32) | function chunkJoinerAndWrapper(
  function chunkList (line 43) | function chunkList(

FILE: src/pages/tools/list/reverse/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = typeof initialValues;
  function Reverse (line 114) | function Reverse({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/reverse/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function reverseList (line 3) | function reverseList(

FILE: src/pages/tools/list/rotate/index.tsx
  function Rotate (line 55) | function Rotate({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/rotate/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function rotateArray (line 3) | function rotateArray(array: string[], step: number, right: boolean): str...
  function rotateList (line 22) | function rotateList(

FILE: src/pages/tools/list/shuffle/index.tsx
  function Shuffle (line 35) | function Shuffle() {

FILE: src/pages/tools/list/shuffle/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function shuffleArray (line 4) | function shuffleArray(array: string[]): string[] {
  function shuffleList (line 13) | function shuffleList(

FILE: src/pages/tools/list/sort/index.tsx
  function SortList (line 40) | function SortList({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/sort/service.ts
  type SortingMethod (line 3) | type SortingMethod = 'numeric' | 'alphabetic' | 'length';
  type SplitOperatorType (line 4) | type SplitOperatorType = 'symbol' | 'regex';
  function customNumericSort (line 7) | function customNumericSort(a: string, b: string, increasing: boolean): n...
  function numericSort (line 21) | function numericSort(
  function customLengthSort (line 35) | function customLengthSort(a: string, b: string, increasing: boolean): nu...
  function lengthSort (line 39) | function lengthSort(
  function customAlphabeticSort (line 53) | function customAlphabeticSort(
  function alphabeticSort (line 67) | function alphabeticSort(
  function Sort (line 85) | function Sort(

FILE: src/pages/tools/list/truncate/index.tsx
  type InitialValuesType (line 14) | interface InitialValuesType {
  function Truncate (line 84) | function Truncate({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/truncate/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function truncateList (line 3) | function truncateList(

FILE: src/pages/tools/list/unwrap/index.tsx
  type InitialValuesType (line 15) | interface InitialValuesType {
  function Unwrap (line 96) | function Unwrap({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/unwrap/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function leftUnwrap (line 3) | function leftUnwrap(
  function rightUnwrap (line 18) | function rightUnwrap(
  function unwrapList (line 33) | function unwrapList(

FILE: src/pages/tools/list/wrap/index.tsx
  type InitialValuesType (line 16) | interface InitialValuesType {
  function Wrap (line 88) | function Wrap({ title }: ToolComponentProps) {

FILE: src/pages/tools/list/wrap/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function wrap (line 3) | function wrap(array: string[], left: string, right: string): string[] {
  function wrapList (line 7) | function wrapList(

FILE: src/pages/tools/number/arithmetic-sequence/index.tsx
  type InitialValuesType (line 12) | type InitialValuesType = {
  function ArithmeticSequence (line 73) | function ArithmeticSequence({ title }: ToolComponentProps) {

FILE: src/pages/tools/number/arithmetic-sequence/service.ts
  function generateArithmeticSequence (line 1) | function generateArithmeticSequence(

FILE: src/pages/tools/number/byte-converter/index.tsx
  function ByteConverter (line 103) | function ByteConverter({ title }: ToolComponentProps) {

FILE: src/pages/tools/number/byte-converter/service.ts
  function compute (line 3) | function compute(
  function byteConverter (line 15) | function byteConverter(input: string, options: InitialValuesType) {

FILE: src/pages/tools/number/byte-converter/types.ts
  type SIUnit (line 1) | type SIUnit = 'b' | 'B' | 'KB' | 'MB' | 'GB' | 'TB' | 'PB' | 'EB';
  type IECUnit (line 2) | type IECUnit = 'b' | 'B' | 'KiB' | 'MiB' | 'GiB' | 'TiB' | 'PiB' | 'EiB';
  type DataUnit (line 4) | type DataUnit = SIUnit | IECUnit;
  constant SI_UNITS (line 6) | const SI_UNITS: SIUnit[] = ['b', 'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB'];
  constant IEC_UNITS (line 7) | const IEC_UNITS: IECUnit[] = [
  constant DATA_UNITS (line 18) | const DATA_UNITS: DataUnit[] = [
  constant UNIT_MAP (line 23) | const UNIT_MAP: Record<DataUnit, number> = {
  type InitialValuesType (line 40) | type InitialValuesType = {

FILE: src/pages/tools/number/generate/index.tsx
  function GenerateNumbers (line 17) | function GenerateNumbers({ title }: ToolComponentProps) {

FILE: src/pages/tools/number/generate/service.ts
  function listOfIntegers (line 1) | function listOfIntegers(

FILE: src/pages/tools/number/generic-calc/data/types.ts
  type AlternativeVarInfo (line 4) | interface AlternativeVarInfo {
  type GenericCalcType (line 11) | interface GenericCalcType extends Omit<ToolMeta, 'component'> {

FILE: src/pages/tools/number/generic-calc/index.tsx
  function numericSolveEquationFor (line 32) | function numericSolveEquationFor(
  function makeTool (line 55) | async function makeTool(

FILE: src/pages/tools/number/generic-calc/meta.ts
  function importComponent (line 6) | async function importComponent(data: GenericCalcType) {
  function importComponent2 (line 14) | async function importComponent2() {

FILE: src/pages/tools/number/generic-calc/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/number/random-number-generator/index.tsx
  function RandomNumberGenerator (line 23) | function RandomNumberGenerator({

FILE: src/pages/tools/number/random-number-generator/service.ts
  function generateRandomNumbers (line 6) | function generateRandomNumbers(
  function generateRandomNumber (line 95) | function generateRandomNumber(
  function hasDuplicatesInArray (line 110) | function hasDuplicatesInArray(arr: number[]): boolean {
  function formatNumbers (line 124) | function formatNumbers(
  function validateInput (line 137) | function validateInput(options: InitialValuesType): string | null {

FILE: src/pages/tools/number/random-number-generator/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {
  type RandomNumberResult (line 11) | type RandomNumberResult = {

FILE: src/pages/tools/number/random-port-generator/index.tsx
  function RandomPortGenerator (line 29) | function RandomPortGenerator({

FILE: src/pages/tools/number/random-port-generator/service.ts
  constant PORT_RANGES (line 4) | const PORT_RANGES: Record<string, PortRange> = {
  function generateRandomPorts (line 37) | function generateRandomPorts(
  function generateRandomPort (line 121) | function generateRandomPort(min: number, max: number): number {
  function hasDuplicatesInArray (line 128) | function hasDuplicatesInArray(arr: number[]): boolean {
  function formatPorts (line 142) | function formatPorts(ports: number[], separator: string): string {
  function validateInput (line 149) | function validateInput(options: InitialValuesType): string | null {
  function getPortRangeInfo (line 176) | function getPortRangeInfo(portRange: string): PortRange {
  function isCommonPort (line 183) | function isCommonPort(port: number): boolean {
  function getPortService (line 193) | function getPortService(port: number): string {

FILE: src/pages/tools/number/random-port-generator/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {
  type PortRange (line 11) | type PortRange = {
  type RandomPortResult (line 18) | type RandomPortResult = {

FILE: src/pages/tools/number/sum/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = typeof initialValues;
  function SumNumbers (line 121) | function SumNumbers({ title }: ToolComponentProps) {

FILE: src/pages/tools/number/sum/service.ts
  type NumberExtractionType (line 1) | type NumberExtractionType = 'smart' | 'delimiter';
  function getAllNumbers (line 3) | function getAllNumbers(text: string): number[] {

FILE: src/pages/tools/pdf/compress-pdf/index.tsx
  function CompressPdf (line 50) | function CompressPdf({

FILE: src/pages/tools/pdf/compress-pdf/service.ts
  function compressPdf (line 13) | async function compressPdf(

FILE: src/pages/tools/pdf/compress-pdf/types.ts
  type CompressionLevel (line 1) | type CompressionLevel = 'low' | 'medium' | 'high';
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/pdf/convert-to-pdf/index.tsx
  function ConvertToPdf (line 20) | function ConvertToPdf({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/convert-to-pdf/service.ts
  type ComputeOptions (line 4) | interface ComputeOptions {
  type ComputeResult (line 11) | interface ComputeResult {
  function buildPdf (line 16) | async function buildPdf({

FILE: src/pages/tools/pdf/convert-to-pdf/types.ts
  type Orientation (line 1) | type Orientation = 'portrait' | 'landscape';
  type PageType (line 2) | type PageType = 'a4' | 'full';
  type ImageSize (line 4) | interface ImageSize {
  type FormValues (line 11) | interface FormValues {

FILE: src/pages/tools/pdf/editor/index.tsx
  function PdfEditor (line 7) | function PdfEditor({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/merge-pdf/index.tsx
  function MergePdf (line 11) | function MergePdf({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/merge-pdf/service.ts
  function parsePageRanges (line 9) | function parsePageRanges(
  function splitPdf (line 55) | async function splitPdf(
  function mergePdf (line 83) | async function mergePdf(pdfFiles: File[]): Promise<File> {

FILE: src/pages/tools/pdf/pdf-to-epub/index.tsx
  function PdfToEpub (line 8) | function PdfToEpub({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/pdf-to-epub/service.ts
  function formatTextToParagraphs (line 8) | function formatTextToParagraphs(raw: string): string {
  function convertPdfToEpub (line 17) | async function convertPdfToEpub(pdfFile: File): Promise<File> {

FILE: src/pages/tools/pdf/pdf-to-png/index.tsx
  type ImagePreview (line 8) | type ImagePreview = {
  function PdfToPng (line 14) | function PdfToPng({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/pdf-to-png/service.ts
  type ImagePreview (line 7) | type ImagePreview = {
  function convertPdfToPngImages (line 13) | async function convertPdfToPngImages(pdfFile: File): Promise<{

FILE: src/pages/tools/pdf/protect-pdf/index.tsx
  function ProtectPdf (line 17) | function ProtectPdf({

FILE: src/pages/tools/pdf/protect-pdf/service.ts
  function protectPdf (line 16) | async function protectPdf(

FILE: src/pages/tools/pdf/protect-pdf/types.ts
  type ProtectionType (line 1) | type ProtectionType = 'owner' | 'user';
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/pdf/rotate-pdf/index.tsx
  function RotatePdf (line 57) | function RotatePdf({

FILE: src/pages/tools/pdf/rotate-pdf/service.ts
  function parsePageRanges (line 10) | function parsePageRanges(
  function rotatePdf (line 56) | async function rotatePdf(

FILE: src/pages/tools/pdf/rotate-pdf/types.ts
  type RotationAngle (line 1) | type RotationAngle = 90 | 180 | 270;
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/pdf/split-pdf/index.tsx
  type InitialValuesType (line 13) | type InitialValuesType = {
  function SplitPdf (line 51) | function SplitPdf({ title }: ToolComponentProps) {

FILE: src/pages/tools/pdf/split-pdf/service.ts
  function parsePageRanges (line 9) | function parsePageRanges(
  function splitPdf (line 55) | async function splitPdf(

FILE: src/pages/tools/pdf/utils.ts
  function loadPDFData (line 1) | function loadPDFData(url: string, filename: string): Promise<File> {

FILE: src/pages/tools/string/base64/index.tsx
  function Base64 (line 36) | function Base64({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/base64/service.ts
  function base64 (line 3) | function base64(input: string, encode: boolean): string {

FILE: src/pages/tools/string/base64/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/censor/index.tsx
  function CensorText (line 67) | function CensorText({

FILE: src/pages/tools/string/censor/service.ts
  function censorText (line 3) | function censorText(input: string, options: InitialValuesType): string {
  function escapeRegex (line 37) | function escapeRegex(str: string): string {
  function isSymbol (line 44) | function isSymbol(input: string): boolean {

FILE: src/pages/tools/string/censor/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/create-palindrome/index.tsx
  function CreatePalindrome (line 52) | function CreatePalindrome({

FILE: src/pages/tools/string/create-palindrome/service.ts
  function createPalindrome (line 3) | function createPalindrome(
  function createPalindromeList (line 19) | function createPalindromeList(

FILE: src/pages/tools/string/extract-substring/index.tsx
  function ExtractSubstring (line 58) | function ExtractSubstring({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/extract-substring/service.ts
  function extractSubstring (line 3) | function extractSubstring(

FILE: src/pages/tools/string/hidden-character-detector/index.tsx
  function HiddenCharacterDetector (line 18) | function HiddenCharacterDetector({

FILE: src/pages/tools/string/hidden-character-detector/service.ts
  constant RTL_CHARS (line 4) | const RTL_CHARS = [
  constant INVISIBLE_CHARS (line 14) | const INVISIBLE_CHARS = [
  function getCharacterInfo (line 34) | function getCharacterInfo(char: string, position: number): HiddenCharact...
  function analyzeHiddenCharacters (line 102) | function analyzeHiddenCharacters(
  function main (line 136) | function main(input: string, options: InitialValuesType): string {

FILE: src/pages/tools/string/hidden-character-detector/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {
  type HiddenCharacter (line 8) | interface HiddenCharacter {
  type AnalysisResult (line 19) | interface AnalysisResult {

FILE: src/pages/tools/string/join/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = typeof initialValues;
  function JoinText (line 110) | function JoinText({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/join/service.ts
  function mergeText (line 1) | function mergeText(

FILE: src/pages/tools/string/palindrome/index.tsx
  function Palindrome (line 77) | function Palindrome({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/palindrome/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex';
  function isPalindrome (line 3) | function isPalindrome(word: string, left: number, right: number): boolean {
  function checkPalindromes (line 11) | function checkPalindromes(array: string[]): boolean[] {
  function palindromeList (line 20) | function palindromeList(

FILE: src/pages/tools/string/password-generator/index.tsx
  function PasswordGenerator (line 60) | function PasswordGenerator({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/password-generator/initialValues.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/password-generator/service.ts
  function generatePassword (line 3) | function generatePassword(options: InitialValuesType): string {

FILE: src/pages/tools/string/quote/index.tsx
  type InitialValuesType (line 14) | interface InitialValuesType {
  function Quote (line 73) | function Quote({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/quote/service.ts
  function quote (line 1) | function quote(
  function stringQuoter (line 27) | function stringQuoter(

FILE: src/pages/tools/string/randomize-case/index.tsx
  function RandomizeCase (line 40) | function RandomizeCase({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/randomize-case/service.ts
  function randomizeCase (line 1) | function randomizeCase(input: string): string {

FILE: src/pages/tools/string/remove-duplicate-lines/index.tsx
  function RemoveDuplicateLines (line 173) | function RemoveDuplicateLines({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/remove-duplicate-lines/service.ts
  type NewlineOption (line 1) | type NewlineOption = 'preserve' | 'filter' | 'delete';
  type DuplicateRemovalMode (line 2) | type DuplicateRemovalMode = 'all' | 'consecutive' | 'unique';
  type DuplicateRemoverOptions (line 4) | interface DuplicateRemoverOptions {
  function removeDuplicateLines (line 17) | function removeDuplicateLines(

FILE: src/pages/tools/string/repeat/index.tsx
  function Replacer (line 51) | function Replacer({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/repeat/initialValues.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/repeat/service.ts
  function repeatText (line 3) | function repeatText(options: InitialValuesType, text: string) {

FILE: src/pages/tools/string/reverse/index.tsx
  function Reverse (line 61) | function Reverse({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/reverse/service.ts
  function stringReverser (line 3) | function stringReverser(

FILE: src/pages/tools/string/rot13/index.tsx
  type InitialValuesType (line 10) | type InitialValuesType = Record<string, never>;
  function Rot13 (line 33) | function Rot13({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/rot13/service.ts
  function rot13 (line 1) | function rot13(input: string): string {

FILE: src/pages/tools/string/rotate/index.tsx
  type InitialValuesType (line 15) | interface InitialValuesType {
  function Rotate (line 66) | function Rotate({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/rotate/service.ts
  function rotate (line 1) | function rotate(input: string, step: number, right: boolean): string {
  function rotateString (line 27) | function rotateString(

FILE: src/pages/tools/string/split/index.tsx
  function SplitText (line 126) | function SplitText({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/split/service.ts
  type SplitOperatorType (line 1) | type SplitOperatorType = 'symbol' | 'regex' | 'length' | 'chunks';
  function splitTextByLength (line 3) | function splitTextByLength(text: string, length: number) {
  function splitIntoChunks (line 12) | function splitIntoChunks(text: string, numChunks: number) {
  function compute (line 37) | function compute(

FILE: src/pages/tools/string/statistic/index.tsx
  function Truncate (line 216) | function Truncate({

FILE: src/pages/tools/string/statistic/service.ts
  function countLines (line 4) | function countLines(text: string, options: InitialValuesType): number {
  function countCharacters (line 12) | function countCharacters(text: string): number {
  function countSentences (line 16) | function countSentences(text: string, options: InitialValuesType): number {
  function wordsStats (line 28) | function wordsStats(
  function countParagraphs (line 53) | function countParagraphs(text: string): number {
  function charactersStatistic (line 59) | function charactersStatistic(text: string, options: InitialValuesType): ...
  function textStatistics (line 74) | function textStatistics(

FILE: src/pages/tools/string/statistic/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/text-replacer/index.tsx
  function Replacer (line 63) | function Replacer({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/text-replacer/initialValues.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/text-replacer/service.ts
  function isFieldsEmpty (line 3) | function isFieldsEmpty(textField: string, searchField: string) {
  function replaceText (line 7) | function replaceText(options: InitialValuesType, text: string) {
  function replaceTextWithRegexp (line 20) | function replaceTextWithRegexp(

FILE: src/pages/tools/string/to-morse/index.tsx
  function ToMorse (line 14) | function ToMorse() {

FILE: src/pages/tools/string/truncate/index.tsx
  function Truncate (line 70) | function Truncate({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/truncate/initialValues.ts
  type truncationSideType (line 1) | type truncationSideType = 'right' | 'left';
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/string/truncate/service.ts
  function truncateText (line 3) | function truncateText(options: InitialValuesType, text: string) {
  function truncateFromRight (line 32) | function truncateFromRight(
  function truncateFromLeft (line 46) | function truncateFromLeft(
  function addIndicatorToText (line 60) | function addIndicatorToText(

FILE: src/pages/tools/string/unicode/index.tsx
  function Unicode (line 55) | function Unicode({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/unicode/service.ts
  function unicode (line 3) | function unicode(input: string, options: InitialValuesType): string {

FILE: src/pages/tools/string/unicode/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/string/uppercase/index.tsx
  function Uppercase (line 38) | function Uppercase({ title }: ToolComponentProps) {

FILE: src/pages/tools/string/uppercase/service.ts
  function UppercaseInput (line 1) | function UppercaseInput(input: string): string {

FILE: src/pages/tools/string/url-decode/index.tsx
  function DecodeString (line 32) | function DecodeString({

FILE: src/pages/tools/string/url-decode/service.ts
  function decodeString (line 1) | function decodeString(input: string): string {

FILE: src/pages/tools/string/url-encode/index.tsx
  function EncodeString (line 40) | function EncodeString({

FILE: src/pages/tools/string/url-encode/service.ts
  function encodeString (line 3) | function encodeString(

FILE: src/pages/tools/string/url-encode/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/time/check-leap-years/index.tsx
  type InitialValuesType (line 13) | type InitialValuesType = typeof initialValues;
  function ConvertDaysToHours (line 56) | function ConvertDaysToHours({

FILE: src/pages/tools/time/check-leap-years/service.ts
  function isLeapYear (line 1) | function isLeapYear(year: number): boolean {
  function checkLeapYear (line 5) | function checkLeapYear(input: string): string {

FILE: src/pages/tools/time/convert-days-to-hours/index.tsx
  type InitialValuesType (line 16) | type InitialValuesType = typeof initialValues;
  function ConvertDaysToHours (line 62) | function ConvertDaysToHours({

FILE: src/pages/tools/time/convert-days-to-hours/service.ts
  function compute (line 3) | function compute(input: string) {
  function convertDaysToHours (line 12) | function convertDaysToHours(input: string, hoursFlag: boolean): string {

FILE: src/pages/tools/time/convert-hours-to-days/index.tsx
  type InitialValuesType (line 17) | type InitialValuesType = typeof initialValues;
  function ConvertDaysToHours (line 75) | function ConvertDaysToHours({

FILE: src/pages/tools/time/convert-hours-to-days/service.ts
  function compute (line 3) | function compute(input: string, accuracy: number) {
  function convertHoursToDays (line 12) | function convertHoursToDays(

FILE: src/pages/tools/time/convert-seconds-to-time/index.tsx
  type InitialValuesType (line 16) | type InitialValuesType = typeof initialValues;
  function SecondsToTime (line 68) | function SecondsToTime({

FILE: src/pages/tools/time/convert-seconds-to-time/service.ts
  function compute (line 3) | function compute(seconds: string, paddingFlag: boolean): string {
  function convertSecondsToTime (line 17) | function convertSecondsToTime(

FILE: src/pages/tools/time/convert-time-to-decimal/index.tsx
  function ConvertTimeToDecimal (line 29) | function ConvertTimeToDecimal({

FILE: src/pages/tools/time/convert-time-to-decimal/service.ts
  function convertTimeToDecimal (line 4) | function convertTimeToDecimal(

FILE: src/pages/tools/time/convert-time-to-decimal/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/time/convert-time-to-seconds/index.tsx
  type InitialValuesType (line 11) | type InitialValuesType = typeof initialValues;
  function TimeToSeconds (line 75) | function TimeToSeconds({

FILE: src/pages/tools/time/convert-time-to-seconds/service.ts
  function recursiveTimeToSeconds (line 3) | function recursiveTimeToSeconds(
  function compute (line 18) | function compute(timeArray: string[], lineNumber: number): string {
  function convertTimetoSeconds (line 41) | function convertTimetoSeconds(input: string): string {

FILE: src/pages/tools/time/convert-unix-to-date/index.tsx
  type InitialValuesType (line 17) | type InitialValuesType = typeof initialValues;
  function ConvertUnixToDate (line 52) | function ConvertUnixToDate({ title }: ToolComponentProps) {

FILE: src/pages/tools/time/convert-unix-to-date/service.ts
  function computeUnixToDate (line 3) | function computeUnixToDate(input: string, useLocalTime: boolean): string {
  function convertUnixToDate (line 23) | function convertUnixToDate(

FILE: src/pages/tools/time/crontab-guru/index.tsx
  type InitialValuesType (line 12) | type InitialValuesType = typeof initialValues;
  function CrontabGuru (line 45) | function CrontabGuru({

FILE: src/pages/tools/time/crontab-guru/service.ts
  function explainCrontab (line 4) | function explainCrontab(expr: string): string {
  function validateCrontab (line 12) | function validateCrontab(expr: string): boolean {
  function main (line 16) | function main(input: string, _options: any): string {

FILE: src/pages/tools/time/discord-timestamp/index.tsx
  type formatProps (line 66) | type formatProps = {
  function TruncateClockTime (line 71) | function TruncateClockTime({

FILE: src/pages/tools/time/discord-timestamp/service.ts
  function compute (line 13) | function compute(
  function DiscordTimestampGenerator (line 35) | function DiscordTimestampGenerator(

FILE: src/pages/tools/time/discord-timestamp/types.ts
  type DiscordTimestampFormat (line 1) | type DiscordTimestampFormat = 't' | 'T' | 'd' | 'D' | 'f' | 'F' | 'R';
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/time/time-between-dates/index.tsx
  type TimeUnit (line 16) | type TimeUnit =
  type InitialValuesType (line 25) | type InitialValuesType = {
  function TimeBetweenDates (line 123) | function TimeBetweenDates() {

FILE: src/pages/tools/time/time-between-dates/service.ts
  type TimeUnit (line 20) | type TimeUnit = (typeof unitHierarchy)[number];
  type TimeDifference (line 21) | type TimeDifference = Record<TimeUnit, number>;

FILE: src/pages/tools/time/truncate-clock-time/index.tsx
  type InitialValuesType (line 19) | type InitialValuesType = typeof initialValues;
  function TruncateClockTime (line 67) | function TruncateClockTime({

FILE: src/pages/tools/time/truncate-clock-time/service.ts
  function compute (line 3) | function compute(
  function truncateClockTime (line 41) | function truncateClockTime(

FILE: src/pages/tools/video/change-speed/index.tsx
  function ChangeSpeed (line 18) | function ChangeSpeed({

FILE: src/pages/tools/video/change-speed/service.ts
  function main (line 3) | function main(

FILE: src/pages/tools/video/change-speed/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/video/compress/index.tsx
  function CompressVideo (line 71) | function CompressVideo({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/compress/service.ts
  type VideoResolution (line 6) | type VideoResolution = 240 | 360 | 480 | 720 | 1080;
  type CompressVideoOptions (line 8) | interface CompressVideoOptions {
  function compressVideo (line 14) | async function compressVideo(

FILE: src/pages/tools/video/crop-video/index.tsx
  function CropVideo (line 20) | function CropVideo({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/crop-video/service.ts
  function getVideoDimensions (line 7) | async function getVideoDimensions(
  function cropVideo (line 31) | async function cropVideo(

FILE: src/pages/tools/video/crop-video/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/video/flip/index.tsx
  function FlipVideo (line 33) | function FlipVideo({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/flip/service.ts
  function flipVideo (line 7) | async function flipVideo(

FILE: src/pages/tools/video/flip/types.ts
  type FlipOrientation (line 1) | type FlipOrientation = 'horizontal' | 'vertical';
  type InitialValuesType (line 3) | type InitialValuesType = {

FILE: src/pages/tools/video/gif/change-speed/index.tsx
  function ChangeSpeed (line 14) | function ChangeSpeed({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/loop/index.tsx
  function Loop (line 24) | function Loop({ title, longDescription }: ToolComponentProps) {

FILE: src/pages/tools/video/loop/service.ts
  function loopVideo (line 7) | async function loopVideo(

FILE: src/pages/tools/video/loop/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/video/merge-video/index.tsx
  function MergeVideo (line 14) | function MergeVideo({

FILE: src/pages/tools/video/merge-video/merge-video.service.test.ts
  function createMockFile (line 22) | function createMockFile(name: string, type = 'video/mp4') {

FILE: src/pages/tools/video/merge-video/service.ts
  function mergeVideos (line 5) | async function mergeVideos(

FILE: src/pages/tools/video/merge-video/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {
  type MergeVideoInput (line 6) | type MergeVideoInput = File[];
  type MergeVideoOutput (line 9) | type MergeVideoOutput = Blob;

FILE: src/pages/tools/video/rotate/index.tsx
  function RotateVideo (line 30) | function RotateVideo({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/rotate/service.ts
  function rotateVideo (line 6) | async function rotateVideo(

FILE: src/pages/tools/video/trim/index.tsx
  function TrimVideo (line 31) | function TrimVideo({ title }: ToolComponentProps) {

FILE: src/pages/tools/video/video-to-gif/index.tsx
  function VideoToGif (line 32) | function VideoToGif({

FILE: src/pages/tools/video/video-to-gif/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/xml/xml-beautifier/index.tsx
  function XmlBeautifier (line 23) | function XmlBeautifier({

FILE: src/pages/tools/xml/xml-beautifier/service.ts
  function beautifyXml (line 4) | function beautifyXml(

FILE: src/pages/tools/xml/xml-beautifier/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/pages/tools/xml/xml-validator/index.tsx
  function XmlValidator (line 31) | function XmlValidator({

FILE: src/pages/tools/xml/xml-validator/service.ts
  function validateXml (line 4) | function validateXml(

FILE: src/pages/tools/xml/xml-validator/types.ts
  type InitialValuesType (line 1) | type InitialValuesType = {

FILE: src/providers/UserTypeFilterProvider.tsx
  type UserTypeFilterContextType (line 11) | interface UserTypeFilterContextType {
  type UserTypeFilterProviderProps (line 20) | interface UserTypeFilterProviderProps {
  function UserTypeFilterProvider (line 24) | function UserTypeFilterProvider({
  function useUserTypeFilter (line 66) | function useUserTypeFilter(): UserTypeFilterContextType {

FILE: src/tools/defineTool.tsx
  type UserType (line 7) | type UserType = 'generalUsers' | 'developers';
  type ToolMeta (line 9) | interface ToolMeta {
  type ToolCategory (line 23) | type ToolCategory =
  type DefinedTool (line 39) | interface DefinedTool {
  type ToolComponentProps (line 51) | interface ToolComponentProps {

FILE: src/tools/index.test.ts
  type NamespacedT (line 51) | type NamespacedT = TFunction<I18nNamespaces[]>;

FILE: src/tools/index.ts
  constant CATEGORIES_USER_TYPES_MAPPINGS (line 141) | const CATEGORIES_USER_TYPES_MAPPINGS: Partial<Record<ToolCategory, UserT...
  type SearchField (line 208) | type SearchField = {

FILE: src/utils/array.ts
  function transpose (line 7) | function transpose<T>(matrix: T[][]): any[][] {
  function normalizeAndFill (line 18) | function normalizeAndFill<T>(

FILE: src/utils/bookmark.ts
  function getBookmarkedToolPaths (line 3) | function getBookmarkedToolPaths(): string[] {
  function isBookmarked (line 12) | function isBookmarked(toolPath: string): boolean {
  function toggleBookmarked (line 16) | function toggleBookmarked(toolPath: string) {
  function bookmark (line 24) | function bookmark(toolPath: string) {
  function unbookmark (line 31) | function unbookmark(toolPath: string) {

FILE: src/utils/color.ts
  function areColorsSimilar (line 1) | function areColorsSimilar(
  function convertHexToRGBA (line 24) | function convertHexToRGBA(color: string): number {

FILE: src/utils/csv.ts
  function splitCsvLine (line 8) | function splitCsvLine(
  function splitCsv (line 45) | function splitCsv(
  function getCsvHeaders (line 78) | function getCsvHeaders(

FILE: src/utils/file.ts
  function getFileExtension (line 7) | function getFileExtension(filename: string): string {

FILE: src/utils/gif.ts
  function gifBinaryToFile (line 3) | function gifBinaryToFile(

FILE: src/utils/index.ts
  function classNames (line 1) | function classNames(...classes: unknown[]): string {

FILE: src/utils/json.ts
  function getJsonHeaders (line 11) | function getJsonHeaders(rows: Record<string, string>[]): string[] {

FILE: src/utils/number.ts
  function formatNumber (line 1) | function formatNumber(

FILE: src/utils/string.ts
  function capitalizeFirstLetter (line 26) | function capitalizeFirstLetter(string: string | undefined) {
  function isNumber (line 31) | function isNumber(number: any): boolean {
  function reverseString (line 60) | function reverseString(input: string): string {
  function containsOnlyDigits (line 69) | function containsOnlyDigits(input: string): boolean {
  function unquoteIfQuoted (line 79) | function unquoteIfQuoted(value: string, quoteCharacter: string): string {
  function itemCounter (line 96) | function itemCounter(

FILE: src/utils/time.ts
  type TimeValidationResult (line 1) | type TimeValidationResult = {
  function humanTimeValidation (line 19) | function humanTimeValidation(input: string): TimeValidationResult {
Condensed preview — 723 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,732K chars).
[
  {
    "path": ".dockerignore",
    "chars": 58,
    "preview": "node_modules\nplaywright-report\ncoverage\ndist\ntest-results\n"
  },
  {
    "path": ".editorconfig",
    "chars": 147,
    "preview": "root = true\n\n[*]\nindent_style = space\nindent_size = 2\nend_of_line = lf\ncharset = utf-8\ntrim_trailing_whitespace = true\ni"
  },
  {
    "path": ".eslintrc",
    "chars": 1248,
    "preview": "{\n  \"env\": {\n    \"browser\": true,\n    \"es2020\": true,\n    \"jest\": true,\n    \"node\": true\n  },\n  \"settings\": {\n    \"react"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 42,
    "preview": "github: [iib0011]\nbuy_me_a_coffee: iib0011"
  },
  {
    "path": ".github/workflows/ci.yml",
    "chars": 3529,
    "preview": "name: CI\non:\n  push:\n    branches:\n      - main\n    tags:\n      - 'v*'\n  pull_request:\n    branches:\n      - main\njobs:\n"
  },
  {
    "path": ".gitignore",
    "chars": 396,
    "preview": "dist\ndist-ssr\n*.local\n\n# dependencies\n/node_modules\n/.pnp\n.pnp.js\n\n# testing\n/coverage\n\n# next.js\n/.next/\n/out/\n\n# produ"
  },
  {
    "path": ".husky/pre-commit",
    "chars": 15,
    "preview": "npx lint-staged"
  },
  {
    "path": ".idea/codeStyles/Project.xml",
    "chars": 2651,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <code_scheme name=\"Project\" version=\"173\">\n    <HTMLCodeStyleSettings"
  },
  {
    "path": ".idea/codeStyles/codeStyleConfig.xml",
    "chars": 142,
    "preview": "<component name=\"ProjectCodeStyleConfiguration\">\n  <state>\n    <option name=\"USE_PER_PROJECT_SETTINGS\" value=\"true\" />\n "
  },
  {
    "path": ".idea/inspectionProfiles/Project_Default.xml",
    "chars": 562,
    "preview": "<component name=\"InspectionProjectProfileManager\">\n  <profile version=\"1.0\">\n    <option name=\"myName\" value=\"Project De"
  },
  {
    "path": ".idea/modules.xml",
    "chars": 272,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n   "
  },
  {
    "path": ".idea/omni-tools.iml",
    "chars": 467,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module type=\"JAVA_MODULE\" version=\"4\">\n  <component name=\"NewModuleRootManager\" "
  },
  {
    "path": ".idea/prettier.xml",
    "chars": 236,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"PrettierConfiguration\">\n    <option name"
  },
  {
    "path": ".idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]/shelved.patch",
    "chars": 45873,
    "preview": "Index: .idea/workspace.xml\nIDEA additional info:\nSubsystem: com.intellij.openapi.diff.impl.patch.BaseRevisionTextPatchEP"
  },
  {
    "path": ".idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]1/shelved.patch",
    "chars": 0,
    "preview": ""
  },
  {
    "path": ".idea/shelf/Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM__Changes_.xml",
    "chars": 404,
    "preview": "<changelist name=\"Uncommitted_changes_before_Checkout_at_2_27_2025_11_44_AM_[Changes]\" date=\"1740656670640\" recycled=\"fa"
  },
  {
    "path": ".idea/vcs.xml",
    "chars": 180,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"VcsDirectoryMappings\">\n    <mapping dire"
  },
  {
    "path": ".idea/workspace.xml",
    "chars": 54224,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"AutoImportSettings\">\n    <option name=\"a"
  },
  {
    "path": ".prettierrc",
    "chars": 76,
    "preview": "{\n  \"trailingComma\": \"none\",\n  \"singleQuote\": true,\n  \"endOfLine\": \"auto\"\n}\n"
  },
  {
    "path": ".vitest/setup.ts",
    "chars": 43,
    "preview": "import '@testing-library/jest-dom/vitest';\n"
  },
  {
    "path": ".vscode/settings.json",
    "chars": 137,
    "preview": "{\n  \"editor.codeActionsOnSave\": {\n    \"source.fixAll.eslint\": \"explicit\"\n  },\n  \"files.associations\": {\n    \"*.css\": \"ta"
  },
  {
    "path": "@types/i18n.d.ts",
    "chars": 188,
    "preview": "// types/i18next.d.ts\nimport 'i18next';\nimport { resources } from '../src/i18n';\n\ndeclare module 'i18next' {\n  interface"
  },
  {
    "path": "@types/theme.d.ts",
    "chars": 184,
    "preview": "import '@mui/material/styles';\n\ndeclare module '@mui/material/styles' {\n  interface TypeBackground {\n    hover?: string;"
  },
  {
    "path": "CODEOWNERS",
    "chars": 24,
    "preview": "* @iib0011 @Chesterkxng\n"
  },
  {
    "path": "Dockerfile",
    "chars": 501,
    "preview": "FROM node:20 AS build\n\nWORKDIR /app\n\nCOPY package.json package-lock.json ./\nRUN npm install\n\nCOPY . .\nRUN npm run build\n"
  },
  {
    "path": "LICENSE",
    "chars": 1079,
    "preview": "MIT License\n\nCopyright (c) 2024 Ibrahima Gaye Coulibaly\n\nPermission is hereby granted, free of charge, to any person obt"
  },
  {
    "path": "README.md",
    "chars": 5131,
    "preview": "<div align=\"center\">\n        <img src=\"src/assets/logo.png\" width=\"220\" />\n        <br /><br />\n<a href=\"https://trendsh"
  },
  {
    "path": "commitlint.config.js",
    "chars": 67,
    "preview": "module.exports = { extends: ['@commitlint/config-conventional'] };\n"
  },
  {
    "path": "index.html",
    "chars": 737,
    "preview": "<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"UTF-8\" />\n  <link rel=\"icon\" type=\"image/png\" href=\"/favicon-96"
  },
  {
    "path": "package.json",
    "chars": 4462,
    "preview": "{\n  \"name\": \"omni-tools\",\n  \"description\": \"This project offers a variety of online tools to help with everyday tasks, \\"
  },
  {
    "path": "playwright.config.ts",
    "chars": 668,
    "preview": "import { defineConfig, devices } from '@playwright/test';\n\nexport default defineConfig({\n  testDir: './src',\n  testMatch"
  },
  {
    "path": "postcss.config.mjs",
    "chars": 79,
    "preview": "export default {\n  plugins: {\n    tailwindcss: {},\n    autoprefixer: {}\n  }\n};\n"
  },
  {
    "path": "public/_redirects",
    "chars": 24,
    "preview": "/*    /index.html   200\n"
  },
  {
    "path": "public/assets/fonts/quicksand/quick-sand.css",
    "chars": 373,
    "preview": "@font-face {\n  font-family: \"Quicksand\";\n  font-weight: 100 900;\n  font-display: swap;\n  font-style: normal;\n  font-name"
  },
  {
    "path": "public/gs.js",
    "chars": 1396,
    "preview": "// This is a placeholder file for the actual Ghostscript WASM implementation\n// In a real implementation, this would be "
  },
  {
    "path": "public/locales/de/audio.json",
    "chars": 3351,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Ändern Sie die Wiedergabegeschwindigkeit von Audiodateien. Beschleunigen oder v"
  },
  {
    "path": "public/locales/de/converters.json",
    "chars": 626,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Audio-Konverter\",\n    \"description\": \"Konvertieren Sie Audiodateien zwischen versc"
  },
  {
    "path": "public/locales/de/csv.json",
    "chars": 14711,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Ändern Sie das Trennzeichen in CSV-Dateien. Konvertieren Sie zwischen ve"
  },
  {
    "path": "public/locales/de/image.json",
    "chars": 5779,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Welt\",\n    \"shortDescription\": \"Schnelles Austauschen der Farben in einem Bild"
  },
  {
    "path": "public/locales/de/json.json",
    "chars": 3607,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Vergleichen Sie zwei JSON-Objekte, um Unterschiede in Struktur und Werten zu erk"
  },
  {
    "path": "public/locales/de/list.json",
    "chars": 16698,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Verketten\",\n    \"concatenateDescription\": \"Kopien verketten (wenn nicht aktiviert"
  },
  {
    "path": "public/locales/de/number.json",
    "chars": 12470,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Gemeinsamer Unterschied zwischen Begriffen (d)\",\n    \"de"
  },
  {
    "path": "public/locales/de/pdf.json",
    "chars": 7443,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Komprimierte Dateigröße\",\n    \"compressingPdf\": \"PDF wird komprimiert..."
  },
  {
    "path": "public/locales/de/string.json",
    "chars": 21868,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Base64-Dekodierung\",\n    \"description\": \"Kodieren oder dekodieren Sie Text mit der Base64"
  },
  {
    "path": "public/locales/de/time.json",
    "chars": 7105,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Prüfen Sie, ob ein Jahr ein Schaltjahr ist, und erhalten Sie Informationen z"
  },
  {
    "path": "public/locales/de/translation.json",
    "chars": 13913,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Ändern Sie die Wiedergabegeschwindigkeit von Audiodateien. Bes"
  },
  {
    "path": "public/locales/de/video.json",
    "chars": 6706,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Standardmultiplikator: 2 bedeutet 2x schneller\",\n    \"description\": \"Ände"
  },
  {
    "path": "public/locales/de/xml.json",
    "chars": 1743,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Formatieren Sie XML mit den richtigen Einrückungen und Abständen.\",\n    \"inde"
  },
  {
    "path": "public/locales/en/audio.json",
    "chars": 3038,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Change the playback speed of audio files. Speed up or slow down audio while mai"
  },
  {
    "path": "public/locales/en/converters.json",
    "chars": 542,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Audio Converter\",\n    \"description\": \"Convert audio files between different format"
  },
  {
    "path": "public/locales/en/csv.json",
    "chars": 12989,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Change the delimiter/separator in CSV files. Convert between different C"
  },
  {
    "path": "public/locales/en/image.json",
    "chars": 6077,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"World\",\n    \"shortDescription\": \"Quickly swap colors in a image\",\n    \"title\":"
  },
  {
    "path": "public/locales/en/json.json",
    "chars": 4608,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Compare two JSON objects to identify differences in structure and values.\",\n    "
  },
  {
    "path": "public/locales/en/list.json",
    "chars": 14192,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Concatenate\",\n    \"concatenateDescription\": \"Concatenate copies (if unchecked, it"
  },
  {
    "path": "public/locales/en/number.json",
    "chars": 12217,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Common difference between terms (d)\",\n    \"description\":"
  },
  {
    "path": "public/locales/en/pdf.json",
    "chars": 6520,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Compressed File Size\",\n    \"compressingPdf\": \"Compressing PDF...\",\n    \""
  },
  {
    "path": "public/locales/en/string.json",
    "chars": 20332,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Base64 Decode\",\n    \"description\": \"Encode or decode text using Base64 encoding.\",\n    \"e"
  },
  {
    "path": "public/locales/en/time.json",
    "chars": 9117,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Check if a year is a leap year and get leap year information.\",\n    \"example"
  },
  {
    "path": "public/locales/en/translation.json",
    "chars": 12975,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Change the playback speed of audio files. Speed up or slow dow"
  },
  {
    "path": "public/locales/en/video.json",
    "chars": 5728,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Default multiplier: 2 means 2x faster\",\n    \"description\": \"Change the pl"
  },
  {
    "path": "public/locales/en/xml.json",
    "chars": 1521,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Format XML with proper indentation and spacing.\",\n    \"indentation\": \"Indenta"
  },
  {
    "path": "public/locales/es/audio.json",
    "chars": 3369,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Cambia la velocidad de reproducción de los archivos de audio. Acelera o ralenti"
  },
  {
    "path": "public/locales/es/converters.json",
    "chars": 606,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Convertidor de Audio\",\n    \"description\": \"Convierte archivos de audio entre difer"
  },
  {
    "path": "public/locales/es/csv.json",
    "chars": 14442,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Cambie el delimitador/separador en archivos CSV. Convierta entre diferen"
  },
  {
    "path": "public/locales/es/image.json",
    "chars": 5715,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Mundo\",\n    \"shortDescription\": \"Intercambia colores rápidamente en una imagen"
  },
  {
    "path": "public/locales/es/json.json",
    "chars": 3476,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Compare dos objetos JSON para identificar diferencias en estructura y valores.\","
  },
  {
    "path": "public/locales/es/list.json",
    "chars": 16455,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Concatenar\",\n    \"concatenateDescription\": \"Concatenar copias (si no está marcada"
  },
  {
    "path": "public/locales/es/number.json",
    "chars": 12434,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Diferencia común entre términos (d)\",\n    \"description\":"
  },
  {
    "path": "public/locales/es/pdf.json",
    "chars": 7215,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Tamaño de archivo comprimido\",\n    \"compressingPdf\": \"Comprimiendo PDF.."
  },
  {
    "path": "public/locales/es/string.json",
    "chars": 21627,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Descodificación Base64\",\n    \"description\": \"Codificar o decodificar texto utilizando la "
  },
  {
    "path": "public/locales/es/time.json",
    "chars": 6967,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Compruebe si un año es bisiesto y obtenga información sobre el año bisiesto."
  },
  {
    "path": "public/locales/es/translation.json",
    "chars": 13671,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Cambia la velocidad de reproducción de los archivos de audio. "
  },
  {
    "path": "public/locales/es/video.json",
    "chars": 6354,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Multiplicador predeterminado: 2 significa 2 veces más rápido\",\n    \"descr"
  },
  {
    "path": "public/locales/es/xml.json",
    "chars": 1652,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Formatear XML con sangría y espaciado adecuados.\",\n    \"indentation\": \"Sangrí"
  },
  {
    "path": "public/locales/fr/audio.json",
    "chars": 3390,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Modifier la vitesse de lecture des fichiers audio. Accélérer ou ralentir le son"
  },
  {
    "path": "public/locales/fr/converters.json",
    "chars": 598,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Convertisseur Audio\",\n    \"description\": \"Convertissez des fichiers audio entre di"
  },
  {
    "path": "public/locales/fr/csv.json",
    "chars": 15282,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Modifiez le délimiteur/séparateur dans les fichiers CSV. Convertissez vo"
  },
  {
    "path": "public/locales/fr/image.json",
    "chars": 5860,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Monde\",\n    \"shortDescription\": \"Échanger rapidement les couleurs d'une image\""
  },
  {
    "path": "public/locales/fr/json.json",
    "chars": 3552,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Comparez deux objets JSON pour identifier les différences de structure et de val"
  },
  {
    "path": "public/locales/fr/list.json",
    "chars": 16860,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Concatener\",\n    \"concatenateDescription\": \"Concaténer les copies (si cette optio"
  },
  {
    "path": "public/locales/fr/number.json",
    "chars": 12782,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Différence courante entre les termes (d)\",\n    \"descript"
  },
  {
    "path": "public/locales/fr/pdf.json",
    "chars": 7626,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Taille du fichier compressé\",\n    \"compressingPdf\": \"Compression des PDF"
  },
  {
    "path": "public/locales/fr/string.json",
    "chars": 22360,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Décodage Base64\",\n    \"description\": \"Encodez ou décodez du texte à l'aide de l'encodage "
  },
  {
    "path": "public/locales/fr/time.json",
    "chars": 7651,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Vérifiez si une année est bissextile et obtenez des informations sur les ann"
  },
  {
    "path": "public/locales/fr/translation.json",
    "chars": 14429,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Modifier la vitesse de lecture des fichiers audio. Accélérer o"
  },
  {
    "path": "public/locales/fr/video.json",
    "chars": 6665,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Multiplicateur par défaut : 2 signifie 2x plus rapide\",\n    \"description\""
  },
  {
    "path": "public/locales/fr/xml.json",
    "chars": 1736,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Formater XML avec une indentation et un espacement appropriés.\",\n    \"indenta"
  },
  {
    "path": "public/locales/hi/audio.json",
    "chars": 3986,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"ऑडियो फ़ाइलों की प्लेबैक गति बदलें।\",\n    \"factorPlaceholder\": \"कारक (जैसे 0.5,"
  },
  {
    "path": "public/locales/hi/converters.json",
    "chars": 600,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"ऑडियो कनवर्टर\",\n    \"description\": \"ऑडियो फ़ाइलों को विभिन्न प्रारूपों के बीच रूपा"
  },
  {
    "path": "public/locales/hi/csv.json",
    "chars": 16127,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"CSV फ़ाइलों में सीमांकक/विभाजक बदलें। विभिन्न CSV प्रारूपों जैसे अल्पविर"
  },
  {
    "path": "public/locales/hi/image.json",
    "chars": 9326,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"दुनिया\",\n    \"shortDescription\": \"किसी छवि में रंगों को शीघ्रता से बदलें\",\n   "
  },
  {
    "path": "public/locales/hi/json.json",
    "chars": 4725,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"दो JSON वस्तुओं की संरचना और मूल्यों में अंतर की पहचान करें।\",\n    \"shortDescrip"
  },
  {
    "path": "public/locales/hi/list.json",
    "chars": 15789,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"CONCATENATE\",\n    \"concatenateDescription\": \"प्रतियों को संयोजित करें (यदि अनचेक "
  },
  {
    "path": "public/locales/hi/number.json",
    "chars": 12486,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifference\": \"सामान्य अंतर\",\n    \"commonDifferenceDescription\": \"शब्दों के बीच सा"
  },
  {
    "path": "public/locales/hi/pdf.json",
    "chars": 8744,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"संपीड़ित फ़ाइल का आकार\",\n    \"compressingPdf\": \"पीडीएफ संपीड़ित किया जा "
  },
  {
    "path": "public/locales/hi/string.json",
    "chars": 19963,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"बेस64 डिकोड\",\n    \"description\": \"बेस64 एनकोडिंग का उपयोग करके टेक्स्ट को एनकोड या डिकोड "
  },
  {
    "path": "public/locales/hi/time.json",
    "chars": 8542,
    "preview": "{\n  \"checkLeapYears\": {\n    \"checkMultiple\": \"कई वर्ष जांचें\",\n    \"checkOptions\": \"जांच विकल्प\",\n    \"description\": \"नि"
  },
  {
    "path": "public/locales/hi/translation.json",
    "chars": 13078,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"ऑडियो फ़ाइलों की प्लेबैक गति बदलें। पिच बनाए रखते हुए ऑडियो को"
  },
  {
    "path": "public/locales/hi/video.json",
    "chars": 7918,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"डिफ़ॉल्ट गुणक: 2 का अर्थ है 2x तेज़\",\n    \"description\": \"वीडियो फ़ाइलों "
  },
  {
    "path": "public/locales/hi/xml.json",
    "chars": 2528,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"XML को सुंदर प्रारूप में बदलें।\",\n    \"formattingOptions\": \"फॉर्मेटिंग विकल्प"
  },
  {
    "path": "public/locales/ja/audio.json",
    "chars": 2250,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"オーディオファイルの再生速度を変更します。ピッチを維持しながら、オーディオの再生速度を上げたり下げたりできます。\",\n    \"inputTitle\": \"入"
  },
  {
    "path": "public/locales/ja/converters.json",
    "chars": 422,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"オーディオコンバーター\",\n    \"description\": \"オーディオファイルを異なるフォーマット間で変換します。\",\n    \"shortDescript"
  },
  {
    "path": "public/locales/ja/csv.json",
    "chars": 7540,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"CSVファイルの区切り文字を変更します。カンマ、セミコロン、タブ、カスタム区切り文字など、さまざまなCSV形式間で変換できます。\",\n    \""
  },
  {
    "path": "public/locales/ja/image.json",
    "chars": 3645,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"世界\",\n    \"shortDescription\": \"画像内の色を素早く入れ替える\",\n    \"title\": \"画像の色を変更する\"\n  },\n "
  },
  {
    "path": "public/locales/ja/json.json",
    "chars": 2256,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"2 つの JSON オブジェクトを比較して、構造と値の違いを識別します。\",\n    \"shortDescription\": \"2つのJSONオブジェクトの違い"
  },
  {
    "path": "public/locales/ja/list.json",
    "chars": 9939,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"連結\",\n    \"concatenateDescription\": \"コピーを連結する(チェックを外すと、アイテムが織り交ぜられます)\",\n    \"copyD"
  },
  {
    "path": "public/locales/ja/number.json",
    "chars": 7116,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"用語間の共通差異(d)\",\n    \"description\": \"カスタマイズ可能なパラメータを使用して算術シ"
  },
  {
    "path": "public/locales/ja/pdf.json",
    "chars": 4699,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"圧縮ファイルサイズ\",\n    \"compressingPdf\": \"PDF を圧縮しています...\",\n    \"compressionLev"
  },
  {
    "path": "public/locales/ja/string.json",
    "chars": 13218,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Base64デコード\",\n    \"description\": \"Base64 エンコーディングを使用してテキストをエンコードまたはデコードします。\",\n    \"encode\""
  },
  {
    "path": "public/locales/ja/time.json",
    "chars": 4280,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"その年がうるう年かどうかを確認し、うるう年情報を取得します。\",\n    \"exampleDescription\": \"友人の一人は閏年の2月29日に生"
  },
  {
    "path": "public/locales/ja/translation.json",
    "chars": 8703,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"オーディオファイルの再生速度を変更します。ピッチを維持しながら、オーディオの再生速度を上げたり下げたりできます。\",\n   "
  },
  {
    "path": "public/locales/ja/video.json",
    "chars": 4168,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"デフォルトの乗数: 2は2倍速を意味します\",\n    \"description\": \"動画ファイルの再生速度を変更できます。音声の同期を維持しな"
  },
  {
    "path": "public/locales/ja/xml.json",
    "chars": 1160,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"適切なインデントとスペースを使用して XML をフォーマットします。\",\n    \"indentation\": \"インデント\",\n    \"inputTi"
  },
  {
    "path": "public/locales/nl/audio.json",
    "chars": 3233,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Wijzig de afspeelsnelheid van audiobestanden. Versnel of vertraag audio met beh"
  },
  {
    "path": "public/locales/nl/converters.json",
    "chars": 612,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Audio Converter\",\n    \"description\": \"Converteer audiobestanden tussen verschillen"
  },
  {
    "path": "public/locales/nl/csv.json",
    "chars": 14144,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Wijzig het scheidingsteken in CSV-bestanden. Converteer tussen verschill"
  },
  {
    "path": "public/locales/nl/image.json",
    "chars": 5905,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Wereld\",\n    \"shortDescription\": \"Snel kleuren in een afbeelding verwisselen\","
  },
  {
    "path": "public/locales/nl/json.json",
    "chars": 3507,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Vergelijk twee JSON-objecten om verschillen in structuur en waarden te identific"
  },
  {
    "path": "public/locales/nl/list.json",
    "chars": 15860,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Concateneren\",\n    \"concatenateDescription\": \"Kopieën samenvoegen (indien niet aa"
  },
  {
    "path": "public/locales/nl/number.json",
    "chars": 12368,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Veelvoorkomend verschil tussen termen (d)\",\n    \"descrip"
  },
  {
    "path": "public/locales/nl/pdf.json",
    "chars": 7218,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Gecomprimeerde bestandsgrootte\",\n    \"compressingPdf\": \"PDF comprimeren."
  },
  {
    "path": "public/locales/nl/string.json",
    "chars": 21215,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Base64-decodering\",\n    \"description\": \"Codeer of decodeer tekst met Base64-codering.\",\n "
  },
  {
    "path": "public/locales/nl/time.json",
    "chars": 6997,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Controleer of een jaar een schrikkeljaar is en ontvang informatie over schri"
  },
  {
    "path": "public/locales/nl/translation.json",
    "chars": 13814,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Wijzig de afspeelsnelheid van audiobestanden. Versnel of vertr"
  },
  {
    "path": "public/locales/nl/video.json",
    "chars": 6285,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Standaardvermenigvuldiger: 2 betekent 2x sneller\",\n    \"description\": \"Wi"
  },
  {
    "path": "public/locales/nl/xml.json",
    "chars": 1635,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Formatteer XML met de juiste inspringing en spatie.\",\n    \"indentation\": \"Ins"
  },
  {
    "path": "public/locales/pt/audio.json",
    "chars": 3318,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Altere a velocidade de reprodução dos arquivos de áudio. Acelere ou desacelere "
  },
  {
    "path": "public/locales/pt/converters.json",
    "chars": 598,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Conversor de Áudio\",\n    \"description\": \"Converta arquivos de áudio entre diferent"
  },
  {
    "path": "public/locales/pt/csv.json",
    "chars": 14155,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Altere o delimitador/separador em arquivos CSV. Converta entre diferente"
  },
  {
    "path": "public/locales/pt/image.json",
    "chars": 5517,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Mundo\",\n    \"shortDescription\": \"Troque cores rapidamente em uma imagem\",\n    "
  },
  {
    "path": "public/locales/pt/json.json",
    "chars": 3385,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Compare dois objetos JSON para identificar diferenças na estrutura e nos valores"
  },
  {
    "path": "public/locales/pt/list.json",
    "chars": 15800,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Concatenar\",\n    \"concatenateDescription\": \"Concatenar cópias (se desmarcado, os "
  },
  {
    "path": "public/locales/pt/number.json",
    "chars": 12226,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Diferença comum entre os termos (d)\",\n    \"description\":"
  },
  {
    "path": "public/locales/pt/pdf.json",
    "chars": 7216,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Tamanho do arquivo compactado\",\n    \"compressingPdf\": \"Compactando PDF.."
  },
  {
    "path": "public/locales/pt/string.json",
    "chars": 21491,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Decodificação Base64\",\n    \"description\": \"Codifique ou decodifique texto usando codifica"
  },
  {
    "path": "public/locales/pt/time.json",
    "chars": 6996,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Verifique se um ano é bissexto e obtenha informações sobre o ano bissexto.\","
  },
  {
    "path": "public/locales/pt/translation.json",
    "chars": 13722,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Altere a velocidade de reprodução dos arquivos de áudio. Acele"
  },
  {
    "path": "public/locales/pt/video.json",
    "chars": 6217,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Multiplicador padrão: 2 significa 2x mais rápido\",\n    \"description\": \"Al"
  },
  {
    "path": "public/locales/pt/xml.json",
    "chars": 1624,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Formate XML com recuo e espaçamento adequados.\",\n    \"indentation\": \"Recuo\",\n"
  },
  {
    "path": "public/locales/ru/audio.json",
    "chars": 3244,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"Измените скорость воспроизведения аудиофайлов. Ускорьте или замедлите звук, сох"
  },
  {
    "path": "public/locales/ru/converters.json",
    "chars": 577,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"Аудиоконвертер\",\n    \"description\": \"Преобразуйте аудиофайлы между различными форм"
  },
  {
    "path": "public/locales/ru/csv.json",
    "chars": 13982,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"Измените разделитель/разделитель в CSV-файлах. Конвертируйте данные межд"
  },
  {
    "path": "public/locales/ru/image.json",
    "chars": 5600,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"Мир\",\n    \"shortDescription\": \"Быстро поменяйте цвета на изображении\",\n    \"ti"
  },
  {
    "path": "public/locales/ru/json.json",
    "chars": 3418,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"Сравните два объекта JSON, чтобы выявить различия в структуре и значениях.\",\n   "
  },
  {
    "path": "public/locales/ru/list.json",
    "chars": 15882,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"Объединить\",\n    \"concatenateDescription\": \"Объединить копии (если этот флажок не"
  },
  {
    "path": "public/locales/ru/number.json",
    "chars": 12179,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"Общее различие между терминами (г)\",\n    \"description\": "
  },
  {
    "path": "public/locales/ru/pdf.json",
    "chars": 7230,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"Размер сжатого файла\",\n    \"compressingPdf\": \"Сжатие PDF-файла...\",\n    "
  },
  {
    "path": "public/locales/ru/string.json",
    "chars": 21239,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Декодирование Base64\",\n    \"description\": \"Кодировать или декодировать текст с использова"
  },
  {
    "path": "public/locales/ru/time.json",
    "chars": 6882,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"Проверьте, является ли год високосным, и получите информацию о високосном го"
  },
  {
    "path": "public/locales/ru/translation.json",
    "chars": 13601,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"Измените скорость воспроизведения аудиофайлов. Ускорьте или за"
  },
  {
    "path": "public/locales/ru/video.json",
    "chars": 6212,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"Множитель по умолчанию: 2 означает в 2 раза быстрее\",\n    \"description\": "
  },
  {
    "path": "public/locales/ru/xml.json",
    "chars": 1635,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"Отформатируйте XML с правильными отступами и интервалами.\",\n    \"indentation\""
  },
  {
    "path": "public/locales/zh/audio.json",
    "chars": 1885,
    "preview": "{\n  \"changeSpeed\": {\n    \"description\": \"更改音频文件的播放速度。在保持音调不变的情况下加快或减慢音频速度。\",\n    \"inputTitle\": \"输入音频\",\n    \"newAudioSpee"
  },
  {
    "path": "public/locales/zh/converters.json",
    "chars": 324,
    "preview": "{\n  \"audioConverter\": {\n    \"title\": \"音频转换器\",\n    \"description\": \"在不同格式之间转换音频文件。\",\n    \"shortDescription\": \"将音频文件转换为各种格式"
  },
  {
    "path": "public/locales/zh/csv.json",
    "chars": 6320,
    "preview": "{\n  \"changeCsvSeparator\": {\n    \"description\": \"更改 CSV 文件中的分隔符。在不同的 CSV 格式(例如逗号、分号、制表符或自定义分隔符)之间进行转换。\",\n    \"shortDescri"
  },
  {
    "path": "public/locales/zh/image.json",
    "chars": 3179,
    "preview": "{\n  \"changeColors\": {\n    \"description\": \"世界\",\n    \"shortDescription\": \"快速交换图像中的颜色\",\n    \"title\": \"改变图像的颜色\"\n  },\n  \"chan"
  },
  {
    "path": "public/locales/zh/json.json",
    "chars": 1986,
    "preview": "{\n  \"comparison\": {\n    \"description\": \"比较两个 JSON 对象以识别结构和值的差异。\",\n    \"shortDescription\": \"查找两个 JSON 对象之间的差异\",\n    \"titl"
  },
  {
    "path": "public/locales/zh/list.json",
    "chars": 8400,
    "preview": "{\n  \"duplicate\": {\n    \"concatenate\": \"连接\",\n    \"concatenateDescription\": \"连接副本(如果未选中,则项目将交织在一起)\",\n    \"copyDescription\""
  },
  {
    "path": "public/locales/zh/number.json",
    "chars": 6190,
    "preview": "{\n  \"arithmeticSequence\": {\n    \"commonDifferenceDescription\": \"术语之间的共同差异(d)\",\n    \"description\": \"生成具有可定制参数的算术序列。\",\n   "
  },
  {
    "path": "public/locales/zh/pdf.json",
    "chars": 4255,
    "preview": "{\n  \"compressPdf\": {\n    \"compressedFileSize\": \"压缩文件大小\",\n    \"compressingPdf\": \"正在压缩 PDF...\",\n    \"compressionLevel\": \"压"
  },
  {
    "path": "public/locales/zh/string.json",
    "chars": 11663,
    "preview": "{\n  \"base64\": {\n    \"decode\": \"Base64解码\",\n    \"description\": \"使用 Base64 编码对文本进行编码或解码。\",\n    \"encode\": \"Base64编码\",\n    \"i"
  },
  {
    "path": "public/locales/zh/time.json",
    "chars": 5263,
    "preview": "{\n  \"checkLeapYears\": {\n    \"description\": \"检查某一年份是否为闰年并获取闰年信息。\",\n    \"exampleDescription\": \"我们的一位朋友出生在闰年,也就是2月29日,因此她每四"
  },
  {
    "path": "public/locales/zh/translation.json",
    "chars": 7328,
    "preview": "{\n  \"audio\": {\n    \"changeSpeed\": {\n      \"description\": \"更改音频文件的播放速度。在保持音调不变的情况下加快或减慢音频速度。\",\n      \"name\": \"更改音频速度\",\n  "
  },
  {
    "path": "public/locales/zh/video.json",
    "chars": 3572,
    "preview": "{\n  \"changeSpeed\": {\n    \"defaultMultiplier\": \"默认乘数:2 表示速度快 2 倍\",\n    \"description\": \"更改视频文件的播放速度。在保持音频同步的同时,加快或减慢视频速度。支"
  },
  {
    "path": "public/locales/zh/xml.json",
    "chars": 1014,
    "preview": "{\n  \"xmlBeautifier\": {\n    \"description\": \"使用适当的缩进和间距来格式化 XML。\",\n    \"indentation\": \"缩进\",\n    \"inputTitle\": \"输入 XML\",\n  "
  },
  {
    "path": "public/robots.txt",
    "chars": 24,
    "preview": "\nUser-Agent: *\nAllow: /\n"
  },
  {
    "path": "public/site.webmanifest",
    "chars": 439,
    "preview": "{\n  \"name\": \"OmniTools\",\n  \"short_name\": \"OmniTools\",\n  \"icons\": [\n    {\n      \"src\": \"/web-app-manifest-192x192.png\",\n "
  },
  {
    "path": "scripts/add-i18n-to-meta.js",
    "chars": 7668,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\nconst TYPE_MAPPING = { 'image-generic': 'image', png: 'image' }"
  },
  {
    "path": "scripts/cleanup-empty-directories.js",
    "chars": 2553,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\n/**\n * Recursively delete all empty folders in a directory\n * @"
  },
  {
    "path": "scripts/create-tool.mjs",
    "chars": 7238,
    "preview": "import { readFile, writeFile } from 'fs/promises';\nimport fs from 'fs';\nimport { dirname, join, sep } from 'path';\nimpor"
  },
  {
    "path": "scripts/locize-upload.js",
    "chars": 5682,
    "preview": "// one-time-upload.js\n// Simple script to upload your existing translations to Locize once\n\nconst fs = require('fs');\nco"
  },
  {
    "path": "scripts/update-i18n-from-meta.js",
    "chars": 5522,
    "preview": "const fs = require('fs');\nconst path = require('path');\n\n// Helper function to convert kebab-case to camelCase\nfunction "
  },
  {
    "path": "src/@types/i18n.d.ts",
    "chars": 1204,
    "preview": "import 'i18next';\n\nimport translation from '../../public/locales/en/translation.json';\nimport string from '../../public/"
  },
  {
    "path": "src/components/App.tsx",
    "chars": 3109,
    "preview": "import { BrowserRouter, useRoutes } from 'react-router-dom';\nimport routesConfig from '../config/routesConfig';\nimport N"
  },
  {
    "path": "src/components/BackButton.tsx",
    "chars": 600,
    "preview": "import { IconButton } from '@mui/material';\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack';\nimport { useNavig"
  },
  {
    "path": "src/components/Hero.tsx",
    "chars": 8684,
    "preview": "import {\n  Autocomplete,\n  Box,\n  darken,\n  lighten,\n  Stack,\n  styled,\n  TextField,\n  useTheme\n} from '@mui/material';\n"
  },
  {
    "path": "src/components/InputHeader.tsx",
    "chars": 253,
    "preview": "import Typography from '@mui/material/Typography';\nimport React from 'react';\n\nexport default function InputHeader({ tit"
  },
  {
    "path": "src/components/Loading.css",
    "chars": 880,
    "preview": "#spinner {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  margin-top: 40px;\n  width: 56px;\n"
  },
  {
    "path": "src/components/Loading.tsx",
    "chars": 740,
    "preview": "import Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport './Loading.css';\n\nfunctio"
  },
  {
    "path": "src/components/Navbar/index.tsx",
    "chars": 6309,
    "preview": "import React, { ReactNode, useState } from 'react';\nimport AppBar from '@mui/material/AppBar';\nimport Toolbar from '@mui"
  },
  {
    "path": "src/components/ScrollToTopButton.tsx",
    "chars": 1143,
    "preview": "import { useState, useEffect } from 'react';\nimport Button from '@mui/material/Button';\nimport { Icon } from '@iconify/r"
  },
  {
    "path": "src/components/Separator.tsx",
    "chars": 483,
    "preview": "import { Divider } from '@mui/material';\nimport React from 'react';\n\ntype SeparatorProps = {\n  backgroundColor: string;\n"
  },
  {
    "path": "src/components/ToolBreadcrumb.tsx",
    "chars": 901,
    "preview": "import React from 'react';\nimport { Breadcrumbs, Typography, useTheme } from '@mui/material';\nimport { Link } from 'reac"
  },
  {
    "path": "src/components/ToolContent.tsx",
    "chars": 3816,
    "preview": "import React, { ReactNode, useContext, useEffect } from 'react';\nimport { Box } from '@mui/material';\nimport { Formik, F"
  },
  {
    "path": "src/components/ToolHeader.tsx",
    "chars": 4617,
    "preview": "import { Box, Button, Stack, styled, useTheme } from '@mui/material';\nimport Typography from '@mui/material/Typography';"
  },
  {
    "path": "src/components/ToolInfo.tsx",
    "chars": 486,
    "preview": "import { Box, Stack, Typography } from '@mui/material';\n\ninterface ExampleProps {\n  title: string;\n  description: string"
  },
  {
    "path": "src/components/ToolInputAndResult.tsx",
    "chars": 511,
    "preview": "import React, { ReactNode } from 'react';\nimport Grid from '@mui/material/Grid';\n\nexport default function ToolInputAndRe"
  },
  {
    "path": "src/components/ToolLayout.tsx",
    "chars": 2398,
    "preview": "import { Box } from '@mui/material';\nimport React, { ReactNode } from 'react';\nimport { Helmet } from 'react-helmet';\nim"
  },
  {
    "path": "src/components/UserTypeFilter.tsx",
    "chars": 1346,
    "preview": "import React from 'react';\nimport { Box, Chip } from '@mui/material';\nimport { UserType } from '@tools/defineTool';\nimpo"
  },
  {
    "path": "src/components/allTools/AllTools.tsx",
    "chars": 1219,
    "preview": "import { Box, Grid, Stack, Typography } from '@mui/material';\nimport ToolCard from './ToolCard';\nimport { IconifyIcon } "
  },
  {
    "path": "src/components/allTools/ToolCard.tsx",
    "chars": 1706,
    "preview": "import {\n  Box,\n  Card,\n  CardContent,\n  Link,\n  Stack,\n  Typography,\n  useTheme\n} from '@mui/material';\nimport { ToolCa"
  },
  {
    "path": "src/components/examples/ExampleCard.tsx",
    "chars": 3532,
    "preview": "import {\n  Box,\n  Card,\n  CardContent,\n  Stack,\n  TextField,\n  Typography,\n  useTheme\n} from '@mui/material';\nimport Arr"
  },
  {
    "path": "src/components/examples/ExampleOptions.tsx",
    "chars": 427,
    "preview": "import ToolOptionGroups from '@components/options/ToolOptionGroups';\nimport { GetGroupsType } from '@components/options/"
  },
  {
    "path": "src/components/examples/ToolExamples.tsx",
    "chars": 2145,
    "preview": "import { Box, Grid, Stack, Typography } from '@mui/material';\nimport ExampleCard, { ExampleCardProps } from './ExampleCa"
  },
  {
    "path": "src/components/index.css",
    "chars": 109,
    "preview": "a {\n  color: #1c76ce;\n}\n\na:hover {\n  color: #030362;\n}\n\n* {\n  font-family: Quicksand,sans-serif!important;\n}\n"
  },
  {
    "path": "src/components/input/BaseFileInput.tsx",
    "chars": 6778,
    "preview": "import React, { ReactNode, useContext, useEffect, useState } from 'react';\nimport { Box, useTheme } from '@mui/material'"
  },
  {
    "path": "src/components/input/InputFooter.tsx",
    "chars": 1033,
    "preview": "import { Stack } from '@mui/material';\nimport Button from '@mui/material/Button';\nimport PublishIcon from '@mui/icons-ma"
  },
  {
    "path": "src/components/input/NumericInputWithUnit.tsx",
    "chars": 5144,
    "preview": "import React, { useState, useEffect } from 'react';\nimport { Grid, Select, MenuItem } from '@mui/material';\nimport TextF"
  },
  {
    "path": "src/components/input/ToolAudioInput.tsx",
    "chars": 1414,
    "preview": "import React, { useRef } from 'react';\nimport { Box, Typography } from '@mui/material';\nimport BaseFileInput from './Bas"
  },
  {
    "path": "src/components/input/ToolCodeInput.tsx",
    "chars": 3843,
    "preview": "import { Box, useTheme } from '@mui/material';\nimport React, { useContext, useRef } from 'react';\nimport { CustomSnackBa"
  }
]

// ... and 523 more files (download for full content)

About this extraction

This page contains the full source code of the iib0011/omni-tools GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 723 files (2.4 MB), approximately 675.9k tokens, and a symbol index with 827 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!