From 61855ea7d34c06440226b23eb64395464dce8ad1 Mon Sep 17 00:00:00 2001 From: Bulesxz <1252455742@qq.com> Date: Sun, 6 Jul 2025 23:07:24 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E8=B5=84=E6=BA=90?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=E6=98=A0=E5=B0=84=202.=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=85=B3=E9=94=AE=E8=AF=8D=E6=B7=B7=E6=B7=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 313 +- key.txt | 403 +++ lib/core/css-obfuscator.js | 52 +- lib/core/file-structure-obfuscator.js | 467 +++ lib/core/html-obfuscator.js | 138 +- lib/core/js-obfuscator.js | 297 +- lib/core/keyword-obfuscator.js | 301 ++ lib/obfuscation-engine.js | 111 +- lib/utils/mapping-manager.js | 131 + lib/utils/random-utils.js | 93 + obfuscation-mapping.json | 9 + package-lock.json | 3486 ++++++++++++++++++----- test-project_original_backup/index.html | 51 + test-project_original_backup/key.txt | 403 +++ 14 files changed, 5200 insertions(+), 1055 deletions(-) create mode 100644 key.txt create mode 100644 lib/core/file-structure-obfuscator.js create mode 100644 lib/core/keyword-obfuscator.js create mode 100644 lib/utils/mapping-manager.js create mode 100644 obfuscation-mapping.json create mode 100644 test-project_original_backup/index.html create mode 100644 test-project_original_backup/key.txt diff --git a/README.md b/README.md index c8b9eed..38b7fbf 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,317 @@ -# 安装依赖 +# 前端代码混淆工具 -``` +一个强大的前端代码混淆工具,支持 JavaScript、TypeScript、HTML、CSS 的全方位混淆。 + +## 功能特性 + +### 🚀 核心混淆功能 +1. **代码函数名、变量名、类名、ID名替换** +2. **增加垃圾代码 + 30%** +3. **代码结构混淆** +4. **静态资源随机化** ✨ **新功能** +5. **代码对比,相似度低于10%** + +### 🎯 支持的文件类型 +- **JavaScript** (.js) - 高级混淆,支持ES6+ +- **TypeScript** (.ts, .tsx) - 类型安全的混淆 +- **HTML** (.html) - DOM结构和内联代码混淆 +- **CSS** (.css) - 选择器和样式混淆 + +### 🔧 静态资源随机化功能 ✨ + +在原有代码混淆基础上,新增了文件结构随机化功能: + +#### 文件结构随机化 +- **目录结构重组**: 将原始目录结构打散重组为随机目录 +- **文件路径随机化**: 静态资源文件随机分布到新目录中 +- **文件名混淆**: 对可重命名文件生成随机文件名 +- **引用自动更新**: 自动更新所有文件中的路径引用 + +#### 智能保护机制 +- **重要文件保护**: 自动识别并保护重要文件(如 index.html) +- **第三方库保护**: 跳过 node_modules 等第三方库目录 +- **配置文件保护**: 保护 package.json 等配置文件 + +### 🔤 关键词混淆功能 ✨ + +针对HTML文件中的敏感关键词进行深度混淆: + +#### 多重混淆方式 +- **Span标签包装**: 将关键词拆分为多个span标签 `外汇` +- **随机属性注入**: 添加随机class、id、data属性 `投` +- **不可见字符插入**: 使用零宽字符等不可见字符 `外汇交易` +- **混合模式**: 组合多种混淆方式达到最佳效果 + +#### 智能识别 +- **自动加载关键词**: 从 `key.txt` 文件加载关键词列表 +- **全长度处理**: 处理所有长度的关键词,包括2字符的短关键词 +- **精确HTML标签检测**: 智能识别HTML标签和属性,避免错误混淆 +- **重叠范围处理**: 防止关键词重叠导致的混淆错误 +- **长度优先**: 优先处理长关键词避免子串冲突 +- **强制混淆保证**: 确保每个关键词都被有效混淆,无遗漏 +- **随机化处理**: 每次运行使用不同的混淆方式 + +## 安装和使用 + +### 安装依赖 +```bash pnpm install ``` -# 运行 +### 运行混淆 +```bash +# 基础用法 +node ./bin/obfuscate.js ./demo +# 或者使用 npm script +npm start ./demo ``` -node ./bin/obfuscate.js ./demo + +## 混淆流程 + +```mermaid +graph TD + A[开始] --> B[创建备份] + B --> C[静态资源随机化] + C --> D[收集映射关系] + D --> E[执行代码混淆] + E --> F[关键词混淆] + F --> G[应用结果] + G --> H[保存映射文件] + H --> I[完成] ``` -# 要求 +### 详细流程说明 + +1. **备份阶段** + - 创建原始文件备份 + - 建立工作目录 + +2. **静态资源随机化** + - 扫描项目结构 + - 生成随机目录结构 + - 移动文件到新位置 + - 更新所有引用 + +3. **映射收集** + - HTML: 收集类名和ID + - CSS: 收集选择器 + - JS/TS: 收集全局变量和选择器引用 + +4. **代码混淆** + - JavaScript: 高级混淆 + 控制流平坦化 + - TypeScript: 类型移除 + JavaScript混淆 + - HTML: DOM混淆 + 内联代码处理 + - CSS: 选择器替换 + 样式压缩 + +5. **关键词混淆** ✨ **新增** + - 加载关键词列表 + - 多重混淆算法处理 + - span标签 + 不可见字符 + 随机属性 +6. **结果应用** + - 清空目标目录 + - 复制混淆结果 + - 生成映射文件 + +## 混淆配置 + +### JavaScript/TypeScript 混淆选项 +```javascript +{ + // 基础配置 + compact: true, + controlFlowFlattening: true, + controlFlowFlatteningThreshold: 0.75, + + // 死代码注入 + deadCodeInjection: true, + deadCodeInjectionThreshold: 0.4, + + // 字符串混淆 + stringArray: true, + stringArrayEncoding: ['base64'], + stringArrayThreshold: 0.8, + + // 标识符混淆 + identifierNamesGenerator: 'hexadecimal', + identifiersPrefix: 'obf_', + + // 安全防护 + selfDefending: true, + debugProtection: false +} ``` -1. 代码函数名、变量名、类名、ID名替换 -2. 增加垃圾代码 + 30% -3. 代码结构混淆 -4. 代码对比,相似度低于10% + +### HTML 混淆选项 +```javascript +{ + hexEncode: true, // 十六进制编码 + unicodeEncode: true, // Unicode编码 + removeComments: true, // 移除注释 + compressWhitespace: true // 压缩空白 +} ``` -# 注意 +### CSS 混淆选项 +- 选择器替换 +- 样式压缩 +- 无用代码注入 +- 注释移除 + +## 输出文件 +### 混淆结果 +- 混淆后的项目文件(覆盖原文件) +- 原始文件备份(`*_original_backup/`) + +### 映射文件 +生成 `obfuscation-mapping.json` 文件,包含: +```json +{ + "files": { + "static/js/main.js": "app_a1b2c3/file_d4e5f6.js", + "images/logo.png": "res_x1y2z3/asset_m7n8o9.png" + }, + "globals": { + "myFunction": "obf_f1g2h3" + } +} ``` -类名、ID名暂屏蔽处理 + +### 混淆效果示例 + +#### 关键词混淆效果 +```html + +
外汇交易は重要な投資手法です。バリュー投資やグロース株への投資も人気があります。
+ + +外汇交易は重要な投資手法です。バリュー投資やグロース株への投資も人気があります。
+``` + +#### 统计信息 +混淆过程中会显示详细的统计信息: +``` +📝 加载了 403 个关键词 +🔤 混淆了 18 个关键词 +📊 混淆统计信息: + 📁 文件映射: 15个文件重新分布 + 📁 目录映射: 5个目录重新组织 + 🔧 全局变量映射: 8个变量已替换 + 🔤 关键词混淆: 18个敏感词已处理 + 📈 文件结构相似度: 接近0% + 📈 代码相似度: 低于10% + 📈 关键词识别度: 接近0% + ✅ 混淆稳定性: 100%保证 ``` + +## 注意事项 + +### ⚠️ 使用警告 +- **关键词文件**: 需要在项目根目录提供 `key.txt` 文件 +- **HTML结构**: 关键词混淆可能会增加HTML文件大小 +- **大文件处理**: 超过1MB的文件会被跳过 +- **模块系统**: 保护ES6模块的导入/导出 +- **第三方库**: 自动跳过 node_modules 等目录 + +### 📋 重要文件保护 +以下文件会被自动保护,不会被移动或重命名: +- `package.json`, `package-lock.json` +- `index.html`(根目录) +- 配置文件(`tsconfig.json`, `webpack.config.js` 等) +- 隐藏文件(`.gitignore`, `.env` 等) + +## 性能优化 + +### 文件处理优化 +- **并行处理**: 支持多文件并行混淆 +- **内存管理**: 大文件跳过处理避免内存溢出 +- **缓存机制**: 映射关系复用提高效率 + +### 混淆强度调节 +可根据项目需求调整混淆强度: +- **高强度**: 完整功能开启(默认) +- **中强度**: 关闭调试保护等高消耗功能 +- **低强度**: 仅基础混淆,适合大型项目 + +## 故障排除 + +### 常见问题 +1. **混淆后代码无法运行** + - 检查是否有重要的全局变量被误混淆 + - 查看映射文件确认替换是否正确 + +2. **文件引用错误** + - 确认所有文件路径引用格式正确 + - 检查是否有动态生成的路径 + +3. **第三方库异常** + - 确认 node_modules 是否被正确排除 + - 检查 CDN 引用是否完整 + +### 调试模式 +生成的映射文件可用于调试和问题排查,包含完整的转换记录。 + +## 版本历史 + +### v2.1.2 - 关键词混淆稳定性修复 🛠️ +- 🎯 修复混淆方法概率问题,确保所有关键词都能被有效混淆 +- 🔒 强制执行混淆逻辑,防止任何关键词被跳过 +- ✅ 解决HTML标题标签中"投資"等关键词未混淆的问题 +- 🔄 增强混淆稳定性,每次运行都保证混淆效果 + +### v2.1.1 - 关键词混淆优化 🔧 +- 🔤 修复短关键词跳过问题,现在处理所有长度的关键词 +- 🎯 改进HTML标签检测算法,避免错误混淆 +- 🔀 增强重叠范围处理,防止关键词冲突 +- 📈 提升混淆准确性和覆盖率 + +### v2.1.0 - 关键词混淆增强 ✨ +- 🔤 新增关键词混淆功能 +- 🔀 多重混淆算法(span包装、不可见字符、随机属性) +- 🎲 完全随机化混淆标记 +- 🛡️ 智能HTML标签保护 +- 📝 支持403个日文关键词自动识别 + +### v2.0.0 - 静态资源随机化 +- ✨ 新增文件结构随机化功能 +- ✨ 新增映射管理器 +- ✨ 增强的跨文件引用处理 +- 🔧 改进的HTML/CSS混淆器 +- 📊 增加统计信息输出 + +### v1.0.0 - 基础版本 +- 🎯 JavaScript/TypeScript 混淆 +- 🎯 HTML/CSS 基础混淆 +- 🎯 备份和恢复机制 + +## 关键词文件配置 + +### 创建关键词文件 +在项目根目录创建 `key.txt` 文件,每行一个关键词: +``` +投資戦略 +株式投資 +外汇交易 +バリュー投資 +資産運用 +長期投資 +高配当株 +インデックスファンド +``` + +### 配置说明 +- **文件位置**: 项目根目录的 `key.txt` +- **文件格式**: 每行一个关键词,支持任何语言 +- **关键词顺序**: 建议按长度降序排列以避免子串冲突 +- **空行处理**: 自动忽略空行和空白行 +- **字符编码**: 支持UTF-8编码,兼容中文、日文、韩文等 + +> 💡 **提示**: 关键词越多,混淆效果越好,但也会增加处理时间 + +--- + +**注意**: 此工具主要用于代码保护,请确保在生产环境使用前进行充分测试。 diff --git a/key.txt b/key.txt new file mode 100644 index 0000000..04fab32 --- /dev/null +++ b/key.txt @@ -0,0 +1,403 @@ +注目銘柄 +股票上涨 (株価の急上昇) +投资收益率(投資収益率) +个股(個別銘柄) +投资价值(投資価値) +日本股票 +股票投资 +证券交易 +株式投資 +投資戦略 +收益率 +日本株 +外汇交易 +株式市場 +分散投資 +長期投資 +投資損失 +日経平均 +株式投資 +株式投資 +損失回避 +生成AI +自然言語処理(NLP) +テレメディスン +バリュー投資 +資産運用 +上場企業 +投資手法 +投資顧問 +AI半導体 +画像認識 +電子カルテ(EHR) +グロース株 +株価分析 +株式ニュース +投資の始め方 +投資 +データセンター +エッジコンピューティング +遺伝子編集 +高配当株 +資金運用 +株式レポート +投資リスク +投資ブログ +量子コンピュータ +5G通信 +パーソナライズ医療 +小型株 +投資戦略 +株式投資コミュニティ +資本市場 +投資書籍 +デジタルトランスフォーメーション(DX) +モノのインターネット(IoT) +バイオテクノロジー +ブルーチップ株 +投資教育 +株式投資アプリ +Google株式会社の株 +株式投資ツール +スマートファクトリー +ロボット技術 +医療ロボット +ETF投資 +NASDAQ:GOOGL +長期投資 +アメリカの株式 +短期投資 +フィンテック(FinTech) +自動運転 +ヘルスモニタリング機器 +インデックスファンド +外国株式 +ポジション投資 +高配当株 +取引所 +サイバーセキュリティ +拡張現実(AR) +高齢化社会 +アクティブファンド +成長株 +株式取引 +優良株 +取引プラットフォーム +遠隔医療 +仮想現実(VR) +医療データ分析 +パッシブファンド +中小型株 +投資目標 +投資信託 +投資成果 +ヘルステック(HealthTech) +ブロックチェーン +ワクチン開発 +新興市場 +上場投資信託(ETF) +投資収益 +株式市場 +投資評価 +半導体製造装置 +暗号通貨 +大阪万博 +金融リテラシー +市場動向 +株価指数 +経済指標 +日本株式市場 +電気自動車(EV) +ビットコイン +インバウンド観光 +投資戦略 +投資機会 +ダウ・ジョーンズ工業株30種平均 +市場分析 +S&P 500指数 +水素エネルギー +デジタル通貨 +テレワーク +リスク管理 +株価予測 +NASDAQ指数 +投資タイミング +バフェット +原子力発電 +分散型金融(DeFi) +オンライン教育 +テクニカル分析 +株式行情 +株式ファンド +強気相場 +インデックス投資 +再生可能エネルギー +スマートコントラクト +デジタルエンタメ +ファンダメンタル分析 +弱気相場 +分散投資 +投資基礎 +投資ポートフォリオ +スマートグリッド +セキュリティトークン(STO) +eスポーツ +クオンツ投資 +スイングトレーディング +投資ニュース +デイトレーディング +株式市場ニュース +電池技術 +非代替性トークン(NFT) +SNSマーケティング +行動ファイナンス +ポジショントレーディング +投資の未来 +株価チャート +株式の歴史 +カーボンニュートラル +レグテック(RegTech) +コンテンツクリエイター +ポートフォリオ分散 +テクニカル分析 +投資の法則 +ファンダメンタル分析 +投資心理学 +グリーンテクノロジー +インシュアテック(InsurTech) +バーチャルアイドル +リタイアメントプランニング +ティッカーシンボル +投資のテクニック +株式板 +株式売買 +省エネ技術 +資産運用 +デジタルアート +節税対策 +投資アプリ +投資リスク +投資リスク管理 +株式の種類 +コーポレートガバナンス +日経平均株価 +損切りライン +日本株式市場 +利確 +日本株式 +SDGs(持続可能な開発目標) +東証株価指数(TOPIX) +投資ポートフォリオ +東京証券取引所 +分散投資 +日本版NASDAQ +ESG投資 +東京証券取引所 +株式売買 +日本の投資信託 +資金管理 +日本ETF(上場投資信託) +CSR(企業の社会的責任) +日本銀行政策 +投資心理 +日本投資戦略 +投資の罠 +日本株式ニュース +人材マネジメント +為替変動 +日本株式分析 +日本投資市場 +ダイバーシティとインクルージョン +インフレ(物価上昇) +株式投資 +損失回避 +生成AI +自然言語処理(NLP) +テレメディスン +バリュー投資 +資産運用 +上場企業 +投資手法 +投資顧問 +AI半導体 +画像認識 +電子カルテ(EHR) +グロース株 +株価分析 +株式ニュース +投資の始め方 +投資 +データセンター +エッジコンピューティング +遺伝子編集 +高配当株 +資金運用 +株式レポート +投資リスク +投資ブログ +量子コンピュータ +5G通信 +パーソナライズ医療 +小型株 +投資戦略 +株式投資コミュニティ +資本市場 +投資書籍 +デジタルトランスフォーメーション(DX) +モノのインターネット(IoT) +バイオテクノロジー +ブルーチップ株 +投資教育 +株式投資アプリ +Google株式会社の株 +株式投資ツール +スマートファクトリー +ロボット技術 +医療ロボット +ETF投資 +NASDAQ:GOOGL +長期投資 +アメリカの株式 +短期投資 +フィンテック(FinTech) +自動運転 +ヘルスモニタリング機器 +インデックスファンド +外国株式 +ポジション投資 +高配当株 +取引所 +サイバーセキュリティ +拡張現実(AR) +高齢化社会 +アクティブファンド +成長株 +株式取引 +優良株 +取引プラットフォーム +遠隔医療 +仮想現実(VR) +医療データ分析 +パッシブファンド +中小型株 +投資目標 +投資信託 +投資成果 +ヘルステック(HealthTech) +ブロックチェーン +ワクチン開発 +新興市場 +上場投資信託(ETF) +投資収益 +株式市場 +投資評価 +半導体製造装置 +暗号通貨 +大阪万博 +金融リテラシー +市場動向 +株価指数 +経済指標 +日本株式市場 +電気自動車(EV) +ビットコイン +インバウンド観光 +投資戦略 +投資機会 +ダウ・ジョーンズ工業株30種平均 +市場分析 +S&P 500指数 +水素エネルギー +デジタル通貨 +テレワーク +リスク管理 +株価予測 +NASDAQ指数 +投資タイミング +バフェット +原子力発電 +分散型金融(DeFi) +オンライン教育 +テクニカル分析 +株式行情 +株式ファンド +強気相場 +インデックス投資 +再生可能エネルギー +スマートコントラクト +デジタルエンタメ +ファンダメンタル分析 +弱気相場 +分散投資 +投資基礎 +投資ポートフォリオ +スマートグリッド +セキュリティトークン(STO) +eスポーツ +クオンツ投資 +スイングトレーディング +投資ニュース +デイトレーディング +株式市場ニュース +電池技術 +非代替性トークン(NFT) +SNSマーケティング +行動ファイナンス +ポジショントレーディング +投資の未来 +株価チャート +株式の歴史 +カーボンニュートラル +レグテック(RegTech) +コンテンツクリエイター +ポートフォリオ分散 +テクニカル分析 +投資の法則 +ファンダメンタル分析 +投資心理学 +グリーンテクノロジー +インシュアテック(InsurTech) +バーチャルアイドル +リタイアメントプランニング +ティッカーシンボル +投資のテクニック +株式板 +株式売買 +省エネ技術 +資産運用 +デジタルアート +節税対策 +投資アプリ +投資リスク +投資リスク管理 +株式の種類 +コーポレートガバナンス +日経平均株価 +損切りライン +日本株式市場 +利確 +日本株式 +SDGs(持続可能な開発目標) +東証株価指数(TOPIX) +投資ポートフォリオ +東京証券取引所 +分散投資 +日本版NASDAQ +ESG投資 +東京証券取引所 +株式売買 +日本の投資信託 +資金管理 +日本ETF(上場投資信託) +CSR(企業の社会的責任) +日本銀行政策 +投資心理 +日本投資戦略 +投資の罠 +日本株式ニュース +人材マネジメント +為替変動 +日本株式分析 +日本投資市場 +ダイバーシティとインクルージョン +インフレ(物価上昇) \ No newline at end of file diff --git a/lib/core/css-obfuscator.js b/lib/core/css-obfuscator.js index 8f2f482..277beb2 100644 --- a/lib/core/css-obfuscator.js +++ b/lib/core/css-obfuscator.js @@ -48,59 +48,10 @@ class CssObfuscator { return result.css; } catch (error) { console.error("PostCSS处理错误:", error); - throw error; // 抛出错误给上层 + throw error; } } - // static _createPlugin(mapping, isCollection) { - // return { - // postcssPlugin: 'css-obfuscator', - // Rule(rule) { - // rule.selector = rule.selector.split(/\s*,\s*/).map(selector => { - // return selector.replace(/([.#])([\w-]+)/g, (match, prefix, name) => { - // if (isCollection) { - // const mapKey = prefix === '.' ? 'classes' : 'ids'; - // if (!mapping[mapKey].has(name)) { - // const obf = RandomUtils.randomIdentifier(); - // mapping[mapKey].set(name, obf); - - // // 存储带符号的选择器 - // const selector = prefix + name; - // const selectorMap = prefix === '.' ? 'classSelectors' : 'idSelectors'; - // mapping[selectorMap].set(selector, prefix + obf); - // } - // return match; // 收集时不修改 - // } - - // const newName = mapping[prefix === '.' ? 'classes' : 'ids'].get(name); - // return newName ? `${prefix}${newName}` : match; - // }); - // }).join(', '); - // } - // }; - // } - - // 类名混淆插件(可选) - static _classObfuscationPlugin(mapping) { - return { - postcssPlugin: 'class-obfuscator', - Rule(rule) { - // 处理选择器 - const transformed = rule.selector.split(/\s*,\s*/).map(selector => { - return selector.replace(/([.#])([\w-]+)/g, (match, prefix, name) => { - if (prefix === '.' && mapping?.classes?.has(name)) { - return `.${mapping.classes.get(name)}`; - } - return match; - }); - }).join(', '); - - rule.selector = transformed; - } - }; - } - - static _addDeadCode() { return { postcssPlugin: 'css-dead-code', @@ -112,7 +63,6 @@ class CssObfuscator { } } -// CssObfuscator._createPlugin.postcss = true; CssObfuscator._addDeadCode.postcss = true; module.exports = CssObfuscator; \ No newline at end of file diff --git a/lib/core/file-structure-obfuscator.js b/lib/core/file-structure-obfuscator.js new file mode 100644 index 0000000..a841f55 --- /dev/null +++ b/lib/core/file-structure-obfuscator.js @@ -0,0 +1,467 @@ +const fs = require('fs-extra'); +const path = require('path'); +const crypto = require('crypto'); + +class FileStructureObfuscator { + constructor(mappingManager) { + this.mappingManager = mappingManager; + this.preservedDirectories = new Set([ + 'node_modules', '.git', '.vscode', '.idea', + 'dist', 'build', 'coverage', 'test', 'tests', + '.svn', '.hg', 'vendor', 'packages' + ]); + + this.preservedFiles = new Set([ + 'package.json', 'package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', + '.gitignore', '.gitattributes', 'README.md', 'LICENSE', 'CHANGELOG.md', + 'tsconfig.json', 'webpack.config.js', 'vite.config.js', 'rollup.config.js' + ]); + } + + async process(projectPath) { + try { + console.log('🔄 开始静态资源随机化处理...'); + + // 扫描项目结构 + const structure = await this.scanProjectStructure(projectPath); + console.log(`📁 扫描到 ${structure.directories.length} 个目录, ${structure.files.length} 个文件`); + + // 生成新的目录结构 + const newStructure = this.generateObfuscatedStructure(structure); + console.log(`🎲 生成 ${newStructure.newDirectories.length} 个新目录`); + + // 执行文件移动 + await this.reorganizeFiles(projectPath, newStructure); + + // 更新所有文件中的路径引用 + await this.updatePathReferences(projectPath); + + console.log('✅ 静态资源随机化处理完成'); + return { + success: true, + originalStructure: structure, + newStructure: newStructure + }; + } catch (error) { + console.error('❌ 文件结构混淆失败:', error.message); + throw new Error(`文件结构混淆失败: ${error.message}`); + } + } + + async scanProjectStructure(projectPath) { + const structure = { + directories: [], + files: [] + }; + + const scanDirectory = async (dirPath, relativePath = '') => { + const items = await fs.readdir(dirPath); + + for (const item of items) { + const fullPath = path.join(dirPath, item); + const relativeItemPath = path.join(relativePath, item); + const stat = await fs.stat(fullPath); + + if (stat.isDirectory()) { + // 跳过保留的目录 + if (this.preservedDirectories.has(item) || item.startsWith('.')) { + continue; + } + + structure.directories.push({ + name: item, + path: relativeItemPath, + fullPath: fullPath + }); + + // 递归扫描子目录 + await scanDirectory(fullPath, relativeItemPath); + } else { + // 跳过保留的文件 + if (this.preservedFiles.has(item) || item.startsWith('.')) { + continue; + } + + structure.files.push({ + name: item, + path: relativeItemPath, + fullPath: fullPath, + directory: relativePath + }); + } + } + }; + + await scanDirectory(projectPath); + return structure; + } + + generateObfuscatedStructure(originalStructure) { + const newStructure = { + directoryMapping: new Map(), + fileMapping: new Map(), + newDirectories: [] + }; + + // 生成扁平化的随机目录结构 + const maxDepth = 3; + const dirCount = Math.min(10, Math.max(3, Math.floor(originalStructure.directories.length / 2))); + + // 创建随机目录名 + for (let i = 0; i < dirCount; i++) { + const depth = Math.floor(Math.random() * maxDepth) + 1; + const dirPath = this.generateRandomDirectoryPath(depth); + newStructure.newDirectories.push(dirPath); + } + + // 如果没有生成足够的目录,添加一些默认目录 + if (newStructure.newDirectories.length === 0) { + newStructure.newDirectories.push( + this.generateRandomString(8), + path.join(this.generateRandomString(6), this.generateRandomString(8)), + path.join(this.generateRandomString(5), this.generateRandomString(7), this.generateRandomString(6)) + ); + } + + // 将原始目录映射到新目录 + const shuffledOriginalDirs = this.shuffleArray([...originalStructure.directories]); + shuffledOriginalDirs.forEach((dir, index) => { + const targetDirIndex = index % newStructure.newDirectories.length; + const targetDir = newStructure.newDirectories[targetDirIndex]; + newStructure.directoryMapping.set(dir.path, targetDir); + }); + + // 分离需要保持在根目录的文件和需要移动的文件 + const filesToMove = []; + const preservedFiles = []; + + originalStructure.files.forEach(file => { + // 检查是否为需要保持在根目录的文件 + if (file.name.toLowerCase() === 'index.html' && file.directory === '') { + preservedFiles.push(file); + console.log(`🔒 保持文件在根目录: ${file.name}`); + } else if (this.isImportantFile(file.name)) { + preservedFiles.push(file); + console.log(`🔒 保持重要文件: ${file.name}`); + } else { + filesToMove.push(file); + } + }); + + // 随机分配需要移动的文件到新目录 + const shuffledFiles = this.shuffleArray([...filesToMove]); + shuffledFiles.forEach((file, index) => { + const targetDirIndex = index % newStructure.newDirectories.length; + const targetDir = newStructure.newDirectories[targetDirIndex]; + + // 生成新文件名(可选) + const newFileName = this.shouldRenameFile(file.name) + ? this.generateObfuscatedFileName(file.name, path.extname(file.name)) + : file.name; + + const newFilePath = path.join(targetDir, newFileName); + + newStructure.fileMapping.set(file.path, newFilePath); + }); + + // 保持在根目录的文件不添加到映射中,这样它们就不会被移动 + preservedFiles.forEach(file => { + console.log(`⏭️ 跳过移动文件: ${file.path} (保持在根目录)`); + }); + + return newStructure; + } + + async reorganizeFiles(projectPath, newStructure) { + // 创建新目录 + for (const newDir of newStructure.newDirectories) { + const fullDirPath = path.join(projectPath, newDir); + await fs.ensureDir(fullDirPath); + console.log(`📁 创建目录: ${newDir}`); + } + + // 移动文件 + for (const [originalPath, newPath] of newStructure.fileMapping) { + const sourceFullPath = path.join(projectPath, originalPath); + const targetFullPath = path.join(projectPath, newPath); + + try { + // 检查目标文件是否存在 + const targetExists = await fs.pathExists(targetFullPath); + if (targetExists) { + // 如果是系统文件,先删除目标文件 + const fileName = path.basename(originalPath); + if (fileName === '.DS_Store' || fileName.startsWith('.')) { + await fs.remove(targetFullPath); + } else { + console.warn(`⚠️ 目标文件已存在,跳过移动: ${originalPath} -> ${newPath}`); + continue; + } + } + + await fs.move(sourceFullPath, targetFullPath); + console.log(`📝 移动文件: ${originalPath} -> ${newPath}`); + + // 记录映射关系 - 使用相对路径 + const relativeOriginalPath = originalPath.replace(/\\/g, '/'); + const relativeNewPath = newPath.replace(/\\/g, '/'); + this.mappingManager.addFile(relativeOriginalPath, relativeNewPath); + } catch (error) { + console.warn(`❌ 文件移动失败 ${originalPath} -> ${newPath}:`, error.message); + } + } + + // 清理空的原始目录 + await this.cleanEmptyDirectories(projectPath); + } + + async updatePathReferences(projectPath) { + try { + console.log('🔄 开始统一更新文件引用...'); + + // 获取所有HTML、CSS、JS文件 + const htmlFiles = await this.findFiles(projectPath, /\.(html|htm)$/i); + const cssFiles = await this.findFiles(projectPath, /\.css$/i); + const jsFiles = await this.findFiles(projectPath, /\.js$/i); + + const allFiles = [...htmlFiles, ...cssFiles, ...jsFiles]; + console.log(`📄 找到 ${htmlFiles.length} 个HTML文件,${cssFiles.length} 个CSS文件,${jsFiles.length} 个JS文件`); + + // 获取文件映射 + const allMappings = this.mappingManager.getAllMappings(); + + if (!allMappings.files || Object.keys(allMappings.files).length === 0) { + console.log('📭 无文件映射需要更新'); + return; + } + + // 更新每个文件中的路径引用 + for (const filePath of allFiles) { + await this.updateFilePathReferences(filePath, allMappings, projectPath); + } + + console.log('✅ 所有文件引用更新完成'); + } catch (error) { + console.warn('❌ 更新路径引用失败:', error.message); + } + } + + async updateFilePathReferences(filePath, allMappings, projectPath) { + try { + let content = await fs.readFile(filePath, 'utf8'); + let updated = false; + + // 更新文件路径引用 + if (allMappings.files && Object.keys(allMappings.files).length > 0) { + for (const [originalPath, newPath] of Object.entries(allMappings.files)) { + const escapedOriginalPath = this.escapeRegExp(originalPath); + + // 1. HTML 属性中的路径 (src, href, data-src 等) + const htmlAttrPattern = new RegExp(`((?:src|href|data-src|data-href)\\s*=\\s*["'])([^"']*?)${escapedOriginalPath}(["'])`, 'gi'); + const newContent1 = content.replace(htmlAttrPattern, (match, prefix, pathPrefix, suffix) => { + return `${prefix}${pathPrefix}${newPath}${suffix}`; + }); + if (newContent1 !== content) { + content = newContent1; + updated = true; + } + + // 2. CSS 中的 url() + const cssUrlPattern = new RegExp(`(url\\s*\\(\\s*["']?)([^"']*?)${escapedOriginalPath}(["']?\\s*\\))`, 'gi'); + const newContent2 = content.replace(cssUrlPattern, (match, prefix, pathPrefix, suffix) => { + return `${prefix}${pathPrefix}${newPath}${suffix}`; + }); + if (newContent2 !== content) { + content = newContent2; + updated = true; + } + + // 3. JavaScript import/require 语句 + const jsImportPattern = new RegExp(`((?:import|require)\\s*\\(\\s*["'])([^"']*?)${escapedOriginalPath}(["']\\s*\\))`, 'gi'); + const newContent3 = content.replace(jsImportPattern, (match, prefix, pathPrefix, suffix) => { + return `${prefix}${pathPrefix}${newPath}${suffix}`; + }); + if (newContent3 !== content) { + content = newContent3; + updated = true; + } + + // 4. ES6 import 语句 + const es6ImportPattern = new RegExp(`(import\\s+[^"']*?["'])([^"']*?)${escapedOriginalPath}(["'])`, 'gi'); + const newContent4 = content.replace(es6ImportPattern, (match, prefix, pathPrefix, suffix) => { + return `${prefix}${pathPrefix}${newPath}${suffix}`; + }); + if (newContent4 !== content) { + content = newContent4; + updated = true; + } + } + } + + // 更新ID引用(针对JavaScript文件) + if (path.extname(filePath) === '.js' && allMappings.ids && Object.keys(allMappings.ids).length > 0) { + for (const [originalId, newId] of Object.entries(allMappings.ids)) { + // 匹配各种ID选择器格式 + const patterns = [ + // jQuery选择器: $('#id'), $("#id"), $('selector#id') + new RegExp(`(['"\`])#${this.escapeRegExp(originalId)}\\b`, 'g'), + // document.getElementById('id') + new RegExp(`getElementById\\s*\\(\\s*['"\`]${this.escapeRegExp(originalId)}['"\`]\\s*\\)`, 'g'), + // querySelector('#id') + new RegExp(`querySelector\\s*\\(\\s*['"\`]#${this.escapeRegExp(originalId)}\\b`, 'g'), + // querySelectorAll('#id') + new RegExp(`querySelectorAll\\s*\\(\\s*['"\`]#${this.escapeRegExp(originalId)}\\b`, 'g'), + ]; + + for (const pattern of patterns) { + if (pattern.test(content)) { + if (pattern.source.includes('getElementById')) { + content = content.replace(pattern, `getElementById('${newId}')`); + } else if (pattern.source.includes('querySelector')) { + content = content.replace(pattern, `querySelector('#${newId}'`); + } else if (pattern.source.includes('querySelectorAll')) { + content = content.replace(pattern, `querySelectorAll('#${newId}'`); + } else { + // jQuery选择器 + content = content.replace(pattern, `$1#${newId}`); + } + updated = true; + console.log(`✅ 更新JavaScript中的ID引用: ${originalId} -> ${newId}`); + } + } + } + } + + if (updated) { + await fs.writeFile(filePath, content, 'utf8'); + console.log(`✅ 文件引用更新: ${path.relative(projectPath, filePath)}`); + } + } catch (error) { + console.warn(`❌ 更新文件引用失败 ${filePath}:`, error.message); + } + } + + async cleanEmptyDirectories(projectPath) { + const cleanDirectory = async (dirPath) => { + try { + const items = await fs.readdir(dirPath); + + // 递归清理子目录 + for (const item of items) { + const itemPath = path.join(dirPath, item); + const stat = await fs.stat(itemPath); + + if (stat.isDirectory() && !this.preservedDirectories.has(item)) { + await cleanDirectory(itemPath); + } + } + + // 检查目录是否为空 + const updatedItems = await fs.readdir(dirPath); + if (updatedItems.length === 0 && dirPath !== projectPath) { + await fs.rmdir(dirPath); + console.log(`🗑️ 清理空目录: ${path.relative(projectPath, dirPath)}`); + } + } catch (error) { + // 忽略清理失败 + } + }; + + await cleanDirectory(projectPath); + } + + generateRandomDirectoryPath(depth) { + const segments = []; + for (let i = 0; i < depth; i++) { + segments.push(this.generateRandomDirectoryName()); + } + return segments.join(path.sep); + } + + generateRandomDirectoryName() { + const prefixes = ['app', 'src', 'lib', 'mod', 'core', 'util', 'com', 'data', 'res', 'assets']; + const prefix = prefixes[Math.floor(Math.random() * prefixes.length)]; + const suffix = this.generateRandomString(6); + return `${prefix}_${suffix}`; + } + + generateObfuscatedFileName(originalName, extension) { + const baseName = path.basename(originalName, extension); + + // 保留重要文件名 + const importantFiles = ['index', 'main', 'app', 'config']; + if (importantFiles.includes(baseName.toLowerCase())) { + return originalName; + } + + // 生成新文件名 + const prefixes = ['file', 'mod', 'comp', 'item', 'data', 'core', 'res', 'asset']; + const prefix = prefixes[Math.floor(Math.random() * prefixes.length)]; + const suffix = this.generateRandomString(8); + + return `${prefix}_${suffix}${extension}`; + } + + shouldRenameFile(fileName) { + const ext = path.extname(fileName).toLowerCase(); + const baseName = path.basename(fileName, ext).toLowerCase(); + + // 不重命名重要文件 + const importantFiles = ['index', 'main', 'app', 'config']; + if (importantFiles.includes(baseName)) { + return false; + } + + // 静态资源文件可以重命名 + const renameableExtensions = ['.js', '.css', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf']; + return renameableExtensions.includes(ext); + } + + isImportantFile(fileName) { + const baseName = path.basename(fileName, path.extname(fileName)).toLowerCase(); + const importantFiles = ['index', 'main', 'app', 'config']; + return importantFiles.includes(baseName); + } + + shuffleArray(array) { + const shuffled = [...array]; + for (let i = shuffled.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; + } + return shuffled; + } + + async findFiles(dirPath, pattern) { + const files = []; + const items = await fs.readdir(dirPath, { withFileTypes: true }); + + for (const item of items) { + const fullPath = path.join(dirPath, item.name); + + // 跳过node_modules和隐藏目录 + if (item.name.startsWith('.') || this.preservedDirectories.has(item.name)) { + continue; + } + + if (item.isDirectory()) { + const subFiles = await this.findFiles(fullPath, pattern); + files.push(...subFiles); + } else if (pattern.test(item.name)) { + files.push(fullPath); + } + } + + return files; + } + + generateRandomString(length) { + return crypto.randomBytes(length).toString('hex').substring(0, length); + } + + escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } +} + +module.exports = FileStructureObfuscator; \ No newline at end of file diff --git a/lib/core/html-obfuscator.js b/lib/core/html-obfuscator.js index aa3debc..a5fbd97 100644 --- a/lib/core/html-obfuscator.js +++ b/lib/core/html-obfuscator.js @@ -6,10 +6,22 @@ const RandomUtils = require('../utils/random-utils'); const CssObfuscator = require('./css-obfuscator'); const JsObfuscator = require('./js-obfuscator'); const TsObfuscator = require('./ts-obfuscator'); // 添加 TypeScript 支持 +const KeywordObfuscator = require('./keyword-obfuscator'); // 添加关键词混淆器 // const BufferPolyfill = require('../utils/buffer-polyfill'); class HtmlObfuscator { + static keywordObfuscator = null; + + // 初始化关键词混淆器 + static async initKeywordObfuscator() { + if (!this.keywordObfuscator) { + this.keywordObfuscator = new KeywordObfuscator(); + await this.keywordObfuscator.loadKeywords(); + } + } + static async collectMappings(filePath, mapping) { + // 保持原有的注释状态 - 不收集类名和ID映射 // const html = await fs.readFile(filePath, 'utf8'); // const $ = cheerio.load(html); @@ -49,6 +61,7 @@ class HtmlObfuscator { compressWhitespace = true } = options; + // 保持原有的注释逻辑 - 不处理类名和ID映射 // // 混淆类和ID // $('[class]').each((i, el) => { // const newClasses = $(el).attr('class').split(/\s+/) @@ -64,7 +77,6 @@ class HtmlObfuscator { // } // }); - const stylePromises = []; // 混淆内联样式和脚本 @@ -107,124 +119,24 @@ class HtmlObfuscator { }); } - // 处理所有文本节点 // 压缩空白 - if (hexEncode || unicodeEncode || addWhitespace) { - $('body, head').find('*').contents().each(function () { - // 只处理文本节点,跳过脚本和样式 - if (this.type === 'text' && - this.parentNode && - !['script', 'style', 'code', 'pre'].includes(this.parentNode.tagName)) { - const originalText = $(this).text(); - const obfuscatedText = HtmlObfuscator.obfuscateText(originalText, options); - const bkText = obfuscatedText - .replace(/\s+/g, ' ') - .trim() - $(this).replaceWith(bkText); - } - }); - } - - // // 打乱元素顺序 - // if (shuffleElements) { - // this.shuffleChildElements($('body'), $); - // this.shuffleChildElements($('head'), $); - // } - - // 插入随机死代码 - $('body').append(``); - - // // 注入 Buffer polyfill(如果需要) - // const hasScript = $('script').length > 0; - // if (hasScript) { - // $('script').first().before(``); - // } else { - // $('body').append(``); - // } + // 获取HTML字符串 + let htmlResult = $.html(); - return $.html(); - } - - /** - * 混淆文本内容 - * @param {string} text - 原始文本 - * @param {Object} options - 混淆选项 - * @returns {string} 混淆后的文本 - */ - static obfuscateText(text, options) { - let result = text; - - // 字符编码转换 - if (options.hexEncode || options.unicodeEncode) { - result = result.split('').map(char => { - // 保留空白字符 - if (/\s/.test(char)) return char; - - // 随机决定是否编码 - if (Math.random() > 0.7) return char; - - if (options.hexEncode && Math.random() > 0.5) { - // 十六进制编码 - return `${char.charCodeAt(0).toString(16)};`; - } else if (options.unicodeEncode) { - // Unicode编码 - return `\\u${char.charCodeAt(0).toString(16).padStart(4, '0')}`; - } - return char; - }).join(''); - } - - // 添加随机空白 - if (options.addWhitespace) { - const whitespaceChars = [' ', '\t', '\n', '\r']; - result = result.split('').map(char => { - if (Math.random() > 0.9) { - // 随机插入空白字符 - const ws = whitespaceChars[crypto.randomInt(0, whitespaceChars.length)]; - return char + ws.repeat(crypto.randomInt(1, 3)); - } - return char; - }).join(''); + // 初始化并应用关键词混淆 + try { + await this.initKeywordObfuscator(); + if (this.keywordObfuscator && this.keywordObfuscator.keywords.length > 0) { + console.log('🔤 开始关键词混淆处理...'); + htmlResult = this.keywordObfuscator.obfuscateKeywords(htmlResult); + } + } catch (error) { + console.warn('⚠️ 关键词混淆失败:', error.message); } - return result; + return htmlResult; } - /** - * 打乱子元素顺序 - * @param {Cheerio} $parent - Cheerio父元素选择器 - * @param {Cheerio} $ - Cheerio实例 - */ - static shuffleChildElements($parent, $) { - // 只处理元素节点 - if (!$parent || !$parent.length) return; - - // 收集直接子元素节点 - const children = $parent.children().toArray(); - - // 过滤掉不应被打乱的元素 - const childElements = children.filter(child => - child.type === 'tag' && - !['script', 'style', 'noscript', 'link', 'meta'].includes(child.tagName) - ); - - // 打乱顺序 - if (childElements.length > 1) { - shuffle(childElements); - - // 清空父元素 - $parent.empty(); - - // 重新附加子元素 - childElements.forEach(child => { - $parent.append(child); - }); - } - // 递归处理子节点 - $parent.children().each((i, el) => { - this.shuffleChildElements($(el), $); - }); - } } module.exports = HtmlObfuscator; \ No newline at end of file diff --git a/lib/core/js-obfuscator.js b/lib/core/js-obfuscator.js index 09ca9a9..3932571 100644 --- a/lib/core/js-obfuscator.js +++ b/lib/core/js-obfuscator.js @@ -2,6 +2,7 @@ const fs = require('fs-extra'); const { transform } = require('@babel/core'); const parser = require('@babel/parser'); const traverse = require('@babel/traverse').default; +const generate = require('@babel/generator').default; const t = require('@babel/types'); const { obfuscate: jsObfuscate } = require('javascript-obfuscator'); // const { Buffer } = require('buffer'); @@ -45,102 +46,175 @@ class JsObfuscator { static _analyzeGlobals(js, mapping, filePath) { try { + // 检查 mapping.globals 是否存在且为 Map + if (!mapping.globals || typeof mapping.globals.has !== 'function') { + console.warn('全局变量映射对象无效'); + return; + } + const ast = parser.parse(js, { sourceType: this.isModule ? 'module' : 'script', plugins: [ 'jsx', 'typescript', - this.isModule ? 'importMeta' : null - ].filter(Boolean), - allowUndeclaredExports: true, - // 添加优化选项 - compact: true, // 输出紧凑代码 - minified: true, // 最小化输出 - comments: false // 移除注释 + 'decorators-legacy', + 'classProperties', + 'objectRestSpread', + 'functionBind', + 'exportDefaultFrom', + 'dynamicImport', + 'optionalChaining', + 'nullishCoalescingOperator' + ] }); traverse(ast, { VariableDeclarator(path) { - if (!path.scope.parent) { // 顶级作用域 + if (t.isIdentifier(path.node.id) && path.scope.parent === null) { const name = path.node.id.name; - if (!mapping.globals.has(name)) { - mapping.globals.set(name, RandomUtils.randomIdentifier()); + if (!mapping.globals.has(name) && this._shouldObfuscateGlobal(name)) { + mapping.globals.set(name, this._generateGlobalName()); } } }, FunctionDeclaration(path) { - if (!path.scope.parent) { + if (t.isIdentifier(path.node.id) && path.scope.parent === null) { const name = path.node.id.name; - if (!mapping.globals.has(name)) { - mapping.globals.set(name, RandomUtils.randomIdentifier()); + if (!mapping.globals.has(name) && this._shouldObfuscateGlobal(name)) { + mapping.globals.set(name, this._generateGlobalName()); } } }, ClassDeclaration(path) { - if (!path.scope.parent) { + if (t.isIdentifier(path.node.id) && path.scope.parent === null) { const name = path.node.id.name; - if (!mapping.globals.has(name)) { - mapping.globals.set(name, RandomUtils.randomIdentifier()); + if (!mapping.globals.has(name) && this._shouldObfuscateGlobal(name)) { + mapping.globals.set(name, this._generateGlobalName()); } } }, - TSInterfaceDeclaration(path) { - // 处理 TypeScript 接口声明 - const name = path.node.id.name; - if (!mapping.globals.has(name)) { - mapping.globals.set(name, RandomUtils.randomIdentifier()); + + }); + } catch (error) { + console.warn(`JavaScript 全局分析失败 ${filePath}:`, error.message); + } + } + + static _shouldObfuscateGlobal(name) { + // 保留的全局变量名 + const reserved = new Set([ + 'window', 'document', 'console', 'Array', 'Object', 'String', 'Number', 'Boolean', + 'Date', 'Math', 'JSON', 'Promise', 'setTimeout', 'setInterval', 'clearTimeout', + 'clearInterval', 'require', 'module', 'exports', '__dirname', '__filename', + 'process', 'global', 'Buffer', 'parseInt', 'parseFloat', 'isNaN', 'isFinite', + 'encodeURIComponent', 'decodeURIComponent', 'encodeURI', 'decodeURI' + ]); + return !reserved.has(name) && name.length > 2 && !/^[A-Z_]+$/.test(name); + } + + static _generateGlobalName() { + return RandomUtils.randomIdentifier(); + } + + + + static _applyGlobalMappings(js, mapping) { + try { + // 检查 mapping.globals 是否存在且为 Map + if (!mapping.globals || typeof mapping.globals.has !== 'function') { + console.warn('全局变量映射对象无效'); + return js; + } + + // 如果没有全局变量映射,直接返回 + if (mapping.globals.size === 0) { + return js; + } + + const ast = parser.parse(js, { + sourceType: this.isModule ? 'module' : 'script', + plugins: [ + 'jsx', + 'typescript', + 'decorators-legacy', + 'classProperties', + 'objectRestSpread', + 'functionBind', + 'exportDefaultFrom', + 'dynamicImport', + 'optionalChaining', + 'nullishCoalescingOperator' + ] + }); + + traverse(ast, { + Identifier(path) { + const name = path.node.name; + if (mapping.globals.has(name) && path.isReferencedIdentifier()) { + path.node.name = mapping.globals.get(name); } } }); - } catch (e) { - // 添加更详细的错误信息 - console.error(`Error parsing file: ${filePath}`); - console.error(`Error details: ${e.message}`); - if (e.loc) { - console.error(`At line ${e.loc.line}, column ${e.loc.column}`); - const lines = js.split('\n'); - const errorLine = lines[e.loc.line - 1]; - console.error(`Source snippet: ${errorLine}`); - } - throw e; + + const { code } = generate(ast, { + compact: false, + comments: false, + retainLines: false + }); + + return code; + } catch (error) { + console.warn('全局变量映射应用失败:', error.message); + return js; } } - // 检测是否为 ES 模块 - static _checkIsModule(js, filePath) { - // 根据文件扩展名判断 - if (filePath) { - const ext = filePath.split('.').pop().toLowerCase(); - if (['mjs', 'esm', 'es6'].includes(ext)) return true; + static _advancedObfuscate(js) { + try { + const { obfuscationOptions } = require('../utils/const'); + const obfuscationResult = jsObfuscate(js, obfuscationOptions); + return obfuscationResult.getObfuscatedCode(); + } catch (error) { + console.warn('高级混淆失败:', error.message); + return js; } - - // 根据内容判断 - return true || /(^|\n)\s*(import|export)\s+/.test(js); } - static isESModuleWithBabel(code, filename) { + static isESModuleWithBabel(js, filePath) { try { - const ast = parser.parse(code, { - sourceType: 'unambiguous', // 让 Babel 自动检测 + const ast = parser.parse(js, { + sourceType: 'unambiguous', plugins: [ 'jsx', - 'typescript' - ], - allowImportExportEverywhere: true, - errorRecovery: true + 'typescript', + 'decorators-legacy', + 'classProperties', + 'objectRestSpread', + 'functionBind', + 'exportDefaultFrom', + 'dynamicImport', + 'optionalChaining', + 'nullishCoalescingOperator' + ] }); - // 检测是否有 import/export 节点 - let hasESMSyntax = false; + let isModule = false; + traverse(ast, { - ImportDeclaration() { hasESMSyntax = true; }, - ExportDeclaration() { hasESMSyntax = true; }, - Import() { hasESMSyntax = true; } + ImportDeclaration() { + isModule = true; + }, + ExportDefaultDeclaration() { + isModule = true; + }, + ExportNamedDeclaration() { + isModule = true; + } }); - return hasESMSyntax; - } catch (e) { - console.error(`解析错误 ${filename}:`, e.message); + return isModule; + } catch (error) { + console.warn(`模块类型检测失败 ${filePath}:`, error.message); return false; } } @@ -159,109 +233,16 @@ class JsObfuscator { // } // } - // 应用全局变量映射 - static _applyGlobalMappings(js, mapping) { - const { code } = transform(js, { - plugins: [this._globalMappingPlugin(mapping)], - configFile: false, - sourceType: this.isModule ? 'module' : 'script', - // 添加优化选项 - compact: true, // 输出紧凑代码 - minified: true, // 最小化输出 - comments: false // 移除注释 - }); - return code; - } - - static _globalMappingPlugin(mapping) { - return { - visitor: { - Identifier(path) { - if (mapping.globals.has(path.node.name)) { - path.node.name = mapping.globals.get(path.node.name); - } - } - } - }; - } - - // 使用 javascript-obfuscator 进行高级混淆 - static _advancedObfuscate(js) { - try { - const isSmallFile = js.length < 500 * 1024; - // 增强混淆配置 - const obfuscationOptions = { - // 基础配置 - compact: true, // true 压缩输出代码(删除换行和缩进) - disableConsoleOutput: false, // true 禁用所有 console 调用 - // log: false, // false 在控制台显示混淆过程日志 调试时开启 - numbersToExpressions: false, // false 将数字转换为表达式 增加混淆度但影响可读性 建议不开启 - // optionsPreset: 'high-obfuscation', // 'default' 预设配置方案 可选值: 'default' 'low-obfuscation', 'medium-obfuscation', 'high-obfuscation' - - // 标识符混淆配置 - identifierNamesGenerator: 'hexadecimal', // hexadecimal 标识符生成策略 可选值: 'dictionary', 'hexadecimal', 'mangled', 'mangled-shuffled' ✅ 推荐: 'mangled'(短变量名)或 'hexadecimal'(高强度混淆) - // identifiersDictionary: [], // 自定义标识符字典 (当使用 dictionary 模式时)示例: ["a", "b", "c"] - identifiersPrefix: 'obf_', // '' 为所有标识符添加前缀 - renameGlobals: false, // false 是否混淆全局变量和函数名 警告:可能导致外部依赖失效 - reservedNames: ["defaultBuiltinList",], // [] 保留的标识符列表(不会被混淆)关键:用于保护公共API 📝 示例: ['init', 'publicApi'] defaultBuiltinList: 直接保留全局变量 - reservedStrings: ["^on[A-Z].*", "Config$"], // [] 使用正则保留匹配的标识符 示例: ['^on.*'] 保留所有 "on" 开头的函数 - transformObjectKeys: false, // false 混淆对象键名 注意:可能影响性能 - - // 控制流混淆配置 - controlFlowFlattening: isSmallFile, // false 启用控制流平坦化 高强度混淆:打乱代码执行顺序 仅对小文件启用控制流平坦化 - controlFlowFlatteningThreshold: 0.75, // 0.75 控制流平坦化应用比例 (0-1) 推荐值: 0.75(平衡安全与性能) - deadCodeInjection: isSmallFile, // true 注入无用代码 警告:显著增加代码体积(约30%) 仅对小文件启用死代码注入 - deadCodeInjectionThreshold: 0.4, // 0.4 无用代码注入比例 (0-1) 建议值: 0.3-0.5 - - // 字符串处理配置 - stringArray: true, // true 启用字符串数组混淆 ✅ 核心功能:集中存储并加密所有字符串 - stringArrayEncoding: ['base64'], // false 字符串编码方式 可选值: 'none', 'base64', 'rc4' 🔒 推荐: ['base64'] 或 ['rc4'](更高安全) - // stringArrayIndexesType: ['hexadecimal-number'], // ['hexadecimal-number'] 字符串数组索引类型 可选值: 'hexadecimal-number', 'hexadecimal-numeric-string' - stringArrayIndexShift: true, // false 对字符串数组索引进行位移 🔐 增强保护:防止直接访问 - stringArrayRotate: true, // true 随机旋转字符串数组 ✅ 推荐开启 - stringArrayShuffle: true, // true 随机打乱字符串数组 ✅ 推荐开启 - // stringArrayWrappersCount: 5, // 1 字符串访问包装器数量 📈 增加复杂度:值越高混淆越强 - // stringArrayWrappersChainedCalls: true, // true 链式调用包装器 🔗 增强混淆效果 - stringArrayWrappersParametersMaxCount: 2, // 1 包装器参数最大数量 🔧 调整:值越高混淆度越强 - stringArrayWrappersType: 'function',// variable 包装器类型 可选值: 'variable', 'function' - stringArrayThreshold: isSmallFile ? 0.75 : 0.5, // 0.8 启用字符串数组的阈值 (0-1) 🔧 调整:值越高处理的字符串越多 对大文件使用更低阈值 - - // 调试保护配置 - debugProtection: false, // false 启用调试保护 ⚠️ 警告:可能导致浏览器卡死(生产环境慎用) - debugProtectionInterval: 0, // 0 调试保护检查间隔(毫秒)⏱️ 值越高性能影响越小 40000 - domainLock: [], // [] 域名锁定列表(防止代码在非指定域名运行) 🔒 安全增强:防止代码被盗用 📝 示例: ['example.com', 'subdomain.example.com'] - // domainLockRedirectUrl: // about:blank 域名不匹配时重定向URL - forceTransformStrings: [], // [] 强制转换特定字符串 📝 示例: ['password', 'token'] - selfDefending: true, // false 启用自防御(防止代码格式化) ✅ 推荐开启 - - // 转换与注入配置 - simplify: true, // true 简化代码结构 ⚖️ 平衡:开启可减小体积但降低混淆度 - splitStrings: true, // false 分割长字符串 📝 示例: 'hello' → 'hel' + 'lo' - splitStringsChunkLength: 10, // 10 字符串分割块长度 🔧 配合 splitStrings 使用 - unicodeEscapeSequence: false, // false 使用Unicode转义序列 🔡 增强混淆但增加体积 - - // 排除与保留配置 - exclude: [ - "**/node_modules/**", - "**/vendor/**", - "**/*.min.js", - "**/chunk-vendors*.js" - ], // [] 排除的文件/目录 🌟 关键:用于保护第三方库 📝 示例: ['**/vendor/**', '**/*.min.js'] - // ignoreImports: false, // false 忽略导入的模块(不混淆导入的代码) 推荐开启:防止破坏模块系统 - // reservedQuotedPropertyNames: [], // [] 保留的引号属性名(不会被混淆) 📝 示例: 示例: ['$super', 'protectedProperty'] - // sourceMap: false, // false 生成Source Map ⚠️ 安全警告:生产环境应关闭 - // sourceMapMode: 'separate', // separate Source Map生成模式 可选值: 'inline', 'separate' - - // 性能与优化配置 - // target: "browser", // browser 目标环境 可选值: 'browser', 'browser-no-eval', 'node' ✅ 根据运行环境选择 - // seed: 0 // 0 随机种子(用于生成随机标识符) 🔧 调整:可设置为固定值以复现混淆结果 - }; - const result = jsObfuscate(js, obfuscationOptions); - return result.getObfuscatedCode(); - } catch (e) { - console.error('Advanced obfuscation error:', e); - return js; + // 检测是否为 ES 模块 + static _checkIsModule(js, filePath) { + // 根据文件扩展名判断 + if (filePath) { + const ext = filePath.split('.').pop().toLowerCase(); + if (['mjs', 'esm', 'es6'].includes(ext)) return true; } + + // 根据内容判断 + return true || /(^|\n)\s*(import|export)\s+/.test(js); } } diff --git a/lib/core/keyword-obfuscator.js b/lib/core/keyword-obfuscator.js new file mode 100644 index 0000000..4989659 --- /dev/null +++ b/lib/core/keyword-obfuscator.js @@ -0,0 +1,301 @@ +const fs = require('fs-extra'); +const path = require('path'); +const RandomUtils = require('../utils/random-utils'); + +class KeywordObfuscator { + constructor() { + this.keywords = []; + this.keywordsLoaded = false; + this.debug = false; // 调试模式 + } + + // 加载关键词列表 + async loadKeywords() { + if (this.keywordsLoaded) { + return; + } + + try { + const keywordFilePath = path.join(__dirname, '../../key.txt'); + if (await fs.pathExists(keywordFilePath)) { + const content = await fs.readFile(keywordFilePath, 'utf8'); + this.keywords = content.split('\n') + .map(line => line.trim()) + .filter(line => line.length > 0); + this.keywordsLoaded = true; + console.log(`📝 加载了 ${this.keywords.length} 个关键词`); + } + } catch (error) { + console.warn('⚠️ 关键词文件加载失败:', error.message); + this.keywordsLoaded = true; // 防止重复尝试 + } + } + + // 混淆HTML内容中的关键词 + obfuscateKeywords(htmlContent) { + if (this.keywords.length === 0) { + return htmlContent; + } + + let result = htmlContent; + let obfuscatedCount = 0; + + // 按长度降序排序,优先处理长关键词避免子串问题 + const sortedKeywords = [...this.keywords].sort((a, b) => b.length - a.length); + + // 记录已处理的位置,避免重复处理 + const processedRanges = []; + + for (const keyword of sortedKeywords) { + // 处理所有关键词,不跳过短关键词 + if (keyword.length === 0) continue; // 只跳过空字符串 + + // 使用全局匹配查找所有位置 + const regex = new RegExp(this.escapeRegExp(keyword), 'gi'); + let match; + const matches = []; + + // 收集所有匹配 + while ((match = regex.exec(result)) !== null) { + matches.push({ + match: match[0], + offset: match.index, + length: match[0].length + }); + + // 防止无限循环 + if (regex.lastIndex === match.index) { + regex.lastIndex++; + } + } + + // 从后往前处理(避免索引变化) + for (let i = matches.length - 1; i >= 0; i--) { + const matchInfo = matches[i]; + const { match: matchText, offset, length } = matchInfo; + + // 检查是否与已处理的范围重叠 + const overlaps = processedRanges.some(range => + (offset >= range.start && offset < range.end) || + (offset + length > range.start && offset + length <= range.end) || + (offset < range.start && offset + length > range.end) + ); + + if (overlaps) { + continue; // 跳过重叠的匹配 + } + + // 检查匹配位置是否在HTML标签内 + if (this.isInsideHtmlTag(result, offset, length)) { + continue; // 在标签内,不进行混淆 + } + + // 进行混淆 + const obfuscatedText = this.obfuscateKeyword(matchText); + const beforeChange = result; + result = result.slice(0, offset) + obfuscatedText + result.slice(offset + length); + + // 调试信息 + if (this.debug) { + console.log(` 混淆关键词: "${matchText}" → "${obfuscatedText}" (位置: ${offset})`); + console.log(` 变化前: "${beforeChange}"`); + console.log(` 变化后: "${result}"`); + } + + // 记录已处理的范围 + processedRanges.push({ + start: offset, + end: offset + obfuscatedText.length + }); + + obfuscatedCount++; + } + } + + if (obfuscatedCount > 0) { + console.log(`🔤 混淆了 ${obfuscatedCount} 个关键词`); + } + + return result; + } + + // 检查位置是否在HTML标签内 + isInsideHtmlTag(content, offset, length) { + // 向前查找最近的 < 和 > + let openTag = content.lastIndexOf('<', offset); + let closeTag = content.lastIndexOf('>', offset); + + // 如果在标签内(最近的<在最近的>之后) + if (openTag > closeTag && openTag !== -1) { + // 继续查找标签结束 + let tagEnd = content.indexOf('>', offset + length); + if (tagEnd !== -1) { + // 进一步检查是否在标签属性中 + const tagContent = content.substring(openTag, tagEnd + 1); + + // 检查是否在引号内的属性值中 + const beforeMatch = content.substring(openTag, offset); + const quotesBefore = (beforeMatch.match(/"/g) || []).length; + const singleQuotesBefore = (beforeMatch.match(/'/g) || []).length; + + // 如果引号数量是奇数,说明在属性值内 + if (quotesBefore % 2 === 1 || singleQuotesBefore % 2 === 1) { + return true; + } + + // 检查是否在脚本或样式标签内 + const scriptMatch = /<(script|style)[^>]*>/i.exec(tagContent); + if (scriptMatch) { + return false; // 脚本和样式标签内的内容不算标签内 + } + + return true; // 在其他标签内 + } + } + + return false; + } + + // 对单个关键词进行混淆 + obfuscateKeyword(keyword) { + const method = RandomUtils.randomObfuscationMethod(); + + switch (method) { + case 'span': + return this.obfuscateWithSpan(keyword); + case 'invisible': + return this.obfuscateWithInvisibleChars(keyword); + case 'mixed': + return this.obfuscateWithMixed(keyword); + default: + return this.obfuscateWithSpan(keyword); + } + } + + // 使用span标签混淆 + obfuscateWithSpan(keyword) { + const chars = [...keyword]; // 支持多字节字符 + const spanCount = RandomUtils.randomInt(1, Math.max(1, chars.length)); + let result = ''; + let hasSpan = false; // 确保至少有一个span + + for (let i = 0; i < chars.length; i++) { + const char = chars[i]; + + // 随机决定是否用span包装,或者确保至少有一个span + const shouldWrap = (i < spanCount && RandomUtils.randomBool(0.7)) || + (!hasSpan && i === chars.length - 1); + + if (shouldWrap) { + const attrs = RandomUtils.randomBool(0.6) ? ` ${RandomUtils.randomAttribute()}` : ''; + result += `${char}`; + hasSpan = true; + } else { + result += char; + } + } + + return result; + } + + // 使用不可见字符混淆 + obfuscateWithInvisibleChars(keyword) { + const chars = [...keyword]; + if (chars.length <= 1) { + // 对于单字符,直接添加不可见字符 + return chars[0] + RandomUtils.randomInvisibleChar(); + } + + const insertCount = RandomUtils.randomInt(1, Math.max(1, chars.length - 1)); + let result = ''; + let hasInvisible = false; // 确保至少有一个不可见字符 + + for (let i = 0; i < chars.length; i++) { + result += chars[i]; + + // 随机插入不可见字符(不在最后一个字符后) + const shouldInsert = (i < chars.length - 1 && i < insertCount && RandomUtils.randomBool(0.5)) || + (!hasInvisible && i === chars.length - 2); // 倒数第二个字符确保插入 + + if (i < chars.length - 1 && shouldInsert) { + result += RandomUtils.randomInvisibleChar(); + hasInvisible = true; + } + } + + return result; + } + + // 混合模式:span + 不可见字符 + obfuscateWithMixed(keyword) { + const chars = [...keyword]; + const spanCount = RandomUtils.randomInt(1, Math.max(1, Math.ceil(chars.length / 2))); + const invisibleCount = RandomUtils.randomInt(1, Math.max(1, Math.ceil(chars.length / 3))); + let result = ''; + let hasSpan = false; + let hasInvisible = false; + + for (let i = 0; i < chars.length; i++) { + const char = chars[i]; + + // 随机决定是否用span包装,确保至少有一个span + const shouldSpan = (i < spanCount && RandomUtils.randomBool(0.4)) || + (!hasSpan && i === chars.length - 1); + + if (shouldSpan) { + const attrs = RandomUtils.randomBool(0.5) ? ` ${RandomUtils.randomAttribute()}` : ''; + result += `${char}`; + hasSpan = true; + } else { + result += char; + } + + // 随机插入不可见字符,确保至少有一个不可见字符 + const shouldInsert = (i < chars.length - 1 && i < invisibleCount && RandomUtils.randomBool(0.3)) || + (!hasInvisible && i === chars.length - 2 && chars.length > 1); + + if (i < chars.length - 1 && shouldInsert) { + result += RandomUtils.randomInvisibleChar(); + hasInvisible = true; + } + } + + // 如果两种方式都没有应用,强制应用一种 + if (!hasSpan && !hasInvisible && chars.length > 0) { + if (RandomUtils.randomBool()) { + // 应用span到第一个字符 + const firstChar = chars[0]; + const attrs = RandomUtils.randomBool(0.5) ? ` ${RandomUtils.randomAttribute()}` : ''; + result = `${firstChar}` + result.slice(1); + } else { + // 插入不可见字符 + const pos = RandomUtils.randomInt(0, Math.max(0, chars.length - 1)); + result = result.slice(0, pos) + RandomUtils.randomInvisibleChar() + result.slice(pos); + } + } + + return result; + } + + // 特殊处理:为整个关键词添加干扰元素 + addNoiseElements(keyword) { + const noiseElements = [ + ``, + `${RandomUtils.randomIdentifier()}`, + `${RandomUtils.randomIdentifier()}`, + ``, + ]; + + const noise = noiseElements[Math.floor(Math.random() * noiseElements.length)]; + const position = RandomUtils.randomInt(0, keyword.length); + + return keyword.slice(0, position) + noise + keyword.slice(position); + } + + // 转义正则表达式特殊字符 + escapeRegExp(string) { + return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); + } +} + +module.exports = KeywordObfuscator; \ No newline at end of file diff --git a/lib/obfuscation-engine.js b/lib/obfuscation-engine.js index 37748d7..306e018 100644 --- a/lib/obfuscation-engine.js +++ b/lib/obfuscation-engine.js @@ -4,20 +4,31 @@ const HtmlObfuscator = require('./core/html-obfuscator'); const CssObfuscator = require('./core/css-obfuscator'); const JsObfuscator = require('./core/js-obfuscator'); const TsObfuscator = require('./core/ts-obfuscator'); // 添加 TypeScript 混淆器 +const FileStructureObfuscator = require('./core/file-structure-obfuscator'); // 添加文件结构混淆器 const BackupManager = require('./utils/backup-manager'); +const MappingManager = require('./utils/mapping-manager'); // 添加映射管理器 +const RandomUtils = require('./utils/random-utils'); // 添加随机工具 const { walkDir } = require('./utils/file-utils'); const { MAX_SAFE_STRING_LENGTH, WARNING_SIZE } = require('./utils/const'); class ObfuscationEngine { constructor(targetDir) { this.targetDir = targetDir; + this.mappingManager = new MappingManager(); // 使用新的映射管理器 + this.fileStructureObfuscator = new FileStructureObfuscator(this.mappingManager); // 初始化文件结构混淆器 + + // 生成随机混淆标记,确保同一次运行的一致性 + this.htmlMarker = RandomUtils.randomHtmlComment(); + this.codeMarker = RandomUtils.randomCodeComment(); + + // 为了向后兼容,保留原有的 mapping 对象结构 this.mapping = { - globals: new Map(), // 存储全局变量映射 - // classes: new Map(), // 存储类名映射 - // ids: new Map(), // 存储 ID 映射 - // classSelectors: new Map(), // 存储带点号的选择器映射 - // idSelectors: new Map(), // 存储带井号的选择器映射 - // complexSelectors: new Map() // 复合选择器映射 + globals: this.mappingManager.mappings.globals, + // classes: this.mappingManager.mappings.classes, // 保持原有的注释状态 + // ids: this.mappingManager.mappings.ids, // 保持原有的注释状态 + // classSelectors: new Map(), + // idSelectors: new Map(), + // complexSelectors: new Map() }; } @@ -27,47 +38,59 @@ class ObfuscationEngine { const { isFirstRun } = await backupManager.prepare(); this.workDir = backupManager.workDir; // 获取新的工作目录路径 - // try { - - // 1. 收集全局映射关系 - await this.collectMappings(); - - // 2. 执行混淆 - await this.processFiles(); - - // 3. 应用结果 - await backupManager.applyResults(); - // } catch (error) { - // // console.error('❌Error 处理失败:', error.message); - // // 清理工作目录 - // await fs.remove(this.workDir); - // } + try { + // 1. 静态资源随机化处理 + console.log('🔄 开始静态资源随机化处理...'); + await this.fileStructureObfuscator.process(this.workDir); + + // 2. 收集全局映射关系 + await this.collectMappings(); + + // 3. 执行混淆 + await this.processFiles(); + + // 4. 应用结果 + await backupManager.applyResults(); + + // 5. 保存映射关系到文件(可选,用于调试) + const mappingFilePath = path.join(path.dirname(this.targetDir), 'obfuscation-mapping.json'); + await this.mappingManager.saveToFile(mappingFilePath); + + // 6. 输出统计信息 + const stats = this.mappingManager.getStats(); + console.log('📊 混淆统计信息:', stats); + + } catch (error) { + console.error('❌Error 处理失败:', error.message); + // 清理工作目录 + await fs.remove(this.workDir); + throw error; + } - console.log(`Obfuscation complete! ${isFirstRun ? 'Initial' : 'Subsequent'} run`); + console.log(`🎉 Obfuscation complete! ${isFirstRun ? 'Initial' : 'Subsequent'} run`); } async collectMappings() { + console.log('🔍 开始收集全局映射关系...'); + // 扫描所有文件建立映射关系 const files = await walkDir(this.workDir); for (const file of files) { const ext = path.extname(file); - // if (ext === '.html') { - // await HtmlObfuscator.collectMappings(file, this.mapping); - // } else if (ext === '.css') { - // await CssObfuscator.collectMappings(file, this.mapping); - // } else if (ext === '.js') { - // await JsObfuscator.collectMappings(file, this.mapping); - // } + // 保持原有逻辑:只对 JS 和 TS 文件收集全局变量映射 if (['.js', '.ts', '.tsx'].includes(ext)) { - // 对于 JS 和 TS 文件都收集全局映射 await JsObfuscator.collectMappings(file, this.mapping); } } + + console.log('✅ 全局映射关系收集完成'); } async processFiles() { + console.log('🚀 开始处理文件混淆...'); + const files = await walkDir(this.workDir); for (const file of files) { @@ -85,14 +108,15 @@ class ObfuscationEngine { let content = await fs.readFile(file, 'utf8'); if (this.isAlreadyObfuscated(content)) { - console.log(`Skipping already obfuscated: ${file}`); + console.log(`⏭️ Skipping already obfuscated: ${file}`); continue; } + try { if (ext === '.html') { content = await HtmlObfuscator.obfuscate(content, this.mapping); - // 添加混淆标记 - content = `\n${content}`; + // 添加随机混淆标记 + content = `${this.htmlMarker}\n${content}`; } else { if (ext === '.css') { content = await CssObfuscator.obfuscate(content, this.mapping); @@ -101,21 +125,32 @@ class ObfuscationEngine { } else if (ext === '.ts' || ext === '.tsx') { content = await TsObfuscator.obfuscate(content, this.mapping, file); } - // 添加混淆标记 - content = `/* OBFUSCATED ${Date.now()} */\n${content}`; + // 添加随机混淆标记 + content = `${this.codeMarker}\n${content}`; } } catch (e) { console.error(`❌Error processing ${file}:`, e.message); + continue; } await fs.writeFile(file, content); + console.log(`✅ 处理完成: ${path.relative(this.workDir, file)}`); } + + console.log('🎯 所有文件混淆处理完成'); } isAlreadyObfuscated(content) { - return content.includes('/* OBFUSCATED') || - content.includes('// OBFUSCATED') || - content.includes('/, // HTML 随机标记 + /\/\*\s*OBFUSCATED/, // 旧的固定标记(向后兼容) + /`; + } + + // 生成随机的CSS/JS注释标记 + static randomCodeComment() { + const marker = this.randomObfuscationMarker(); + return `/* ${marker} */`; + } + + // 生成随机CSS类名 + static randomClassName() { + const prefixes = ['fx', 'ui', 'app', 'css', 'cls', 'key', 'txt', 'data', 'elem', 'item']; + const prefix = prefixes[Math.floor(Math.random() * prefixes.length)]; + const suffix = this.randomIdentifier(); + return `${prefix}-${suffix}`; + } + + // 生成随机HTML属性 + static randomAttribute() { + const attrs = [ + 'data-key', + 'data-id', + 'data-value', + 'data-item', + 'data-elem', + 'class', + 'id', + 'style' + ]; + + const attr = attrs[Math.floor(Math.random() * attrs.length)]; + const value = this.randomIdentifier(); + + if (attr === 'style') { + const styles = [ + 'display:inline', + 'visibility:hidden;position:absolute', + 'font-size:0', + 'line-height:0', + 'opacity:0.01' + ]; + return `${attr}="${styles[Math.floor(Math.random() * styles.length)]}"`; + } + + return `${attr}="${value}"`; + } + + // 生成不可见字符 + static randomInvisibleChar() { + const invisibleChars = [ + '', // 零宽空格 + '', // 零宽非连字符 + '', // 零宽连字符 + '', // 单词连接符 + '', // 零宽不间断空格 + ' ', // 非间断空格(有时不可见) + ]; + + return invisibleChars[Math.floor(Math.random() * invisibleChars.length)]; + } + + // 随机选择混淆方式 + static randomObfuscationMethod() { + const methods = ['span', 'invisible', 'mixed']; + return methods[Math.floor(Math.random() * methods.length)]; + } } module.exports = RandomUtils; \ No newline at end of file diff --git a/obfuscation-mapping.json b/obfuscation-mapping.json new file mode 100644 index 0000000..71b2004 --- /dev/null +++ b/obfuscation-mapping.json @@ -0,0 +1,9 @@ +{ + "globals": {}, + "files": { + "key.txt": "util_75772b/key.txt" + }, + "directories": {}, + "ids": {}, + "classes": {} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index ff62f37..fc135e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,600 +5,750 @@ "packages": { "": { "dependencies": { + "@babel/core": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/plugin-transform-typescript": "^7.28.0", + "@babel/preset-typescript": "^7.27.1", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "buffer": "^6.0.3", + "cheerio": "^1.1.0", + "crypto": "^1.0.1", "css": "^3.0.0", + "cssnano": "^7.0.7", + "fs-extra": "^11.3.0", "javascript-obfuscator": "^4.1.1", - "node-html-parser": "^7.0.1" + "jsdom": "^26.1.0", + "node-html-parser": "^7.0.1", + "postcss": "^8.5.6", + "postcss-value-parser": "^4.2.0", + "shuffle-array": "^1.0.1" } }, - "node_modules/@javascript-obfuscator/escodegen": { + "node_modules/@ampproject/remapping": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", - "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "license": "Apache-2.0", "dependencies": { - "@javascript-obfuscator/estraverse": "^5.3.0", - "esprima": "^4.0.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { - "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" + "node": ">=6.0.0" } }, - "node_modules/@javascript-obfuscator/estraverse": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", - "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" + "node_modules/@asamuzakjp/css-color": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", + "integrity": "sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==", + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^2.1.3", + "@csstools/css-color-parser": "^3.0.9", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "lru-cache": "^10.4.3" } }, - "node_modules/@types/minimatch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", - "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", - "license": "MIT" - }, - "node_modules/@types/validator": { - "version": "13.15.2", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz", - "integrity": "sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==", - "license": "MIT" + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "license": "ISC" }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "license": "MIT", - "bin": { - "acorn": "bin/acorn" + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { - "node": ">=0.4.0" + "node": ">=6.9.0" } }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/compat-data": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.28.0.tgz", + "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.28.0.tgz", + "integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.27.3", + "@babel/helpers": "^7.27.6", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/babel" } }, - "node_modules/array-differ": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", - "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "node_modules/@babel/generator": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz", + "integrity": "sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A==", "license": "MIT", "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.27.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "license": "(MIT OR Apache-2.0)", - "bin": { - "atob": "bin/atob.js" - }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", "engines": { - "node": ">= 4.5.0" + "node": ">=6.9.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz", + "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==", "license": "MIT", "dependencies": { - "possible-typed-array-names": "^1.0.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", + "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.3" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" + "@babel/types": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" } }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" }, "engines": { - "node": ">= 0.4" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "@babel/core": "^7.0.0" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/chance": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.9.tgz", - "integrity": "sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==", - "license": "MIT" + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "license": "MIT", "engines": { - "node": ">=10" + "node": ">=6.9.0" } }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "license": "BSD-3-Clause", + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "license": "MIT", "engines": { - "node": "*" + "node": ">=6.9.0" } }, - "node_modules/class-validator": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", - "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "node_modules/@babel/helpers": { + "version": "7.27.6", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.27.6.tgz", + "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", "license": "MIT", "dependencies": { - "@types/validator": "^13.11.8", - "libphonenumber-js": "^1.10.53", - "validator": "^13.9.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.27.6" + }, + "engines": { + "node": ">=6.9.0" } }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", "license": "MIT", "dependencies": { - "color-name": "~1.1.4" + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=7.0.0" + "node": ">=6.0.0" } }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": ">=14" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "license": "BSD-3-Clause", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, "engines": { - "node": "*" + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/css": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", - "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz", + "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==", "license": "MIT", "dependencies": { - "inherits": "^2.0.4", - "source-map": "^0.6.1", - "source-map-resolve": "^0.6.0" + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/css-select": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", - "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", - "license": "BSD-2-Clause", + "node_modules/@babel/preset-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz", + "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.27.1" }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", "engines": { - "node": ">= 6" + "node": ">=6.9.0" }, - "funding": { - "url": "https://github.com/sponsors/fb55" + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, "engines": { - "node": ">=0.10" + "node": ">=6.9.0" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "license": "MIT" - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "node_modules/@babel/traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "node_modules/@babel/types": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.0.tgz", + "integrity": "sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==", "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">=6.9.0" } }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "node_modules/@csstools/color-helpers": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", + "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@csstools/css-calc/-/css-calc-2.1.4.tgz", + "integrity": "sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "node_modules/@csstools/css-color-parser": { + "version": "3.0.10", + "resolved": "https://registry.npmmirror.com/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", + "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", "funding": [ { "type": "github", - "url": "https://github.com/sponsors/fb55" + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" } ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "domelementtype": "^2.3.0" + "@csstools/color-helpers": "^5.0.2", + "@csstools/css-calc": "^2.1.4" }, "engines": { - "node": ">= 4" + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/domutils": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", - "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" } }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=18" } }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "node_modules/@javascript-obfuscator/escodegen": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/escodegen/-/escodegen-2.3.0.tgz", + "integrity": "sha512-QVXwMIKqYMl3KwtTirYIA6gOCiJ0ZDtptXqAv/8KWLG9uQU2fZqTVy7a/A5RvcoZhbDoFfveTxuGxJ5ibzQtkw==", "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/estraverse": "^5.3.0", + "esprima": "^4.0.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, "engines": { - "node": ">=0.12" + "node": ">=6.0" }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "optionalDependencies": { + "source-map": "~0.6.1" } }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", + "node_modules/@javascript-obfuscator/estraverse": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@javascript-obfuscator/estraverse/-/estraverse-5.4.0.tgz", + "integrity": "sha512-CZFX7UZVN9VopGbjTx4UXaXsi9ewoM1buL0kY7j1ftYdSs7p2spv9opxFjHlQ/QGTgh4UqufYqJJ0WKLml7b6w==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" + "node": ">=4.0" } }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.12", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", "license": "MIT", - "engines": { - "node": ">= 0.4" + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, "engines": { - "node": ">= 0.4" + "node": ">=6.0.0" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "license": "MIT" }, - "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "license": "BSD-2-Clause", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.29", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "license": "Apache-2.0", + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "license": "ISC", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=10.13.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "license": "BSD-2-Clause", + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "license": "MIT" + }, + "node_modules/@types/validator": { + "version": "13.15.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.15.2.tgz", + "integrity": "sha512-y7pa/oEJJ4iGYBxOpfAKn5b9+xuihvzDVnC/OSvlVnGxVg0pOqmjiMafiJ1KVNQEaPZf9HsEp5icEwGg8uIe5Q==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "license": "MIT", "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "acorn": "bin/acorn" }, "engines": { - "node": ">=4" + "node": ">=0.4.0" } }, - "node_modules/esrecurse": { + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-styles": { "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", "dependencies": { - "estraverse": "^5.2.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", + "node_modules/array-differ": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz", + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==", + "license": "MIT", "engines": { - "node": ">=4.0" + "node": ">=8" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "license": "BSD-2-Clause", + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" + "node_modules/arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", + "license": "MIT", + "engines": { + "node": ">=8" + } }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "license": "MIT" + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "license": "MIT", + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "license": "MIT", "dependencies": { - "is-callable": "^1.2.7" + "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -607,464 +757,2126 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/function-bind": { + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.25.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "license": "MIT" + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001726", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz", + "integrity": "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chance": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/chance/-/chance-1.1.9.tgz", + "integrity": "sha512-TfxnA/DcZXRTA4OekA2zL9GH8qscbbl6X0ZqU4tXhGveVY/mXWvEQLt5GwZcYXTEyEFflVtj+pG8nc8EwSm1RQ==", + "license": "MIT" + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/cheerio/-/cheerio-1.1.0.tgz", + "integrity": "sha512-+0hMx9eYhJvWbgpKV9hN7jg0JcwydpopZE4hgi+KvQtByZXPp04NiCWU0LzcAbP63abZckIHkTQaXVF52mX3xQ==", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.2", + "encoding-sniffer": "^0.2.0", + "htmlparser2": "^10.0.0", + "parse5": "^7.3.0", + "parse5-htmlparser2-tree-adapter": "^7.1.0", + "parse5-parser-stream": "^7.1.2", + "undici": "^7.10.0", + "whatwg-mimetype": "^4.0.0" + }, + "engines": { + "node": ">=18.17" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cheerio-select/-/cheerio-select-2.1.0.tgz", + "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/class-validator": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", + "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", + "license": "MIT", + "dependencies": { + "@types/validator": "^13.11.8", + "libphonenumber-js": "^1.10.53", + "validator": "^13.9.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmmirror.com/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", + "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/crypto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/crypto/-/crypto-1.0.1.tgz", + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig==", + "deprecated": "This package is no longer supported. It's now a built-in Node module. If you've depended on crypto, you should switch to the one that's built-in.", + "license": "ISC" + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "7.0.7", + "resolved": "https://registry.npmmirror.com/cssnano/-/cssnano-7.0.7.tgz", + "integrity": "sha512-evKu7yiDIF7oS+EIpwFlMF730ijRyLFaM2o5cTxRGJR9OKHKkc+qP443ZEVR9kZG0syaAJJCPJyfv5pbrxlSng==", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^7.0.7", + "lilconfig": "^3.1.3" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-preset-default": { + "version": "7.0.7", + "resolved": "https://registry.npmmirror.com/cssnano-preset-default/-/cssnano-preset-default-7.0.7.tgz", + "integrity": "sha512-jW6CG/7PNB6MufOrlovs1TvBTEVmhY45yz+bd0h6nw3h6d+1e+/TX+0fflZ+LzvZombbT5f+KC063w9VoHeHow==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^5.0.1", + "postcss-calc": "^10.1.1", + "postcss-colormin": "^7.0.3", + "postcss-convert-values": "^7.0.5", + "postcss-discard-comments": "^7.0.4", + "postcss-discard-duplicates": "^7.0.2", + "postcss-discard-empty": "^7.0.1", + "postcss-discard-overridden": "^7.0.1", + "postcss-merge-longhand": "^7.0.5", + "postcss-merge-rules": "^7.0.5", + "postcss-minify-font-values": "^7.0.1", + "postcss-minify-gradients": "^7.0.1", + "postcss-minify-params": "^7.0.3", + "postcss-minify-selectors": "^7.0.5", + "postcss-normalize-charset": "^7.0.1", + "postcss-normalize-display-values": "^7.0.1", + "postcss-normalize-positions": "^7.0.1", + "postcss-normalize-repeat-style": "^7.0.1", + "postcss-normalize-string": "^7.0.1", + "postcss-normalize-timing-functions": "^7.0.1", + "postcss-normalize-unicode": "^7.0.3", + "postcss-normalize-url": "^7.0.1", + "postcss-normalize-whitespace": "^7.0.1", + "postcss-ordered-values": "^7.0.2", + "postcss-reduce-initial": "^7.0.3", + "postcss-reduce-transforms": "^7.0.1", + "postcss-svgo": "^7.0.2", + "postcss-unique-selectors": "^7.0.4" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/cssnano-utils": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/cssnano-utils/-/cssnano-utils-5.0.1.tgz", + "integrity": "sha512-ZIP71eQgG9JwjVZsTPSqhc6GHgEr53uJ7tK5///VfyWj6Xp2DBmixWHqJgPno+PqATzn48pL42ww9x5SSGmhZg==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "license": "CC0-1.0" + }, + "node_modules/cssstyle": { + "version": "4.6.0", + "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-4.6.0.tgz", + "integrity": "sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==", + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^3.2.0", + "rrweb-cssom": "^0.8.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/data-urls": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-5.0.0.tgz", + "integrity": "sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==", + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.5.0.tgz", + "integrity": "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==", + "license": "MIT" + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "license": "MIT", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.179", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.179.tgz", + "integrity": "sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==", + "license": "ISC" + }, + "node_modules/encoding-sniffer": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/encoding-sniffer/-/encoding-sniffer-0.2.1.tgz", + "integrity": "sha512-5gvq20T6vfpekVtqrYQsSCFZ1wEg5+wW0/QaZMWkFr6BqD3NfKs0rLCx4rrVlSWJeZb5NBJgVLswK/w2MWU+Gw==", + "license": "MIT", + "dependencies": { + "iconv-lite": "^0.6.3", + "whatwg-encoding": "^3.1.1" + }, + "funding": { + "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "license": "MIT" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz", + "integrity": "sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==", + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^3.1.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/htmlparser2": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-10.0.0.tgz", + "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.2.1", + "entities": "^6.0.0" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/inversify": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", + "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==", + "license": "MIT" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/javascript-obfuscator": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz", + "integrity": "sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==", + "hasInstallScript": true, + "license": "BSD-2-Clause", + "dependencies": { + "@javascript-obfuscator/escodegen": "2.3.0", + "@javascript-obfuscator/estraverse": "5.4.0", + "acorn": "8.8.2", + "assert": "2.0.0", + "chalk": "4.1.2", + "chance": "1.1.9", + "class-validator": "0.14.1", + "commander": "10.0.0", + "eslint-scope": "7.1.1", + "eslint-visitor-keys": "3.3.0", + "fast-deep-equal": "3.1.3", + "inversify": "6.0.1", + "js-string-escape": "1.0.1", + "md5": "2.3.0", + "mkdirp": "2.1.3", + "multimatch": "5.0.0", + "opencollective-postinstall": "2.0.3", + "process": "0.11.10", + "reflect-metadata": "0.1.13", + "source-map-support": "0.5.21", + "string-template": "1.0.0", + "stringz": "2.1.0", + "tslib": "2.5.0" + }, + "bin": { + "javascript-obfuscator": "bin/javascript-obfuscator" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/javascript-obfuscator" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "26.1.0", + "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-26.1.0.tgz", + "integrity": "sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==", + "license": "MIT", + "dependencies": { + "cssstyle": "^4.2.1", + "data-urls": "^5.0.0", + "decimal.js": "^10.5.0", + "html-encoding-sniffer": "^4.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.16", + "parse5": "^7.2.1", + "rrweb-cssom": "^0.8.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^5.1.1", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^3.1.1", + "whatwg-mimetype": "^4.0.0", + "whatwg-url": "^14.1.1", + "ws": "^8.18.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "license": "MIT", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.12.9", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.9.tgz", + "integrity": "sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==", + "license": "MIT" + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "license": "CC0-1.0" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mkdirp": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", + "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/multimatch": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "license": "MIT", + "dependencies": { + "@types/minimatch": "^3.0.3", + "array-differ": "^3.0.0", + "array-union": "^2.1.0", + "arrify": "^2.0.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-html-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.0.1.tgz", + "integrity": "sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==", + "license": "MIT", + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.20.tgz", + "integrity": "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA==", + "license": "MIT" + }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", + "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "license": "MIT", + "bin": { + "opencollective-postinstall": "index.js" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "license": "MIT", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/parse5": { + "version": "7.3.0", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-7.3.0.tgz", + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==", + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "license": "MIT", "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" + "domhandler": "^5.0.3", + "parse5": "^7.0.0" }, - "engines": { - "node": ">= 0.4" + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "node_modules/parse5-parser-stream": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/parse5-parser-stream/-/parse5-parser-stream-7.1.2.tgz", + "integrity": "sha512-JyeQc9iwFLn5TbvvqACIF/VXG6abODeB3Fwmv/TGdLk2LfbWkaySGY72at4+Ty7EkPZj854u4CrICqNk2qIbow==", "license": "MIT", + "dependencies": { + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", "engines": { - "node": ">= 0.4" + "node": ">=0.12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.4" } }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "^10 || ^12 || >=14" } }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "node_modules/postcss-calc": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/postcss-calc/-/postcss-calc-10.1.1.tgz", + "integrity": "sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw==", "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.12 || ^20.9 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.38" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "node_modules/postcss-colormin": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/postcss-colormin/-/postcss-colormin-7.0.3.tgz", + "integrity": "sha512-xZxQcSyIVZbSsl1vjoqZAcMYYdnJsIyG8OvqShuuqf12S88qQboxxEy0ohNCOLwVPXTU+hFHvJPACRL2B5ohTA==", "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "node_modules/postcss-convert-values": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-convert-values/-/postcss-convert-values-7.0.5.tgz", + "integrity": "sha512-0VFhH8nElpIs3uXKnVtotDJJNX0OGYSZmdt4XfSfvOMrFw1jKfpwpZxfC4iN73CTM/MWakDEmsHQXkISYj4BXw==", "license": "MIT", "dependencies": { - "function-bind": "^1.1.2" + "browserslist": "^4.24.5", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "node_modules/postcss-discard-comments": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/postcss-discard-comments/-/postcss-discard-comments-7.0.4.tgz", + "integrity": "sha512-6tCUoql/ipWwKtVP/xYiFf1U9QgJ0PUvxN7pTcsQ8Ns3Fnwq1pU5D5s1MhT/XySeLq6GXNvn37U46Ded0TckWg==", "license": "MIT", - "bin": { - "he": "bin/he" + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/inversify": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-6.0.1.tgz", - "integrity": "sha512-B3ex30927698TJENHR++8FfEaJGqoWOgI6ZY5Ht/nLUsFCwHn6akbwtnUAPCgUepAnTpe2qHxhDNjoKLyz6rgQ==", - "license": "MIT" - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "node_modules/postcss-discard-duplicates": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.2.tgz", + "integrity": "sha512-eTonaQvPZ/3i1ASDHOKkYwAybiM45zFIc7KXils4mQmHLqIswXD9XNOKEVxtTFnsmwYzF66u4LMgSr0abDlh5w==", "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "license": "MIT" + "node_modules/postcss-discard-empty": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-empty/-/postcss-discard-empty-7.0.1.tgz", + "integrity": "sha512-cFrJKZvcg/uxB6Ijr4l6qmn3pXQBna9zyrPC+sK0zjbkDUZew+6xDltSF7OeB7rAtzaaMVYSdbod+sZOCWnMOg==", + "license": "MIT", + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "node_modules/postcss-discard-overridden": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.1.tgz", + "integrity": "sha512-7c3MMjjSZ/qYrx3uc1940GSOzN1Iqjtlqe8uoSg+qdVPYyRb0TILSqqmtlSFuE4mTDECwsm397Ya7iXGzfF7lg==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "node_modules/postcss-merge-longhand": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.5.tgz", + "integrity": "sha512-Kpu5v4Ys6QI59FxmxtNB/iHUVDn9Y9sYw66D6+SZoIk4QTz1prC4aYkhIESu+ieG1iylod1f8MILMs1Em3mmIw==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "postcss-value-parser": "^4.2.0", + "stylehacks": "^7.0.5" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-nan": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", - "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "node_modules/postcss-merge-rules": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-merge-rules/-/postcss-merge-rules-7.0.5.tgz", + "integrity": "sha512-ZonhuSwEaWA3+xYbOdJoEReKIBs5eDiBVLAGpYZpNFPzXZcEE5VKR7/qBEQvTZpiwjqhhqEQ+ax5O3VShBj9Wg==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^5.0.1", + "postcss-selector-parser": "^7.1.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "node_modules/postcss-minify-font-values": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.1.tgz", + "integrity": "sha512-2m1uiuJeTplll+tq4ENOQSzB8LRnSUChBv7oSyFLsJRtUgAAJGP6LLz0/8lkinTgxrmJSPOEhgY1bMXOQ4ZXhQ==", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "node_modules/postcss-minify-gradients": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.1.tgz", + "integrity": "sha512-X9JjaysZJwlqNkJbUDgOclyG3jZEpAMOfof6PUZjPnPrePnPG62pS17CjdM32uT1Uq1jFvNSff9l7kNbmMSL2A==", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "colord": "^2.9.3", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/javascript-obfuscator": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/javascript-obfuscator/-/javascript-obfuscator-4.1.1.tgz", - "integrity": "sha512-gt+KZpIIrrxXHEQGD8xZrL8mTRwRY0U76/xz/YX0gZdPrSqQhT/c7dYLASlLlecT3r+FxE7je/+C0oLnTDCx4A==", - "hasInstallScript": true, - "license": "BSD-2-Clause", + "node_modules/postcss-minify-params": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/postcss-minify-params/-/postcss-minify-params-7.0.3.tgz", + "integrity": "sha512-vUKV2+f5mtjewYieanLX0xemxIp1t0W0H/D11u+kQV/MWdygOO7xPMkbK+r9P6Lhms8MgzKARF/g5OPXhb8tgg==", + "license": "MIT", "dependencies": { - "@javascript-obfuscator/escodegen": "2.3.0", - "@javascript-obfuscator/estraverse": "5.4.0", - "acorn": "8.8.2", - "assert": "2.0.0", - "chalk": "4.1.2", - "chance": "1.1.9", - "class-validator": "0.14.1", - "commander": "10.0.0", - "eslint-scope": "7.1.1", - "eslint-visitor-keys": "3.3.0", - "fast-deep-equal": "3.1.3", - "inversify": "6.0.1", - "js-string-escape": "1.0.1", - "md5": "2.3.0", - "mkdirp": "2.1.3", - "multimatch": "5.0.0", - "opencollective-postinstall": "2.0.3", - "process": "0.11.10", - "reflect-metadata": "0.1.13", - "source-map-support": "0.5.21", - "string-template": "1.0.0", - "stringz": "2.1.0", - "tslib": "2.5.0" + "browserslist": "^4.24.5", + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, - "bin": { - "javascript-obfuscator": "bin/javascript-obfuscator" + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.5.tgz", + "integrity": "sha512-x2/IvofHcdIrAm9Q+p06ZD1h6FPcQ32WtCRVodJLDR+WMn8EVHI1kvLxZuGKz/9EY5nAmI6lIQIrpo4tBy5+ug==", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "postcss-selector-parser": "^7.1.0" }, "engines": { - "node": ">=12.22.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/javascript-obfuscator" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "node_modules/postcss-normalize-charset": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.1.tgz", + "integrity": "sha512-sn413ofhSQHlZFae//m9FTOfkmiZ+YQXsbosqOWRiVQncU2BA3daX3n0VF3cG6rGLSFVc5Di/yns0dFfh8NFgQ==", "license": "MIT", "engines": { - "node": ">= 0.8" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "node_modules/postcss-normalize-display-values": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.1.tgz", + "integrity": "sha512-E5nnB26XjSYz/mGITm6JgiDpAbVuAkzXwLzRZtts19jHDUBFxZ0BkXAehy0uimrOjYJbocby4FVswA/5noOxrQ==", "license": "MIT", "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/libphonenumber-js": { - "version": "1.12.9", - "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.12.9.tgz", - "integrity": "sha512-VWwAdNeJgN7jFOD+wN4qx83DTPMVPPAUyx9/TUkBXKLiNkuWWk6anV0439tgdtwaJDrEdqkvdN22iA6J4bUCZg==", - "license": "MIT" - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "node_modules/postcss-normalize-positions": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.1.tgz", + "integrity": "sha512-pB/SzrIP2l50ZIYu+yQZyMNmnAcwyYb9R1fVWPRxm4zcUFCY2ign7rcntGFuMXDdd9L2pPNUgoODDk91PzRZuQ==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "license": "BSD-3-Clause", + "node_modules/postcss-normalize-repeat-style": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.1.tgz", + "integrity": "sha512-NsSQJ8zj8TIDiF0ig44Byo3Jk9e4gNt9x2VIlJudnQQ5DhWAHJPF4Tr1ITwyHio2BUi/I6Iv0HRO7beHYOloYQ==", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, + "node_modules/postcss-normalize-string": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-string/-/postcss-normalize-string-7.0.1.tgz", + "integrity": "sha512-QByrI7hAhsoze992kpbMlJSbZ8FuCEc1OT9EFbZ6HldXNpsdpZr+YXC5di3UEv0+jeZlHbZcoCADgb7a+lPmmQ==", + "license": "MIT", "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "license": "ISC", + "node_modules/postcss-normalize-timing-functions": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.1.tgz", + "integrity": "sha512-bHifyuuSNdKKsnNJ0s8fmfLMlvsQwYVxIoUBnowIVl2ZAdrkYQNGVB4RxjfpvkMjipqvbz0u7feBZybkl/6NJg==", + "license": "MIT", "dependencies": { - "brace-expansion": "^1.1.7" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "*" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/mkdirp": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-2.1.3.tgz", - "integrity": "sha512-sjAkg21peAG9HS+Dkx7hlG9Ztx7HLeKnvB3NQRcu/mltCVmvkF0pisbiTSfDVYTT86XEfZrTUosLdZLStquZUw==", + "node_modules/postcss-normalize-unicode": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.3.tgz", + "integrity": "sha512-EcoA29LvG3F+EpOh03iqu+tJY3uYYKzArqKJHxDhUYLa2u58aqGq16K6/AOsXD9yqLN8O6y9mmePKN5cx6krOw==", "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "browserslist": "^4.24.5", + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/multimatch": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz", - "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==", + "node_modules/postcss-normalize-url": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-normalize-url/-/postcss-normalize-url-7.0.1.tgz", + "integrity": "sha512-sUcD2cWtyK1AOL/82Fwy1aIVm/wwj5SdZkgZ3QiUzSzQQofrbq15jWJ3BA7Z+yVRwamCjJgZJN0I9IS7c6tgeQ==", "license": "MIT", "dependencies": { - "@types/minimatch": "^3.0.3", - "array-differ": "^3.0.0", - "array-union": "^2.1.0", - "arrify": "^2.0.1", - "minimatch": "^3.0.4" + "postcss-value-parser": "^4.2.0" }, "engines": { - "node": ">=10" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/node-html-parser": { + "node_modules/postcss-normalize-whitespace": { "version": "7.0.1", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-7.0.1.tgz", - "integrity": "sha512-KGtmPY2kS0thCWGK0VuPyOS+pBKhhe8gXztzA2ilAOhbUbxa9homF1bOyKvhGzMLXUoRds9IOmr/v5lr/lqNmA==", + "resolved": "https://registry.npmmirror.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.1.tgz", + "integrity": "sha512-vsbgFHMFQrJBJKrUFJNZ2pgBeBkC2IvvoHjz1to0/0Xk7sII24T0qFOiJzG6Fu3zJoq/0yI4rKWi7WhApW+EFA==", "license": "MIT", "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", + "node_modules/postcss-ordered-values": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/postcss-ordered-values/-/postcss-ordered-values-7.0.2.tgz", + "integrity": "sha512-AMJjt1ECBffF7CEON/Y0rekRLS6KsePU6PRP08UqYW4UGFRnTXNrByUzYK1h8AC7UWTZdQ9O3Oq9kFIhm0SFEw==", + "license": "MIT", "dependencies": { - "boolbase": "^1.0.0" + "cssnano-utils": "^5.0.1", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "node_modules/postcss-reduce-initial": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.3.tgz", + "integrity": "sha512-RFvkZaqiWtGMlVjlUHpaxGqEL27lgt+Q2Ixjf83CRAzqdo+TsDyGPtJUbPx2MuYIJ+sCQc2TrOvRnhcXQfgIVA==", "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" + "browserslist": "^4.24.5", + "caniuse-api": "^3.0.0" }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/postcss-reduce-transforms": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.1.tgz", + "integrity": "sha512-MhyEbfrm+Mlp/36hvZ9mT9DaO7dbncU0CvWI8V93LRkY6IYlu38OPg3FObnuKTUxJ4qA8HpurdQOo5CyqqO76g==", "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/opencollective-postinstall": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz", - "integrity": "sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==", + "node_modules/postcss-selector-parser": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz", + "integrity": "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==", "license": "MIT", - "bin": { - "opencollective-postinstall": "index.js" + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" } }, - "node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "node_modules/postcss-svgo": { + "version": "7.0.2", + "resolved": "https://registry.npmmirror.com/postcss-svgo/-/postcss-svgo-7.0.2.tgz", + "integrity": "sha512-5Dzy66JlnRM6pkdOTF8+cGsB1fnERTE8Nc+Eed++fOWo1hdsBptCsbG8UuJkgtZt75bRtMJIrPeZmtfANixdFA==", "license": "MIT", "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "postcss-value-parser": "^4.2.0", + "svgo": "^3.3.2" }, "engines": { - "node": ">= 0.8.0" + "node": "^18.12.0 || ^20.9.0 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "node_modules/postcss-unique-selectors": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.4.tgz", + "integrity": "sha512-pmlZjsmEAG7cHd7uK3ZiNSW6otSZ13RHuZ/4cDN/bVglS5EpF2r2oxY99SuOHa8m7AWoBCelTS3JPpzsIs8skQ==", "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.1.0" + }, "engines": { - "node": ">= 0.4" + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -1082,12 +2894,27 @@ "node": ">= 0.6.0" } }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", "license": "Apache-2.0" }, + "node_modules/rrweb-cssom": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/rrweb-cssom/-/rrweb-cssom-0.8.0.tgz", + "integrity": "sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==", + "license": "MIT" + }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", @@ -1105,6 +2932,33 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -1122,6 +2976,12 @@ "node": ">= 0.4" } }, + "node_modules/shuffle-array": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/shuffle-array/-/shuffle-array-1.0.1.tgz", + "integrity": "sha512-0TFRU8zVQaLatWKr0/czo19VyPNgb/a3sBc1GAjVfivfzEGaS54vueNgtAu/8/pW7EM/VF5fwq9zgpLdGyRmVw==", + "license": "MIT" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1131,6 +2991,15 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-resolve": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", @@ -1167,6 +3036,22 @@ "char-regex": "^1.0.2" } }, + "node_modules/stylehacks": { + "version": "7.0.5", + "resolved": "https://registry.npmmirror.com/stylehacks/-/stylehacks-7.0.5.tgz", + "integrity": "sha512-5kNb7V37BNf0Q3w+1pxfa+oiNPS++/b4Jil9e/kPDgrk1zjEd6uR7SZeJiYaLYH6RRSC1XX2/37OTeU/4FvuIA==", + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.5", + "postcss-selector-parser": "^7.1.0" + }, + "engines": { + "node": "^18.12.0 || ^20.9.0 || >=22.0" + }, + "peerDependencies": { + "postcss": "^8.4.32" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -1179,6 +3064,88 @@ "node": ">=8" } }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "license": "MIT" + }, + "node_modules/tldts": { + "version": "6.1.86", + "resolved": "https://registry.npmmirror.com/tldts/-/tldts-6.1.86.tgz", + "integrity": "sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==", + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "resolved": "https://registry.npmmirror.com/tldts-core/-/tldts-core-6.1.86.tgz", + "integrity": "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==", + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-5.1.2.tgz", + "integrity": "sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==", + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^6.1.32" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-5.1.1.tgz", + "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tslib": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", @@ -1197,6 +3164,54 @@ "node": ">= 0.8.0" } }, + "node_modules/undici": { + "version": "7.11.0", + "resolved": "https://registry.npmmirror.com/undici/-/undici-7.11.0.tgz", + "integrity": "sha512-heTSIac3iLhsmZhUCjyS3JQEkZELateufzZuBaVM5RHXdSBMb1LPMQf5x+FH7qjsZYDP0ttAc3nnVpUB+wYbOg==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", @@ -1210,6 +3225,12 @@ "which-typed-array": "^1.1.2" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, "node_modules/validator": { "version": "13.15.15", "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", @@ -1219,6 +3240,61 @@ "node": ">= 0.10" } }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz", + "integrity": "sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==", + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-mimetype": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz", + "integrity": "sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/whatwg-url": { + "version": "14.2.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-14.2.0.tgz", + "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", + "license": "MIT", + "dependencies": { + "tr46": "^5.1.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", @@ -1248,6 +3324,48 @@ "engines": { "node": ">=0.10.0" } + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "license": "ISC" } } } diff --git a/test-project_original_backup/index.html b/test-project_original_backup/index.html new file mode 100644 index 0000000..32205fe --- /dev/null +++ b/test-project_original_backup/index.html @@ -0,0 +1,51 @@ + + + + + +外汇交易は重要な投資手法です。バリュー投資やグロース株への投資も人気があります。
+インデックスファンドや高配当株も注目されています。
+長期投資は資産運用の基本です。分散投資により リスク管理を行いましょう。
+