From 6911256cb3324a250020c84484be059c7c859752 Mon Sep 17 00:00:00 2001 From: notte <54543761+ikxin@users.noreply.github.com> Date: Tue, 24 Mar 2026 09:14:07 +0800 Subject: [PATCH 1/2] =?UTF-8?q?chore:=20Prettier=20=E8=BF=81=E7=A7=BB?= =?UTF-8?q?=E5=88=B0=20Oxfmt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE/bug_report.md | 90 +- .github/ISSUE_TEMPLATE/feature_request.md | 38 +- .github/pull_request_template.md | 3 +- .npmrc | 1 - .oxfmtrc.json | 19 + .vscode/settings.json | 1 + app/components/AppHeader.vue | 16 +- app/components/CommonActivate.vue | 6 +- app/components/CommonTips.vue | 26 +- app/pages/activate.vue | 2 +- app/pages/activate/office.vue | 2 +- app/pages/activate/windows-server.vue | 2 +- app/pages/activate/windows.vue | 2 +- app/pages/check/index.vue | 8 +- app/pages/index.vue | 8 +- app/pages/monitor.vue | 20 +- app/plugins/arco-dark-mode.client.ts | 2 +- app/utils/request.ts | 2 +- i18n/i18n.config.ts | 6 +- node-vlmcs/src/cli.ts | 1101 +++-- node-vlmcs/src/crypto.ts | 518 +- node-vlmcs/src/data.ts | 5328 ++++++++++----------- node-vlmcs/src/helpers.ts | 42 +- node-vlmcs/src/index.ts | 42 +- node-vlmcs/src/kms.ts | 414 +- node-vlmcs/src/network.ts | 193 +- node-vlmcs/src/output.ts | 153 +- node-vlmcs/src/rpc.ts | 46 +- node-vlmcs/src/types.ts | 109 +- nuxt.config.ts | 54 +- package.json | 23 +- pnpm-lock.yaml | 1439 +++--- server/api/check.ts | 4 +- server/api/monitor.ts | 4 +- server/tasks/monitor.ts | 10 +- server/utils/kms.ts | 6 +- server/utils/storage.ts | 2 +- shared/types/monitor.ts | 18 +- shared/utils/gvlks.ts | 114 +- tailwind.config.ts | 4 +- 40 files changed, 5274 insertions(+), 4604 deletions(-) delete mode 100644 .npmrc create mode 100644 .oxfmtrc.json diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index fa9119a6..705ae6e0 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,45 +1,45 @@ ---- -name: 错误报告 -about: 创建一个报告以帮助我们改进 -title: '' -labels: '' -assignees: '' ---- - -**描述错误** - -简单地描述一下这个错误是什么 - -**复现错误** - -复现该错误行为的步骤 - -1. 跳转到 '...' -2. 点击 '....' -3. 向下滑动到 '....' -4. 查看错误 - -**预期行为** - -简单地描述一下你预期发生的情况 - -**屏幕截图** - -如果可以的话,附上截图以帮助解决你的问题 - -**桌面端(请填写以下信息)** - -- 操作系统 (例如:Windows) -- 浏览器 (例如:Chrome, Safari) -- 软件版本 (例如:1.1.0) - -**移动端(请填写以下信息)** - -- 设备 (例如:iPhone13 Pro) -- 操作系统 (例如:ios 15.1) -- 浏览器 (例如:Chrome, Safari) -- 软件版本 (例如:1.1.0) - -**备注** - -在此添加关于问题的其他备注 +--- +name: 错误报告 +about: 创建一个报告以帮助我们改进 +title: '' +labels: '' +assignees: '' +--- + +**描述错误** + +简单地描述一下这个错误是什么 + +**复现错误** + +复现该错误行为的步骤 + +1. 跳转到 '...' +2. 点击 '....' +3. 向下滑动到 '....' +4. 查看错误 + +**预期行为** + +简单地描述一下你预期发生的情况 + +**屏幕截图** + +如果可以的话,附上截图以帮助解决你的问题 + +**桌面端(请填写以下信息)** + +- 操作系统 (例如:Windows) +- 浏览器 (例如:Chrome, Safari) +- 软件版本 (例如:1.1.0) + +**移动端(请填写以下信息)** + +- 设备 (例如:iPhone13 Pro) +- 操作系统 (例如:ios 15.1) +- 浏览器 (例如:Chrome, Safari) +- 软件版本 (例如:1.1.0) + +**备注** + +在此添加关于问题的其他备注 diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index ccb87ada..d8bdfca1 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -1,19 +1,19 @@ ---- -name: 新功能请求 -about: 为这个项目提出一个想法 -title: '' -labels: '' -assignees: '' ---- - -**描述你想要的解决方案** - -简单地描述一下你希望发生什么 - -**描述你考虑的替代方案** - -简单地描述一下你考虑过的替代解决方案或功能 - -**备注** - -在这里添加关于该功能请求的任何其他备注或屏幕截图 +--- +name: 新功能请求 +about: 为这个项目提出一个想法 +title: '' +labels: '' +assignees: '' +--- + +**描述你想要的解决方案** + +简单地描述一下你希望发生什么 + +**描述你考虑的替代方案** + +简单地描述一下你考虑过的替代解决方案或功能 + +**备注** + +在这里添加关于该功能请求的任何其他备注或屏幕截图 diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 026156da..b98f52b2 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -3,7 +3,6 @@ 在其中一位合作者批准后,拉取请求将被合并。 请确保在提交您的拉取请求之前填写这些表格,谢谢! - ### 这个变动的性质是 - [ ] 新特性提交 @@ -45,4 +44,4 @@ ### 后续计划(非新功能可选) -> 如果这个提交后面还有相关的其他提交和跟进信息,可以写在这里。 \ No newline at end of file +> 如果这个提交后面还有相关的其他提交和跟进信息,可以写在这里。 diff --git a/.npmrc b/.npmrc deleted file mode 100644 index bf2e7648..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -shamefully-hoist=true diff --git a/.oxfmtrc.json b/.oxfmtrc.json new file mode 100644 index 00000000..f8569c76 --- /dev/null +++ b/.oxfmtrc.json @@ -0,0 +1,19 @@ +{ + "$schema": "./node_modules/oxfmt/configuration_schema.json", + "arrowParens": "avoid", + "semi": false, + "singleQuote": true, + "trailingComma": "none", + "sortTailwindcss": {}, + "printWidth": 80, + "sortPackageJson": false, + "ignorePatterns": [], + "overrides": [ + { + "files": ["shared/utils/gvlks.ts"], + "options": { + "printWidth": 200 + } + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index d4959144..0cd33c9c 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,6 @@ { "chat.tools.terminal.autoApprove": { "/.*/": true }, "chat.tools.terminal.ignoreDefaultAutoApproveRules": true, + "editor.defaultFormatter": "oxc.oxc-vscode", "editor.formatOnSave": true } diff --git a/app/components/AppHeader.vue b/app/components/AppHeader.vue index 77ceb5e3..60d4ad78 100644 --- a/app/components/AppHeader.vue +++ b/app/components/AppHeader.vue @@ -13,33 +13,33 @@ const navItems = computed(() => [ { name: 'activate', label: t('label.activate'), - icon: 'icons:activate', + icon: 'icons:activate' }, { name: 'check', label: t('label.check'), - icon: 'icons:tools', + icon: 'icons:tools' }, { name: 'monitor', label: t('label.monitor'), - icon: 'icons:monitor', - }, + icon: 'icons:monitor' + } ]) const themeItems = computed(() => [ { lable: t('label.auto'), - value: 'system', + value: 'system' }, { lable: t('label.dark'), - value: 'dark', + value: 'dark' }, { lable: t('label.light'), - value: 'light', - }, + value: 'light' + } ]) function handleNavClick(name: string) { diff --git a/app/components/CommonActivate.vue b/app/components/CommonActivate.vue index 83cf21d8..e0075fad 100644 --- a/app/components/CommonActivate.vue +++ b/app/components/CommonActivate.vue @@ -15,7 +15,7 @@ const formData = ref({ edition: gvlksData[0]?.edition[0]?.[rankVal.value] || '', arch: 'x64', host: monitorData.value?.[0]?.host || '', - license: '', + license: '' }) watch( @@ -63,7 +63,7 @@ const fileUrl = useObjectUrl(file) const { copy, copied } = useClipboard({ legacy: true, - source: content, + source: content }) @@ -110,7 +110,7 @@ const { copy, copied } = useClipboard({ :label="item.host" class="[&>*]:w-full" > -
+
{{ item.host }}
本站不进行技术鉴别 KMS 服务器的合法性,若存在侵犯第三方权益的情况,将配合删除并维护权益。作为非盈利的技术学习交流平台,本站不对因使用本站信息造成的任何损害负责,用户在使用本站信息时,应自行确保不违反当地法律法规。通过访问或使用本站,即表示接受本站声明的约束。`, + content: `本站提供的信息、教程、代码和脚本等均来源于互联网和微软官方文档,且未进行逐个标注。所有展示的 Windows 或 Office 的 GVLK 和激活步骤均基于微软官方公示的资料。本站不拥有、搭建或维护任何 KMS 激活服务器,所展示的 KMS 服务器信息均来自互联网或第三方投稿,且默认为合法持有者公益共享。
本站不进行技术鉴别 KMS 服务器的合法性,若存在侵犯第三方权益的情况,将配合删除并维护权益。作为非盈利的技术学习交流平台,本站不对因使用本站信息造成的任何损害负责,用户在使用本站信息时,应自行确保不违反当地法律法规。通过访问或使用本站,即表示接受本站声明的约束。` }, { key: 2, header: `如何使用 KMS 服务器激活 Windows 系统和 Office 软件?`, - content: `点击「下载」按钮下载 KMS 激活脚本,若浏览器提示存在安全风险,请点击「允许」按钮。下载完成后在文件资源管理器中找到 kms.bat 文件,右键选择「以管理员身份运行」选项,在终端弹出的弹窗中依次点击「确定」按钮,即可激活对应版本的 Windows 系统或 Office 软件。`, + content: `点击「下载」按钮下载 KMS 激活脚本,若浏览器提示存在安全风险,请点击「允许」按钮。下载完成后在文件资源管理器中找到 kms.bat 文件,右键选择「以管理员身份运行」选项,在终端弹出的弹窗中依次点击「确定」按钮,即可激活对应版本的 Windows 系统或 Office 软件。` }, { key: 3, header: `使用 KMS 服务器激活的原理是什么?`, - content: `KMS 激活是微软为大型企业或机构设计的内部网络激活解决方案,允许企业通过内网的 KMS 服务器自动管理软件授权,实现设备的永久激活。尽管设计初衷是限于企业内网使用,但技术手段已使公网用户也能通过连接到公开的 KMS 服务器实现类似效果。KMS 激活有一个 180 天的有效期,系统默认每 7 天尝试自动续订,只要设备在 180 天内能连接到互联网,激活状态就会持续有效,从而实现实质上的永久激活。使用 KMS 激活时,应低调并注意来源的合法性与安全性。`, + content: `KMS 激活是微软为大型企业或机构设计的内部网络激活解决方案,允许企业通过内网的 KMS 服务器自动管理软件授权,实现设备的永久激活。尽管设计初衷是限于企业内网使用,但技术手段已使公网用户也能通过连接到公开的 KMS 服务器实现类似效果。KMS 激活有一个 180 天的有效期,系统默认每 7 天尝试自动续订,只要设备在 180 天内能连接到互联网,激活状态就会持续有效,从而实现实质上的永久激活。使用 KMS 激活时,应低调并注意来源的合法性与安全性。` }, { key: 4, header: `哪些 Windows 或 Office 版本不支持 KMS 激活?`, - content: `Windows 操作系统有多种版本,包括面向开发者的 MSDN 版、笔记本品牌厂商的 OEM 版、正版光盘的 COEM 版、零售的 RTL 版,以及面向企业、政府和教育机构大量采购的 VOL 版。VOL 版适用于 KMS 激活,而 RTL 版则需通过更换密钥升级至 VOL 版才能使用 KMS 激活。用户可以通过检查镜像名称或使用命令提示符执行特定命令来确认 Windows 或 Office 是否为支持 KMS 激活的 VOL 版。`, + content: `Windows 操作系统有多种版本,包括面向开发者的 MSDN 版、笔记本品牌厂商的 OEM 版、正版光盘的 COEM 版、零售的 RTL 版,以及面向企业、政府和教育机构大量采购的 VOL 版。VOL 版适用于 KMS 激活,而 RTL 版则需通过更换密钥升级至 VOL 版才能使用 KMS 激活。用户可以通过检查镜像名称或使用命令提示符执行特定命令来确认 Windows 或 Office 是否为支持 KMS 激活的 VOL 版。` }, { key: 5, header: `激活后是正版吗?如何选择激活工具?`, - content: `正版软件是一个法律概念,指的是合法授权使用的软件。对于希望免费使用但担心破解版带来问题的用户,他们通常寻求的“正版”实际上是指“原版”,即未被破解篡改的官方版本。首选的激活方式是使用零售密钥或批量 MAK 密钥,其次是通过 KMS 激活。尽管存在破解软件,但这些方法存在安全风险,不推荐使用。微软公司及其创始人比尔·盖茨在慈善方面的慷慨被广泛认可,但这并不意味着可以滥用其产品的授权政策。因此,当条件允许时,应购买并支持正版软件,尊重软件开发者的劳动成果。`, - }, + content: `正版软件是一个法律概念,指的是合法授权使用的软件。对于希望免费使用但担心破解版带来问题的用户,他们通常寻求的“正版”实际上是指“原版”,即未被破解篡改的官方版本。首选的激活方式是使用零售密钥或批量 MAK 密钥,其次是通过 KMS 激活。尽管存在破解软件,但这些方法存在安全风险,不推荐使用。微软公司及其创始人比尔·盖茨在慈善方面的慷慨被广泛认可,但这并不意味着可以滥用其产品的授权政策。因此,当条件允许时,应购买并支持正版软件,尊重软件开发者的劳动成果。` + } ] const enTips = [ { key: 1, header: `Disclaimer`, - content: `The information, tutorials, code, and scripts provided on this site are sourced from the internet and official Microsoft documentation, and individual references are not listed. All GVLK keys and activation steps for Windows or Office displayed here are based on publicly available Microsoft documentation. This site does not own, set up, or maintain any KMS activation servers. All KMS server information displayed is sourced from the internet or third-party submissions, and it is assumed that these are shared by legitimate owners for public benefit.
This site does not verify the legality of KMS servers, and if any third-party rights are infringed, we will cooperate in deleting the content and protecting their rights. As a non-profit platform for technical learning and exchange, this site is not responsible for any damage caused by using the information provided. Users are responsible for ensuring that they do not violate local laws and regulations when using the information. By accessing or using this site, you agree to be bound by this disclaimer.`, + content: `The information, tutorials, code, and scripts provided on this site are sourced from the internet and official Microsoft documentation, and individual references are not listed. All GVLK keys and activation steps for Windows or Office displayed here are based on publicly available Microsoft documentation. This site does not own, set up, or maintain any KMS activation servers. All KMS server information displayed is sourced from the internet or third-party submissions, and it is assumed that these are shared by legitimate owners for public benefit.
This site does not verify the legality of KMS servers, and if any third-party rights are infringed, we will cooperate in deleting the content and protecting their rights. As a non-profit platform for technical learning and exchange, this site is not responsible for any damage caused by using the information provided. Users are responsible for ensuring that they do not violate local laws and regulations when using the information. By accessing or using this site, you agree to be bound by this disclaimer.` }, { key: 2, header: `How to Activate Windows and Office Software Using a KMS Server?`, - content: `Click the "Download" button to download the KMS activation script. If your browser warns of a security risk, click the "Allow" button. After downloading, locate the kms.bat file in File Explorer, right-click it, and select "Run as administrator." In the terminal window that pops up, click the "OK" button to activate the corresponding version of Windows or Office software.`, + content: `Click the "Download" button to download the KMS activation script. If your browser warns of a security risk, click the "Allow" button. After downloading, locate the kms.bat file in File Explorer, right-click it, and select "Run as administrator." In the terminal window that pops up, click the "OK" button to activate the corresponding version of Windows or Office software.` }, { key: 3, header: `How Does KMS Activation Work?`, - content: `KMS activation is an internal network activation solution designed by Microsoft for large enterprises or institutions. It allows companies to manage software licenses automatically through an internal KMS server, achieving permanent activation of devices. Although originally intended for enterprise intranets, technical methods have allowed public users to connect to open KMS servers for similar activation results. KMS activation has a 180-day validity period, with the system automatically attempting to renew every 7 days. As long as the device connects to the internet within the 180-day period, the activation status will remain valid, effectively achieving permanent activation. When using KMS activation, it is advisable to remain discreet and be aware of the legality and security of the sources.`, + content: `KMS activation is an internal network activation solution designed by Microsoft for large enterprises or institutions. It allows companies to manage software licenses automatically through an internal KMS server, achieving permanent activation of devices. Although originally intended for enterprise intranets, technical methods have allowed public users to connect to open KMS servers for similar activation results. KMS activation has a 180-day validity period, with the system automatically attempting to renew every 7 days. As long as the device connects to the internet within the 180-day period, the activation status will remain valid, effectively achieving permanent activation. When using KMS activation, it is advisable to remain discreet and be aware of the legality and security of the sources.` }, { key: 4, header: `Which Versions of Windows or Office Do Not Support KMS Activation?`, - content: `There are various versions of the Windows operating system, including the developer-oriented MSDN version, the OEM version for laptop manufacturers, the COEM version for retail disks, the RTL version for retail, and the VOL version for enterprises, governments, and educational institutions that purchase in bulk. The VOL version is suitable for KMS activation, while the RTL version requires a key replacement upgrade to the VOL version to use KMS activation. Users can check the image name or use specific commands in the command prompt to confirm whether their version of Windows or Office supports KMS activation as a VOL version.`, + content: `There are various versions of the Windows operating system, including the developer-oriented MSDN version, the OEM version for laptop manufacturers, the COEM version for retail disks, the RTL version for retail, and the VOL version for enterprises, governments, and educational institutions that purchase in bulk. The VOL version is suitable for KMS activation, while the RTL version requires a key replacement upgrade to the VOL version to use KMS activation. Users can check the image name or use specific commands in the command prompt to confirm whether their version of Windows or Office supports KMS activation as a VOL version.` }, { key: 5, header: `Is It Genuine After Activation? How Should You Choose an Activation Tool?`, - content: `Genuine software is a legal concept that refers to software legally authorized for use. For users who wish to use software for free but are concerned about issues with cracked versions, what they are usually looking for is "original," meaning an official version that has not been tampered with. The preferred activation method is to use a retail key or a volume MAK key, followed by KMS activation. Although there are cracking tools available, they pose security risks and are not recommended. While Microsoft and its founder, Bill Gates, are widely recognized for their philanthropy, this does not justify abusing their product licensing policies. Therefore, when possible, you should purchase and support genuine software to respect the efforts of software developers.`, - }, + content: `Genuine software is a legal concept that refers to software legally authorized for use. For users who wish to use software for free but are concerned about issues with cracked versions, what they are usually looking for is "original," meaning an official version that has not been tampered with. The preferred activation method is to use a retail key or a volume MAK key, followed by KMS activation. Although there are cracking tools available, they pose security risks and are not recommended. While Microsoft and its founder, Bill Gates, are widely recognized for their philanthropy, this does not justify abusing their product licensing policies. Therefore, when possible, you should purchase and support genuine software to respect the efforts of software developers.` + } ] const tips = computed(() => { @@ -76,7 +76,7 @@ const tips = computed(() => { - + diff --git a/app/pages/activate.vue b/app/pages/activate.vue index 1cc31c20..fd984a7e 100644 --- a/app/pages/activate.vue +++ b/app/pages/activate.vue @@ -17,7 +17,7 @@ watch( () => route.path, () => { drawerVisible.value = false - }, + } ) function handleMenuClick(key: string) { diff --git a/app/pages/activate/office.vue b/app/pages/activate/office.vue index 6427b10d..f6ae2d1a 100644 --- a/app/pages/activate/office.vue +++ b/app/pages/activate/office.vue @@ -1,6 +1,6 @@ diff --git a/app/pages/monitor.vue b/app/pages/monitor.vue index 2e2dd092..e1144f05 100644 --- a/app/pages/monitor.vue +++ b/app/pages/monitor.vue @@ -1,6 +1,6 @@ diff --git a/app/plugins/arco-dark-mode.client.ts b/app/plugins/arco-dark-mode.client.ts index d634b721..3c10834f 100644 --- a/app/plugins/arco-dark-mode.client.ts +++ b/app/plugins/arco-dark-mode.client.ts @@ -10,6 +10,6 @@ export default defineNuxtPlugin(() => { document.body.removeAttribute('arco-theme') } }, - { immediate: true }, + { immediate: true } ) }) diff --git a/app/utils/request.ts b/app/utils/request.ts index d388629b..a361233c 100644 --- a/app/utils/request.ts +++ b/app/utils/request.ts @@ -2,6 +2,6 @@ export const request = () => { const runtimeConfig = useRuntimeConfig() return $fetch.create({ - baseURL: runtimeConfig.public.apiUrl, + baseURL: runtimeConfig.public.apiUrl }) } diff --git a/i18n/i18n.config.ts b/i18n/i18n.config.ts index bfc9aff2..c01f2a34 100644 --- a/i18n/i18n.config.ts +++ b/i18n/i18n.config.ts @@ -1,5 +1,5 @@ export default { fallbackLocale: { - default: ["zh-cn", "en"], - }, -}; + default: ['zh-cn', 'en'] + } +} diff --git a/node-vlmcs/src/cli.ts b/node-vlmcs/src/cli.ts index a709ca13..a621e99a 100644 --- a/node-vlmcs/src/cli.ts +++ b/node-vlmcs/src/cli.ts @@ -8,226 +8,304 @@ * - src/vlmcs.h (全局状态变量定义) */ -import * as net from 'net'; -import { KmsData } from './data'; +import * as net from 'net' +import { KmsData } from './data' import { - guidToBuffer, stringToGuidLE, - utf8ToUcs2, ucs2ToUtf8, unixTimeToFileTime, - VERSION, PID_BUFFER_SIZE, WORKSTATION_NAME_BUFFER, - ResponseResult, -} from './types'; + guidToBuffer, + stringToGuidLE, + utf8ToUcs2, + ucs2ToUtf8, + unixTimeToFileTime, + VERSION, + PID_BUFFER_SIZE, + WORKSTATION_NAME_BUFFER, + ResponseResult +} from './types' import { - createRequestV4, createRequestV6, - decryptResponseV4, decryptResponseV6, - ParsedResponse, -} from './kms'; -import { rpcBindClient, rpcSendRequest, RpcFlags, RpcDiag } from './rpc'; -import { connectToAddress, isDisconnected } from './network'; -import { stringToInt, getArgumentBool } from './helpers'; -import { get16RandomBytes } from './crypto'; + createRequestV4, + createRequestV6, + decryptResponseV4, + decryptResponseV6, + ParsedResponse +} from './kms' +import { rpcBindClient, rpcSendRequest, RpcFlags, RpcDiag } from './rpc' +import { connectToAddress, isDisconnected } from './network' +import { stringToInt, getArgumentBool } from './helpers' +import { get16RandomBytes } from './crypto' import { - logRequestVerbose, logResponseVerbose, uuid2StringLE, - printPlatform, printCommonFlags, printClientFlags, -} from './output'; + logRequestVerbose, + logResponseVerbose, + uuid2StringLE, + printPlatform, + printCommonFlags, + printClientFlags +} from './output' // ─── 常量 (参考 src/vlmcs.c) ──────────────────────────────────────────────── -const VLMCS_OPTION_GRAB_INI = 1; // -G 模式(获取 ePID/HwId 数据) -const VLMCS_OPTION_NO_GRAB_INI = 2; // 与 -G 不兼容的选项 +const VLMCS_OPTION_GRAB_INI = 1 // -G 模式(获取 ePID/HwId 数据) +const VLMCS_OPTION_NO_GRAB_INI = 2 // 与 -G 不兼容的选项 // ─── 随机工作站名的 DNS 域名组件 (参考 src/vlmcs.c 中的 DnsNames) ───────── const DnsNames = { - first: ['www', 'ftp', 'kms', 'hack-me', 'smtp', 'ns1', 'mx1', 'ns1', 'pop3', 'imap', 'mail', 'dns', 'headquarter', 'we-love', '_vlmcs._tcp', 'ceo-laptop'], - second: ['.microsoft', '.apple', '.amazon', '.samsung', '.adobe', '.google', '.yahoo', '.facebook', '.ubuntu', '.oracle', '.borland', '.htc', '.acer', '.windows', '.linux', '.sony'], - tld: ['.com', '.net', '.org', '.cn', '.co.uk', '.de', '.com.tw', '.us', '.fr', '.it', '.me', '.info', '.biz', '.co.jp', '.ua', '.at', '.es', '.pro', '.by', '.ru', '.pl', '.kr'], -}; + first: [ + 'www', + 'ftp', + 'kms', + 'hack-me', + 'smtp', + 'ns1', + 'mx1', + 'ns1', + 'pop3', + 'imap', + 'mail', + 'dns', + 'headquarter', + 'we-love', + '_vlmcs._tcp', + 'ceo-laptop' + ], + second: [ + '.microsoft', + '.apple', + '.amazon', + '.samsung', + '.adobe', + '.google', + '.yahoo', + '.facebook', + '.ubuntu', + '.oracle', + '.borland', + '.htc', + '.acer', + '.windows', + '.linux', + '.sony' + ], + tld: [ + '.com', + '.net', + '.org', + '.cn', + '.co.uk', + '.de', + '.com.tw', + '.us', + '.fr', + '.it', + '.me', + '.info', + '.biz', + '.co.jp', + '.ua', + '.at', + '.es', + '.pro', + '.by', + '.ru', + '.pl', + '.kr' + ] +} -const alphanum = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +const alphanum = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ' // ─── 全局状态变量 (参考 src/vlmcs.c 中的全局变量) ──────────────────────────── -let verbose = false; // -v 详细输出 -let vmInfo = false; // -m 伪装为虚拟机 -let dnsnames = true; // 使用 DNS 风格的随机工作站名(-d 可禁用) -let fixedRequests = 0; // -n 固定请求次数 -let licenseStatus = 0x02; // -t 许可证状态(默认 OOB grace) -let cmidStr: string | null = null; // -c 自定义客户端机器 ID -let cmidPrevStr: string | null = null; // -o 自定义前一个客户端机器 ID -let workstationName: string | null = null; // -w 自定义工作站名 -let bindingExpiration = 43200; // -g 绑定过期时间(分钟) -let remoteAddr = ''; // 目标 KMS 服务器地址 -let reconnectForEachRequest = false; // -T 每次请求重新连接 -let addressFamily = 0; // -i IP 协议版本(0=自动, 4=IPv4, 6=IPv6) -let incompatibleOptions = 0; // 选项兼容性跟踪 -let fnIniClient: string | null = null; // -G 输出文件路径 -let activeProductIndex = 0; // 当前选中的产品索引 -let nCountPolicy = 0; // 最小客户端计数策略 -let appGuid: Buffer = Buffer.alloc(16); // 应用程序 GUID -let kmsGuid: Buffer = Buffer.alloc(16); // KMS 计数 ID -let skuGuid: Buffer = Buffer.alloc(16); // 激活 ID (SKU GUID) -let minorVersion = 0; // 协议次版本号 -let majorVersion = 0; // 协议主版本号 -let useClientRpcNDR64 = true; // -N 是否使用 NDR64 -let useClientRpcBTFN = true; // -B 是否使用绑定时间特性协商 -let useMultiplexedRpc = true; // -p 是否使用多路复用 RPC -let rpcFlags: RpcFlags = { hasNDR32: false, hasNDR64: false, hasBTFN: false }; -let firstPacketSent = false; // 是否已发送第一个数据包 +let verbose = false // -v 详细输出 +let vmInfo = false // -m 伪装为虚拟机 +let dnsnames = true // 使用 DNS 风格的随机工作站名(-d 可禁用) +let fixedRequests = 0 // -n 固定请求次数 +let licenseStatus = 0x02 // -t 许可证状态(默认 OOB grace) +let cmidStr: string | null = null // -c 自定义客户端机器 ID +let cmidPrevStr: string | null = null // -o 自定义前一个客户端机器 ID +let workstationName: string | null = null // -w 自定义工作站名 +let bindingExpiration = 43200 // -g 绑定过期时间(分钟) +let remoteAddr = '' // 目标 KMS 服务器地址 +let reconnectForEachRequest = false // -T 每次请求重新连接 +let addressFamily = 0 // -i IP 协议版本(0=自动, 4=IPv4, 6=IPv6) +let incompatibleOptions = 0 // 选项兼容性跟踪 +let fnIniClient: string | null = null // -G 输出文件路径 +let activeProductIndex = 0 // 当前选中的产品索引 +let nCountPolicy = 0 // 最小客户端计数策略 +let appGuid: Buffer = Buffer.alloc(16) // 应用程序 GUID +let kmsGuid: Buffer = Buffer.alloc(16) // KMS 计数 ID +let skuGuid: Buffer = Buffer.alloc(16) // 激活 ID (SKU GUID) +let minorVersion = 0 // 协议次版本号 +let majorVersion = 0 // 协议主版本号 +let useClientRpcNDR64 = true // -N 是否使用 NDR64 +let useClientRpcBTFN = true // -B 是否使用绑定时间特性协商 +let useMultiplexedRpc = true // -p 是否使用多路复用 RPC +let rpcFlags: RpcFlags = { hasNDR32: false, hasNDR64: false, hasBTFN: false } +let firstPacketSent = false // 是否已发送第一个数据包 /** 输出错误信息到 stderr */ function errorout(msg: string): void { - process.stderr.write(msg); + process.stderr.write(msg) } /** 解析命令行中的 GUID 参数,无效时退出进程 */ function parseGuidArg(input: string): Buffer { if (input.length !== 36) { - errorout('Fatal: Command line contains an invalid GUID.\n'); - process.exit(22); + errorout('Fatal: Command line contains an invalid GUID.\n') + process.exit(22) } - const guid = stringToGuidLE(input); + const guid = stringToGuidLE(input) if (!guid) { - errorout('Fatal: Command line contains an invalid GUID.\n'); - process.exit(22); + errorout('Fatal: Command line contains an invalid GUID.\n') + process.exit(22) } - return guidToBuffer(guid); + return guidToBuffer(guid) } /** 显示帮助信息并退出,参考 src/vlmcs.c 中的 usage() */ function showHelp(programName: string): never { errorout( `vlmcs ${VERSION}\n\n` + - `Usage: ${programName} [options] [ [:] | . | - ] [options]\n\n` + - `Options:\n\n` + - ` -v Be verbose\n` + - ` -l \n` + - ` -4 Force V4 protocol\n` + - ` -5 Force V5 protocol\n` + - ` -6 Force V6 protocol\n` + - ` -i Use IP protocol (4 or 6)\n` + - ` -j Load external KMS data file \n` + - ` -e Show some valid examples\n` + - ` -x Show valid Apps\n` + - ` -d no DNS names, use Netbios names (no effect if -w is used)\n` + - ` -V show version information and exit\n\n` + - `Advanced options:\n\n` + - ` -a Use custom Application GUID\n` + - ` -s Use custom Activation Configuration GUID\n` + - ` -k Use custom KMS GUID\n` + - ` -c Use custom Client GUID. Default: Use random\n` + - ` -o Use custom Prevoius Client GUID. Default: ZeroGUID\n` + - ` -K Use a specific (possibly invalid) protocol version\n` + - ` -w Use custom workstation name. Default: Use random\n` + - ` -r Fake required clients\n` + - ` -n Fixed # of requests (Default: Enough to charge)\n` + - ` -m Pretend to be a virtual machine\n` + - ` -G Get ePID/HwId data and write to . Can't be used with -l, -4, -5, -6, -a, -s, -k, -r and -n\n` + - ` -T Use a new TCP connection for each request.\n` + - ` -N <0|1> disable or enable NDR64. Default: 1\n` + - ` -B <0|1> disable or enable RPC bind time feature negotiation. Default: 1\n` + - ` -t Use specfic license status (0 <= T <= 6)\n` + - ` -g Use a specfic binding expiration time in minutes. Default 43200\n` + - ` -P Ignore priority and weight in DNS SRV records\n` + - ` -p Don't use multiplexed RPC bind\n` + - `\n` + - `:\t\tTCP port name of the KMS to use. Default 1688.\n` + - `:\t\thost name of the KMS to use. Default 127.0.0.1\n` + - `.:\tfind KMS server in via DNS\n` + - `:\t\t(Type ${programName} -x to see a list of valid apps)\n\n` - ); - process.exit(22); + `Usage: ${programName} [options] [ [:] | . | - ] [options]\n\n` + + `Options:\n\n` + + ` -v Be verbose\n` + + ` -l \n` + + ` -4 Force V4 protocol\n` + + ` -5 Force V5 protocol\n` + + ` -6 Force V6 protocol\n` + + ` -i Use IP protocol (4 or 6)\n` + + ` -j Load external KMS data file \n` + + ` -e Show some valid examples\n` + + ` -x Show valid Apps\n` + + ` -d no DNS names, use Netbios names (no effect if -w is used)\n` + + ` -V show version information and exit\n\n` + + `Advanced options:\n\n` + + ` -a Use custom Application GUID\n` + + ` -s Use custom Activation Configuration GUID\n` + + ` -k Use custom KMS GUID\n` + + ` -c Use custom Client GUID. Default: Use random\n` + + ` -o Use custom Prevoius Client GUID. Default: ZeroGUID\n` + + ` -K Use a specific (possibly invalid) protocol version\n` + + ` -w Use custom workstation name. Default: Use random\n` + + ` -r Fake required clients\n` + + ` -n Fixed # of requests (Default: Enough to charge)\n` + + ` -m Pretend to be a virtual machine\n` + + ` -G Get ePID/HwId data and write to . Can't be used with -l, -4, -5, -6, -a, -s, -k, -r and -n\n` + + ` -T Use a new TCP connection for each request.\n` + + ` -N <0|1> disable or enable NDR64. Default: 1\n` + + ` -B <0|1> disable or enable RPC bind time feature negotiation. Default: 1\n` + + ` -t Use specfic license status (0 <= T <= 6)\n` + + ` -g Use a specfic binding expiration time in minutes. Default 43200\n` + + ` -P Ignore priority and weight in DNS SRV records\n` + + ` -p Don't use multiplexed RPC bind\n` + + `\n` + + `:\t\tTCP port name of the KMS to use. Default 1688.\n` + + `:\t\thost name of the KMS to use. Default 127.0.0.1\n` + + `.:\tfind KMS server in via DNS\n` + + `:\t\t(Type ${programName} -x to see a list of valid apps)\n\n` + ) + process.exit(22) } /** 显示用法示例 */ function showExamples(programName: string): never { process.stdout.write( `\nRequest activation for Office 2013 using V4 protocol from 192.168.1.5:1688\n` + - `\t${programName} -l "Office 2013 Professional" -4 192.168.1.5\n` + - `\t${programName} -l "Office 2013 Professional" -4 192.168.1.5:1688\n\n` + - `Request activation for Windows Server 2012 using V4 protocol from localhost:1688\n` + - `\t${programName} -4 -l "Windows Server 2012" -k 8665cb71-468c-4aa3-a337-cb9bc9d5eaac\n` + - `\t${programName} -4 -l "Windows Server 2012"\n` + - `\t${programName} -4 -l "Windows Server 2012" [::1]:1688\n` + - `\t${programName} -4 -l "Windows Server 2012" 127.0.0.2:1688\n\n` + - `Send 100,000 requests to localhost:1688\n` + - `\t${programName} -n 100000\n\n` + - `Request Activation for Windows 8 from 10.0.0.1:4711 and pretend to be Steve Ballmer\n` + - `\t${programName} -l "Windows 8 Professional" -w steveb1.redmond.microsoft.com 10.0.0.1:4711\n\n` - ); - process.exit(0); + `\t${programName} -l "Office 2013 Professional" -4 192.168.1.5\n` + + `\t${programName} -l "Office 2013 Professional" -4 192.168.1.5:1688\n\n` + + `Request activation for Windows Server 2012 using V4 protocol from localhost:1688\n` + + `\t${programName} -4 -l "Windows Server 2012" -k 8665cb71-468c-4aa3-a337-cb9bc9d5eaac\n` + + `\t${programName} -4 -l "Windows Server 2012"\n` + + `\t${programName} -4 -l "Windows Server 2012" [::1]:1688\n` + + `\t${programName} -4 -l "Windows Server 2012" 127.0.0.2:1688\n\n` + + `Send 100,000 requests to localhost:1688\n` + + `\t${programName} -n 100000\n\n` + + `Request Activation for Windows 8 from 10.0.0.1:4711 and pretend to be Steve Ballmer\n` + + `\t${programName} -l "Windows 8 Professional" -w steveb1.redmond.microsoft.com 10.0.0.1:4711\n\n` + ) + process.exit(0) } /** 显示所有可用产品列表(-x 选项),参考 src/vlmcs.c 中的 showProducts() */ function showProducts(): never { - const cols = process.stdout.columns || 80; - const items = KmsData.skuItems; - let longestString = 0; + const cols = process.stdout.columns || 80 + const items = KmsData.skuItems + let longestString = 0 for (const item of items) { - if (item.name.length > longestString) longestString = item.name.length; + if (item.name.length > longestString) longestString = item.name.length } - const itemsPerLine = Math.max(1, Math.floor(cols / (longestString + 10))); - const lines = Math.ceil(items.length / itemsPerLine); + const itemsPerLine = Math.max(1, Math.floor(cols / (longestString + 10))) + const lines = Math.ceil(items.length / itemsPerLine) - process.stdout.write('You may use these product names or numbers:\n\n'); + process.stdout.write('You may use these product names or numbers:\n\n') for (let i = 0; i < lines; i++) { - let line = ''; + let line = '' for (let k = 0; k < itemsPerLine; k++) { - const index = k * lines + i; - if (index >= items.length) break; - const num = (index + 1).toString().padStart(3, ' '); - const name = items[index].name; - line += `${num} = ${name}${' '.repeat(longestString + 4 - name.length)}`; + const index = k * lines + i + if (index >= items.length) break + const num = (index + 1).toString().padStart(3, ' ') + const name = items[index].name + line += `${num} = ${name}${' '.repeat(longestString + 4 - name.length)}` } - process.stdout.write(line + '\n'); + process.stdout.write(line + '\n') } - process.stdout.write('\n'); - process.exit(0); + process.stdout.write('\n') + process.exit(0) } // ─── getopt 风格的参数解析器 (参考 src/vlmcs.c 中的参数处理) ──────────────── -interface ParsedOpt { opt: string; arg: string | null; } +interface ParsedOpt { + opt: string + arg: string | null +} -function parseArgs(argv: string[]): { opts: ParsedOpt[]; positional: string[] } { - const opts: ParsedOpt[] = []; - const positional: string[] = []; - const requiresArg = 'NBijlaskcwrntgGoK'; - let i = 0; +function parseArgs(argv: string[]): { + opts: ParsedOpt[] + positional: string[] +} { + const opts: ParsedOpt[] = [] + const positional: string[] = [] + const requiresArg = 'NBijlaskcwrntgGoK' + let i = 0 while (i < argv.length) { - const arg = argv[i]; - if (arg === '--') { i++; positional.push(...argv.slice(i)); break; } + const arg = argv[i] + if (arg === '--') { + i++ + positional.push(...argv.slice(i)) + break + } if (arg.startsWith('-') && arg.length > 1 && arg[1] !== '-') { - const optChar = arg[1]; + const optChar = arg[1] if (requiresArg.includes(optChar)) { - const optArg = arg.length > 2 ? arg.substring(2) : argv[++i]; - opts.push({ opt: optChar, arg: optArg || null }); + const optArg = arg.length > 2 ? arg.substring(2) : argv[++i] + opts.push({ opt: optChar, arg: optArg || null }) } else { // May have multiple flags: -v4m etc. for (let j = 1; j < arg.length; j++) { - const c = arg[j]; + const c = arg[j] if (requiresArg.includes(c)) { - const optArg = j + 1 < arg.length ? arg.substring(j + 1) : argv[++i]; - opts.push({ opt: c, arg: optArg || null }); - break; + const optArg = j + 1 < arg.length ? arg.substring(j + 1) : argv[++i] + opts.push({ opt: c, arg: optArg || null }) + break } else { - opts.push({ opt: c, arg: null }); + opts.push({ opt: c, arg: null }) } } } } else { - positional.push(arg); + positional.push(arg) } - i++; + i++ } - return { opts, positional }; + return { opts, positional } } /** 根据选中的产品设置默认参数(版本号、计数策略、GUID),参考 src/vlmcs.c */ function setProductDefaults(): void { - const sku = KmsData.skuItems[activeProductIndex]; - majorVersion = sku.protocolVersion; - nCountPolicy = sku.nCountPolicy; - skuGuid = guidToBuffer(stringToGuidLE(sku.guid)!); - kmsGuid = guidToBuffer(stringToGuidLE(KmsData.kmsItems[sku.kmsIndex].guid)!); - appGuid = guidToBuffer(stringToGuidLE(KmsData.appItems[sku.appIndex].guid)!); + const sku = KmsData.skuItems[activeProductIndex] + majorVersion = sku.protocolVersion + nCountPolicy = sku.nCountPolicy + skuGuid = guidToBuffer(stringToGuidLE(sku.guid)!) + kmsGuid = guidToBuffer(stringToGuidLE(KmsData.kmsItems[sku.kmsIndex].guid)!) + appGuid = guidToBuffer(stringToGuidLE(KmsData.appItems[sku.appIndex].guid)!) } /** @@ -235,82 +313,99 @@ function setProductDefaults(): void { * 参考: src/vlmcs.c 中的 CreateRequest() */ function buildRequest(): Buffer { - const buf = Buffer.alloc(260); // Enough for V6 request + const buf = Buffer.alloc(260) // Enough for V6 request // Version - buf.writeUInt16LE(minorVersion, 0); - buf.writeUInt16LE(majorVersion, 2); + buf.writeUInt16LE(minorVersion, 0) + buf.writeUInt16LE(majorVersion, 2) // VMInfo - buf.writeUInt32LE(vmInfo ? 1 : 0, 4); + buf.writeUInt32LE(vmInfo ? 1 : 0, 4) // LicenseStatus - buf.writeUInt32LE(licenseStatus, 8); + buf.writeUInt32LE(licenseStatus, 8) // BindingExpiration - buf.writeUInt32LE(bindingExpiration, 12); + buf.writeUInt32LE(bindingExpiration, 12) // AppID - appGuid.copy(buf, 16); + appGuid.copy(buf, 16) // ActID (SkuGuid) - skuGuid.copy(buf, 32); + skuGuid.copy(buf, 32) // KMSID - kmsGuid.copy(buf, 48); + kmsGuid.copy(buf, 48) // CMID if (cmidStr) { - const g = parseGuidArg(cmidStr); - g.copy(buf, 64); + const g = parseGuidArg(cmidStr) + g.copy(buf, 64) } else { - const rnd = get16RandomBytes(); - rnd.copy(buf, 64); + const rnd = get16RandomBytes() + rnd.copy(buf, 64) // Set UUID v4 bits - buf[64 + 8] = (buf[64 + 8] & 0x3F) | 0x80; - const d3 = buf.readUInt16LE(64 + 6); - buf.writeUInt16LE((d3 & 0x0FFF) | 0x4000, 64 + 6); + buf[64 + 8] = (buf[64 + 8] & 0x3f) | 0x80 + const d3 = buf.readUInt16LE(64 + 6) + buf.writeUInt16LE((d3 & 0x0fff) | 0x4000, 64 + 6) } // N_Policy - buf.writeUInt32LE(nCountPolicy, 80); + buf.writeUInt32LE(nCountPolicy, 80) // ClientTime - const ft = unixTimeToFileTime(); - ft.copy(buf, 84); + const ft = unixTimeToFileTime() + ft.copy(buf, 84) // CMID_prev if (cmidPrevStr) { - const g = parseGuidArg(cmidPrevStr); - g.copy(buf, 92); + const g = parseGuidArg(cmidPrevStr) + g.copy(buf, 92) } else { - buf.fill(0, 92, 108); + buf.fill(0, 92, 108) } // WorkstationName if (workstationName) { - const ws = utf8ToUcs2(workstationName.substring(0, 63), WORKSTATION_NAME_BUFFER); - ws.copy(buf, 108); + const ws = utf8ToUcs2( + workstationName.substring(0, 63), + WORKSTATION_NAME_BUFFER + ) + ws.copy(buf, 108) } else if (dnsnames) { - const first = DnsNames.first[Math.floor(Math.random() * DnsNames.first.length)]; - const second = DnsNames.second[Math.floor(Math.random() * DnsNames.second.length)]; - const tld = DnsNames.tld[Math.floor(Math.random() * DnsNames.tld.length)]; - const name = first + second + tld; - const ws = utf8ToUcs2(name, WORKSTATION_NAME_BUFFER); - ws.copy(buf, 108); + const first = + DnsNames.first[Math.floor(Math.random() * DnsNames.first.length)] + const second = + DnsNames.second[Math.floor(Math.random() * DnsNames.second.length)] + const tld = DnsNames.tld[Math.floor(Math.random() * DnsNames.tld.length)] + const name = first + second + tld + const ws = utf8ToUcs2(name, WORKSTATION_NAME_BUFFER) + ws.copy(buf, 108) } else { - const size = Math.floor(Math.random() * 14) + 1; - let name = ''; + const size = Math.floor(Math.random() * 14) + 1 + let name = '' for (let i = 0; i < size; i++) { - name += alphanum[Math.floor(Math.random() * alphanum.length)]; + name += alphanum[Math.floor(Math.random() * alphanum.length)] } - const ws = utf8ToUcs2(name, WORKSTATION_NAME_BUFFER); - ws.copy(buf, 108); + const ws = utf8ToUcs2(name, WORKSTATION_NAME_BUFFER) + ws.copy(buf, 108) } - return buf.subarray(0, 236); // REQUEST is 236 bytes + return buf.subarray(0, 236) // REQUEST is 236 bytes } /** 建立 TCP 连接并执行 RPC 绑定,参考 src/vlmcs.c 中的连接逻辑 */ -async function connectRpc(sock: net.Socket | null): Promise<{ sock: net.Socket }> { - const s = await connectToAddress(remoteAddr, addressFamily, remoteAddr.startsWith('.') || remoteAddr === '-'); - if (verbose) process.stdout.write('\nPerforming RPC bind ...\n'); - const bindResult = await rpcBindClient(s, verbose, useClientRpcNDR64, useClientRpcBTFN, useMultiplexedRpc); +async function connectRpc( + sock: net.Socket | null +): Promise<{ sock: net.Socket }> { + const s = await connectToAddress( + remoteAddr, + addressFamily, + remoteAddr.startsWith('.') || remoteAddr === '-' + ) + if (verbose) process.stdout.write('\nPerforming RPC bind ...\n') + const bindResult = await rpcBindClient( + s, + verbose, + useClientRpcNDR64, + useClientRpcBTFN, + useMultiplexedRpc + ) if (bindResult.status) { - errorout('Fatal: Could not bind RPC\n'); - process.exit(bindResult.status); + errorout('Fatal: Could not bind RPC\n') + process.exit(bindResult.status) } - rpcFlags = bindResult.rpcFlags; - if (verbose) process.stdout.write('... successful\n'); - return { sock: s }; + rpcFlags = bindResult.rpcFlags + if (verbose) process.stdout.write('... successful\n') + return { sock: s } } /** @@ -318,41 +413,72 @@ async function connectRpc(sock: net.Socket | null): Promise<{ sock: net.Socket } * 参考: src/vlmcs.c 中的 displayResponse() */ function displayResponse( - result: ResponseResult, response: ParsedResponse, hwid: Buffer + result: ResponseResult, + response: ParsedResponse, + hwid: Buffer ): void { - if (!result.rpcOK) errorout('\n\x07ERROR: Non-Zero RPC result code.\n'); - if (!result.decryptSuccess) errorout('\n\x07ERROR: Decryption of V5/V6 response failed.\n'); - if (!result.ivsOK) errorout('\n\x07ERROR: AES CBC initialization vectors (IVs) of request and response do not match.\n'); - if (!result.pidLengthOK) errorout('\n\x07ERROR: The length of the PID is not valid.\n'); - if (!result.hashOK) errorout('\n\x07ERROR: Computed hash does not match hash in response.\n'); - if (!result.clientMachineIDOK) errorout('\n\x07ERROR: Client machine GUIDs of request and response do not match.\n'); - if (!result.timeStampOK) errorout('\n\x07ERROR: Time stamps of request and response do not match.\n'); - if (!result.versionOK) errorout('\n\x07ERROR: Protocol versions of request and response do not match.\n'); - if (!result.hmacSha256OK) errorout('\n\x07ERROR: Keyed-Hash Message Authentication Code (HMAC) is incorrect.\n'); - if (!result.ivNotSuspicious) errorout('\nWARNING: The KMS server is an emulator because the response uses an IV following KMSv5 rules in KMSv6 protocol.\n'); + if (!result.rpcOK) errorout('\n\x07ERROR: Non-Zero RPC result code.\n') + if (!result.decryptSuccess) + errorout('\n\x07ERROR: Decryption of V5/V6 response failed.\n') + if (!result.ivsOK) + errorout( + '\n\x07ERROR: AES CBC initialization vectors (IVs) of request and response do not match.\n' + ) + if (!result.pidLengthOK) + errorout('\n\x07ERROR: The length of the PID is not valid.\n') + if (!result.hashOK) + errorout('\n\x07ERROR: Computed hash does not match hash in response.\n') + if (!result.clientMachineIDOK) + errorout( + '\n\x07ERROR: Client machine GUIDs of request and response do not match.\n' + ) + if (!result.timeStampOK) + errorout('\n\x07ERROR: Time stamps of request and response do not match.\n') + if (!result.versionOK) + errorout( + '\n\x07ERROR: Protocol versions of request and response do not match.\n' + ) + if (!result.hmacSha256OK) + errorout( + '\n\x07ERROR: Keyed-Hash Message Authentication Code (HMAC) is incorrect.\n' + ) + if (!result.ivNotSuspicious) + errorout( + '\nWARNING: The KMS server is an emulator because the response uses an IV following KMSv5 rules in KMSv6 protocol.\n' + ) if (result.effectiveResponseSize !== result.correctResponseSize) { - errorout(`\n\x07WARNING: Size of RPC payload (KMS Message) should be ${result.correctResponseSize} but is ${result.effectiveResponseSize}.`); + errorout( + `\n\x07WARNING: Size of RPC payload (KMS Message) should be ${result.correctResponseSize} but is ${result.effectiveResponseSize}.` + ) } // Check RPC level - if (!rpcFlags.hasNDR32) errorout('\nWARNING: Server\'s RPC protocol does not support NDR32.\n'); - if (useClientRpcBTFN && useClientRpcNDR64 && rpcFlags.hasNDR64 && !rpcFlags.hasBTFN) - errorout('\nWARNING: Server\'s RPC protocol has NDR64 but no BTFN.\n'); + if (!rpcFlags.hasNDR32) + errorout("\nWARNING: Server's RPC protocol does not support NDR32.\n") + if ( + useClientRpcBTFN && + useClientRpcNDR64 && + rpcFlags.hasNDR64 && + !rpcFlags.hasBTFN + ) + errorout("\nWARNING: Server's RPC protocol has NDR64 but no BTFN.\n") - if (!result.decryptSuccess) return; + if (!result.decryptSuccess) return - const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE); + const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE) if (!verbose) { - process.stdout.write(` -> ${ePID}`); + process.stdout.write(` -> ${ePID}`) if (response.majorVer > 5) { - const hwidHex = Array.from(hwid.subarray(0, 8)).map(b => b.toString(16).toUpperCase().padStart(2, '0')).join(''); - process.stdout.write(` (${hwidHex})`); + const hwidHex = Array.from(hwid.subarray(0, 8)) + .map(b => b.toString(16).toUpperCase().padStart(2, '0')) + .join('') + process.stdout.write(` (${hwidHex})`) } - process.stdout.write('\n'); + process.stdout.write('\n') } else { - logResponseVerbose(ePID, hwid, response, result.effectiveResponseSize); + logResponseVerbose(ePID, hwid, response, result.effectiveResponseSize) } } @@ -362,75 +488,127 @@ function displayResponse( * 参考: src/vlmcs.c 中的 SendActivationRequest() */ async function sendActivationRequest( - sock: net.Socket, requestBase: Buffer -): Promise<{ status: number; response: ParsedResponse; result: ResponseResult; hwid: Buffer }> { - let request: Buffer; - const majorVer = requestBase.readUInt16LE(2); + sock: net.Socket, + requestBase: Buffer +): Promise<{ + status: number + response: ParsedResponse + result: ResponseResult + hwid: Buffer +}> { + let request: Buffer + const majorVer = requestBase.readUInt16LE(2) if (majorVer < 5) { - request = createRequestV4(requestBase); + request = createRequestV4(requestBase) } else { - request = createRequestV6(requestBase); + request = createRequestV6(requestBase) } - const rpcResult = await rpcSendRequest(sock, request, rpcFlags, useClientRpcNDR64, firstPacketSent); + const rpcResult = await rpcSendRequest( + sock, + request, + rpcFlags, + useClientRpcNDR64, + firstPacketSent + ) if (rpcResult.status === 0 && rpcResult.kmsResponse) { - const rawResponse = rpcResult.kmsResponse; - const responseMajorVer = rawResponse.readUInt16LE(2); + const rawResponse = rpcResult.kmsResponse + const responseMajorVer = rawResponse.readUInt16LE(2) - let response: ParsedResponse; - let result: ResponseResult; - let hwid = Buffer.alloc(8); + let response: ParsedResponse + let result: ResponseResult + let hwid = Buffer.alloc(8) if (responseMajorVer === 4) { - const v4Result = decryptResponseV4(rawResponse, request); - response = v4Result.response; - result = v4Result.result; + const v4Result = decryptResponseV4(rawResponse, request) + response = v4Result.response + result = v4Result.result } else { - const v6Result = decryptResponseV6(rawResponse, request); - response = v6Result.response; - result = v6Result.result; - hwid = Buffer.from(v6Result.hwid); + const v6Result = decryptResponseV6(rawResponse, request) + response = v6Result.response + result = v6Result.result + hwid = Buffer.from(v6Result.hwid) } - result.rpcOK = true; - firstPacketSent = true; - return { status: 0, response, result, hwid }; + result.rpcOK = true + firstPacketSent = true + return { status: 0, response, result, hwid } } - firstPacketSent = true; + firstPacketSent = true const emptyResult: ResponseResult = { - mask: 0, hashOK: false, timeStampOK: false, clientMachineIDOK: false, - versionOK: false, ivsOK: false, decryptSuccess: false, hmacSha256OK: false, - pidLengthOK: false, rpcOK: false, ivNotSuspicious: false, - effectiveResponseSize: 0, correctResponseSize: 0, - }; + mask: 0, + hashOK: false, + timeStampOK: false, + clientMachineIDOK: false, + versionOK: false, + ivsOK: false, + decryptSuccess: false, + hmacSha256OK: false, + pidLengthOK: false, + rpcOK: false, + ivNotSuspicious: false, + effectiveResponseSize: 0, + correctResponseSize: 0 + } const emptyResponse: ParsedResponse = { - majorVer: 0, minorVer: 0, pidSize: 0, kmsPID: Buffer.alloc(0), - cmid: Buffer.alloc(16), clientTime: Buffer.alloc(8), count: 0, - vlActivationInterval: 0, vlRenewalInterval: 0, - }; - return { status: rpcResult.status, response: emptyResponse, result: emptyResult, hwid: Buffer.alloc(8) }; + majorVer: 0, + minorVer: 0, + pidSize: 0, + kmsPID: Buffer.alloc(0), + cmid: Buffer.alloc(16), + clientTime: Buffer.alloc(8), + count: 0, + vlActivationInterval: 0, + vlRenewalInterval: 0 + } + return { + status: rpcResult.status, + response: emptyResponse, + result: emptyResult, + hwid: Buffer.alloc(8) + } } /** 显示请求错误信息,参考 src/vlmcs.c 中的错误处理 */ -function displayRequestError(status: number, currentRequest: number, totalRequests: number): void { - errorout(`\nError 0x${(status >>> 0).toString(16).toUpperCase().padStart(8, '0')} while sending request ${currentRequest} of ${totalRequests}\n`); +function displayRequestError( + status: number, + currentRequest: number, + totalRequests: number +): void { + errorout( + `\nError 0x${(status >>> 0).toString(16).toUpperCase().padStart(8, '0')} while sending request ${currentRequest} of ${totalRequests}\n` + ) switch (status) { - case 0xC004F042: errorout('The KMS server has declined to activate the requested product\n'); break; - case 0x8007000D: errorout('The KMS host you are using is unable to handle your product. It only supports legacy versions\n'); break; - case 0xC004F06C: errorout('The time stamp differs too much from the KMS server time\n'); break; - case 0xC004D104: errorout('The security processor reported that invalid data was used\n'); break; - case 1: errorout('An RPC protocol error has occured\n'); break; + case 0xc004f042: + errorout( + 'The KMS server has declined to activate the requested product\n' + ) + break + case 0x8007000d: + errorout( + 'The KMS host you are using is unable to handle your product. It only supports legacy versions\n' + ) + break + case 0xc004f06c: + errorout('The time stamp differs too much from the KMS server time\n') + break + case 0xc004d104: + errorout('The security processor reported that invalid data was used\n') + break + case 1: + errorout('An RPC protocol error has occured\n') + break } } /** 主函数 — 解析命令行参数并执行激活请求,参考 src/vlmcs.c 中的 main() */ async function main(): Promise { - const argv = process.argv.slice(2); - const programName = 'vlmcs'; - const { opts, positional } = parseArgs(argv); + const argv = process.argv.slice(2) + const programName = 'vlmcs' + const { opts, positional } = parseArgs(argv) // Pass 0: handle -j for (const o of opts) { @@ -440,300 +618,371 @@ async function main(): Promise { } // Determine host - let useDefaultHost = true; + let useDefaultHost = true if (positional.length > 0) { - remoteAddr = positional[0]; - useDefaultHost = false; + remoteAddr = positional[0] + useDefaultHost = false } // Pass 1: handle -l for (const o of opts) { if (o.opt === 'l' && o.arg) { - const num = stringToInt(o.arg, 1, KmsData.skuItems.length); + const num = stringToInt(o.arg, 1, KmsData.skuItems.length) if (num !== null) { - activeProductIndex = num - 1; + activeProductIndex = num - 1 } else { const idx = KmsData.skuItems.findIndex( s => s.name.toLowerCase() === o.arg!.toLowerCase() - ); + ) if (idx < 0) { - errorout(`Invalid client application. "${o.arg}" is not valid for -l.\n\n`); - showProducts(); + errorout( + `Invalid client application. "${o.arg}" is not valid for -l.\n\n` + ) + showProducts() } - activeProductIndex = idx; + activeProductIndex = idx } - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI } } - setProductDefaults(); + setProductDefaults() // Pass 2: handle all other options for (const o of opts) { switch (o.opt) { - case 'h': case '?': showHelp(programName); - case 'e': showExamples(programName); - case 'x': showProducts(); + case 'h': + case '?': + showHelp(programName) + case 'e': + showExamples(programName) + case 'x': + showProducts() case 'V': - process.stdout.write(`vlmcs ${VERSION} ${process.arch === 'x64' ? '64' : '32'}-bit\n`); - printPlatform(); - printCommonFlags(); - printClientFlags(); - process.exit(0); - case 'v': verbose = true; break; - case 'm': vmInfo = true; break; - case 'd': dnsnames = false; break; - case 'T': reconnectForEachRequest = true; break; - case 'P': break; // DNS SRV 优先级(未实现,仅接受参数) - case 'p': useMultiplexedRpc = false; break; - case '4': case '5': case '6': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - majorVersion = parseInt(o.opt); - minorVersion = 0; - break; + process.stdout.write( + `vlmcs ${VERSION} ${process.arch === 'x64' ? '64' : '32'}-bit\n` + ) + printPlatform() + printCommonFlags() + printClientFlags() + process.exit(0) + case 'v': + verbose = true + break + case 'm': + vmInfo = true + break + case 'd': + dnsnames = false + break + case 'T': + reconnectForEachRequest = true + break + case 'P': + break // DNS SRV 优先级(未实现,仅接受参数) + case 'p': + useMultiplexedRpc = false + break + case '4': + case '5': + case '6': + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + majorVersion = parseInt(o.opt) + minorVersion = 0 + break case 'N': if (o.arg) { - const r = getArgumentBool(o.arg); - if (r === null) showHelp(programName); - useClientRpcNDR64 = r!; + const r = getArgumentBool(o.arg) + if (r === null) showHelp(programName) + useClientRpcNDR64 = r! } - break; + break case 'B': if (o.arg) { - const r = getArgumentBool(o.arg); - if (r === null) showHelp(programName); - useClientRpcBTFN = r!; + const r = getArgumentBool(o.arg) + if (r === null) showHelp(programName) + useClientRpcBTFN = r! } - break; + break case 'i': if (o.arg) { - const v = parseInt(o.arg); - if (v === 4) addressFamily = 4; - else if (v === 6) addressFamily = 6; - else { errorout('IPv5 does not exist.\n'); process.exit(22); } + const v = parseInt(o.arg) + if (v === 4) addressFamily = 4 + else if (v === 6) addressFamily = 6 + else { + errorout('IPv5 does not exist.\n') + process.exit(22) + } } - break; + break case 'n': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - if (o.arg) fixedRequests = parseInt(o.arg) || 1; - break; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + if (o.arg) fixedRequests = parseInt(o.arg) || 1 + break case 'r': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - if (o.arg) nCountPolicy = parseInt(o.arg) || 0; - break; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + if (o.arg) nCountPolicy = parseInt(o.arg) || 0 + break case 'c': - if (!fixedRequests) fixedRequests = 1; - cmidStr = o.arg; - break; - case 'o': cmidPrevStr = o.arg; break; + if (!fixedRequests) fixedRequests = 1 + cmidStr = o.arg + break + case 'o': + cmidPrevStr = o.arg + break case 'a': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - if (o.arg) appGuid = parseGuidArg(o.arg); - break; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + if (o.arg) appGuid = parseGuidArg(o.arg) + break case 's': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - if (o.arg) skuGuid = parseGuidArg(o.arg); - break; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + if (o.arg) skuGuid = parseGuidArg(o.arg) + break case 'k': - incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI; - if (o.arg) kmsGuid = parseGuidArg(o.arg); - break; + incompatibleOptions |= VLMCS_OPTION_NO_GRAB_INI + if (o.arg) kmsGuid = parseGuidArg(o.arg) + break case 'K': if (o.arg) { - const parts = o.arg.split('.'); - if (parts.length !== 2) { errorout('Fatal: Protocol version must be in the format #.#\n'); process.exit(22); } - majorVersion = parseInt(parts[0]) || 0; - minorVersion = parseInt(parts[1]) || 0; + const parts = o.arg.split('.') + if (parts.length !== 2) { + errorout('Fatal: Protocol version must be in the format #.#\n') + process.exit(22) + } + majorVersion = parseInt(parts[0]) || 0 + minorVersion = parseInt(parts[1]) || 0 } - break; + break case 'w': - workstationName = o.arg; + workstationName = o.arg if (workstationName && workstationName.length > 63) { - errorout(`\x07WARNING! Truncating workstation name to 63 characters (${workstationName}).\n`); + errorout( + `\x07WARNING! Truncating workstation name to 63 characters (${workstationName}).\n` + ) } - break; + break case 't': if (o.arg) { - licenseStatus = parseInt(o.arg) || 0; - if (licenseStatus > 6) errorout('Warning: Correct license status is 0 <= license status <= 6.\n'); + licenseStatus = parseInt(o.arg) || 0 + if (licenseStatus > 6) + errorout( + 'Warning: Correct license status is 0 <= license status <= 6.\n' + ) } - break; + break case 'g': - if (o.arg) bindingExpiration = parseInt(o.arg) || 0; - break; + if (o.arg) bindingExpiration = parseInt(o.arg) || 0 + break case 'G': - incompatibleOptions |= VLMCS_OPTION_GRAB_INI; - fnIniClient = o.arg; - break; - case 'l': case 'j': break; // Already handled + incompatibleOptions |= VLMCS_OPTION_GRAB_INI + fnIniClient = o.arg + break + case 'l': + case 'j': + break // Already handled } } - if ((incompatibleOptions & (VLMCS_OPTION_NO_GRAB_INI | VLMCS_OPTION_GRAB_INI)) === - (VLMCS_OPTION_NO_GRAB_INI | VLMCS_OPTION_GRAB_INI)) { - showHelp(programName); + if ( + (incompatibleOptions & + (VLMCS_OPTION_NO_GRAB_INI | VLMCS_OPTION_GRAB_INI)) === + (VLMCS_OPTION_NO_GRAB_INI | VLMCS_OPTION_GRAB_INI) + ) { + showHelp(programName) } if (useDefaultHost) { - remoteAddr = addressFamily === 6 ? '[::1]' : '127.0.0.1'; + remoteAddr = addressFamily === 6 ? '[::1]' : '127.0.0.1' } try { if (fnIniClient !== null) { - await grabServerData(); + await grabServerData() } else { - await runNormalMode(); + await runNormalMode() } } catch (err: any) { - errorout(`Fatal: ${err.message || err}\n`); - process.exit(1); + errorout(`Fatal: ${err.message || err}\n`) + process.exit(1) } } /** 普通激活模式 — 发送一个或多个激活请求,参考 src/vlmcs.c */ async function runNormalMode(): Promise { - let sock: net.Socket | null = null; - let requests = 0; - let requestsToGo = nCountPolicy === 1 ? 1 : nCountPolicy - 1; - let firstRequestSentLocal = false; + let sock: net.Socket | null = null + let requests = 0 + let requestsToGo = nCountPolicy === 1 ? 1 : nCountPolicy - 1 + let firstRequestSentLocal = false while (requestsToGo > 0) { - const requestBase = buildRequest(); + const requestBase = buildRequest() - if (verbose) logRequestVerbose(requestBase); + if (verbose) logRequestVerbose(requestBase) if (!sock) { - const conn = await connectRpc(null); - sock = conn.sock; + const conn = await connectRpc(null) + sock = conn.sock } else { - const disconnected = isDisconnected(sock); + const disconnected = isDisconnected(sock) if (disconnected) { - errorout('\nWarning: Server closed RPC connection (probably non-multitasked KMS emulator)\n'); + errorout( + '\nWarning: Server closed RPC connection (probably non-multitasked KMS emulator)\n' + ) } if (reconnectForEachRequest || disconnected) { - sock.destroy(); - const conn = await connectRpc(null); - sock = conn.sock; + sock.destroy() + const conn = await connectRpc(null) + sock = conn.sock } } - process.stdout.write(`Sending activation request (KMS V${majorVersion}) `); + process.stdout.write(`Sending activation request (KMS V${majorVersion}) `) - const { status, response, result, hwid } = await sendActivationRequest(sock, requestBase); + const { status, response, result, hwid } = await sendActivationRequest( + sock, + requestBase + ) - if (fixedRequests) requestsToGo = fixedRequests - requests - 1; + if (fixedRequests) requestsToGo = fixedRequests - requests - 1 if (status) { - displayRequestError(status, requests + 1, requestsToGo + requests + 1); - if (!fixedRequests) requestsToGo = 0; + displayRequestError(status, requests + 1, requestsToGo + requests + 1) + if (!fixedRequests) requestsToGo = 0 } else { if (!fixedRequests) { - if (firstRequestSentLocal && nCountPolicy - response.count >= requestsToGo) { - errorout('\nThe KMS server does not increment it\'s active clients. Aborting...\n'); - requestsToGo = 0; + if ( + firstRequestSentLocal && + nCountPolicy - response.count >= requestsToGo + ) { + errorout( + "\nThe KMS server does not increment it's active clients. Aborting...\n" + ) + requestsToGo = 0 } else { - requestsToGo = nCountPolicy - response.count; - if (requestsToGo < 0) requestsToGo = 0; + requestsToGo = nCountPolicy - response.count + if (requestsToGo < 0) requestsToGo = 0 } } - process.stdout.write(`${requests + 1} of ${requestsToGo + requests + 1} `); - displayResponse(result, response, hwid); - firstRequestSentLocal = true; + process.stdout.write(`${requests + 1} of ${requestsToGo + requests + 1} `) + displayResponse(result, response, hwid) + firstRequestSentLocal = true } - requests++; + requests++ } - if (sock) sock.destroy(); + if (sock) sock.destroy() } /** -G 模式 — 获取服务器所有 CSVLK 组的 ePID/HwId 数据,参考 src/vlmcs.c 中的 grabServerData() */ async function grabServerData(): Promise { - let sock: net.Socket | null = null; - let currentMajorVer = 6; - const fs = await import('fs'); - const lines: string[] = []; + let sock: net.Socket | null = null + let currentMajorVer = 6 + const fs = await import('fs') + const lines: string[] = [] for (let i = 0; i < KmsData.csvlkData.length && currentMajorVer > 3; i++) { // Find a KMS item with this EPid index - let kmsIdx = -1; + let kmsIdx = -1 for (let j = 0; j < KmsData.kmsItems.length; j++) { - if (KmsData.kmsItems[j].ePidIndex === i) { kmsIdx = j; break; } + if (KmsData.kmsItems[j].ePidIndex === i) { + kmsIdx = j + break + } + } + if (kmsIdx < 0) { + lines.push('') + continue } - if (kmsIdx < 0) { lines.push(''); continue; } // Find a SKU item with this kms index - let skuIdx = -1; + let skuIdx = -1 for (let j = KmsData.skuItems.length - 1; j >= 0; j--) { - if (KmsData.skuItems[j].kmsIndex === kmsIdx) { skuIdx = j; break; } + if (KmsData.skuItems[j].kmsIndex === kmsIdx) { + skuIdx = j + break + } + } + if (skuIdx < 0) { + lines.push('') + continue } - if (skuIdx < 0) { lines.push(''); continue; } - const sku = KmsData.skuItems[skuIdx]; - activeProductIndex = skuIdx; - nCountPolicy = sku.nCountPolicy; - skuGuid = guidToBuffer(stringToGuidLE(sku.guid)!); - kmsGuid = guidToBuffer(stringToGuidLE(KmsData.kmsItems[sku.kmsIndex].guid)!); - appGuid = guidToBuffer(stringToGuidLE(KmsData.appItems[sku.appIndex].guid)!); - majorVersion = currentMajorVer; - minorVersion = 0; + const sku = KmsData.skuItems[skuIdx] + activeProductIndex = skuIdx + nCountPolicy = sku.nCountPolicy + skuGuid = guidToBuffer(stringToGuidLE(sku.guid)!) + kmsGuid = guidToBuffer(stringToGuidLE(KmsData.kmsItems[sku.kmsIndex].guid)!) + appGuid = guidToBuffer(stringToGuidLE(KmsData.appItems[sku.appIndex].guid)!) + majorVersion = currentMajorVer + minorVersion = 0 - const requestBase = buildRequest(); - if (verbose) logRequestVerbose(requestBase); + const requestBase = buildRequest() + if (verbose) logRequestVerbose(requestBase) if (!sock) { - const conn = await connectRpc(null); - sock = conn.sock; + const conn = await connectRpc(null) + sock = conn.sock } - process.stdout.write(`Sending activation request (KMS V${majorVersion}) `); + process.stdout.write(`Sending activation request (KMS V${majorVersion}) `) try { - const { status, response, result, hwid } = await sendActivationRequest(sock, requestBase); - const ePidGroup = KmsData.csvlkData[i].ePidGroup; - process.stdout.write(`${ePidGroup.padEnd(11)}`); + const { status, response, result, hwid } = await sendActivationRequest( + sock, + requestBase + ) + const ePidGroup = KmsData.csvlkData[i].ePidGroup + process.stdout.write(`${ePidGroup.padEnd(11)}`) if (status) { - displayRequestError(status, i + 1, KmsData.csvlkData.length); - if (status === 1) break; - if ((status & 0xF0000000) === 0x80000000) { currentMajorVer--; i--; } - lines.push(''); - continue; + displayRequestError(status, i + 1, KmsData.csvlkData.length) + if (status === 1) break + if ((status & 0xf0000000) === 0x80000000) { + currentMajorVer-- + i-- + } + lines.push('') + continue } - process.stdout.write(`${i + 7 - currentMajorVer} of ${KmsData.csvlkData.length + 6 - currentMajorVer}`); - displayResponse(result, response, hwid); + process.stdout.write( + `${i + 7 - currentMajorVer} of ${KmsData.csvlkData.length + 6 - currentMajorVer}` + ) + displayResponse(result, response, hwid) - const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE); - let line = `${ePidGroup} = ${ePID}`; + const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE) + let line = `${ePidGroup} = ${ePID}` if (response.majorVer > 5) { - const hwidHex = Array.from(hwid.subarray(0, 8)).map(b => b.toString(16).padStart(2, '0').toUpperCase()).join(' '); - line += ` / ${hwidHex}`; + const hwidHex = Array.from(hwid.subarray(0, 8)) + .map(b => b.toString(16).padStart(2, '0').toUpperCase()) + .join(' ') + line += ` / ${hwidHex}` } - lines.push(line); + lines.push(line) } catch (err: any) { - errorout(`\nError: ${err.message}\n`); - lines.push(''); + errorout(`\nError: ${err.message}\n`) + lines.push('') } } // Write output if (fnIniClient === '-') { - process.stdout.write('\n'); + process.stdout.write('\n') for (const line of lines) { - if (line) process.stdout.write(line + '\n'); + if (line) process.stdout.write(line + '\n') } } else if (fnIniClient) { - const content = lines.filter(l => l).join('\n') + '\n'; - fs.writeFileSync(fnIniClient, content); - process.stdout.write(`\nCreating ${fnIniClient}\n`); + const content = lines.filter(l => l).join('\n') + '\n' + fs.writeFileSync(fnIniClient, content) + process.stdout.write(`\nCreating ${fnIniClient}\n`) } - if (sock) sock.destroy(); + if (sock) sock.destroy() } -main().catch((err) => { - errorout(`Fatal: ${err.message || err}\n`); - process.exit(1); -}); +main().catch(err => { + errorout(`Fatal: ${err.message || err}\n`) + process.exit(1) +}) diff --git a/node-vlmcs/src/crypto.ts b/node-vlmcs/src/crypto.ts index 5615b3d7..7b4f7b89 100644 --- a/node-vlmcs/src/crypto.ts +++ b/node-vlmcs/src/crypto.ts @@ -8,232 +8,250 @@ * - src/crypto.h (AES 常量和接口定义) */ -import * as crypto from 'crypto'; +import * as crypto from 'crypto' // ─── 常量定义 (参考 src/crypto.h) ────────────────────────────────────────── /** AES 块大小: 16 字节 = 128 位 */ -export const AES_BLOCK_BYTES = 16; +export const AES_BLOCK_BYTES = 16 /** AES 密钥大小: 16 字节 = 128 位 (AES-128) */ -export const AES_KEY_BYTES = 16; +export const AES_KEY_BYTES = 16 /** V4 密钥大小: 20 字节 (前 16 字节为 AES 密钥,后 4 字节用于 CMAC) */ -export const V4_KEY_BYTES = 20; +export const V4_KEY_BYTES = 20 /** AES 块中的 32 位字数 */ -const AES_BLOCK_WORDS = AES_BLOCK_BYTES >>> 2; +const AES_BLOCK_WORDS = AES_BLOCK_BYTES >>> 2 // ─── AES 密钥 (参考 src/crypto.c) ────────────────────────────────────────── /** V4 协议密钥 (20 字节),用于 AES-CMAC 计算 */ export const AesKeyV4 = Buffer.from([ - 0x05, 0x3D, 0x83, 0x07, 0xF9, 0xE5, 0xF0, 0x88, - 0xEB, 0x5E, 0xA6, 0x68, 0x6C, 0xF0, 0x37, 0xC7, - 0xE4, 0xEF, 0xD2, 0xD6 -]); + 0x05, 0x3d, 0x83, 0x07, 0xf9, 0xe5, 0xf0, 0x88, 0xeb, 0x5e, 0xa6, 0x68, 0x6c, + 0xf0, 0x37, 0xc7, 0xe4, 0xef, 0xd2, 0xd6 +]) /** V5 协议密钥 (16 字节),用于 AES-CBC 加密/解密 */ export const AesKeyV5 = Buffer.from([ - 0xCD, 0x7E, 0x79, 0x6F, 0x2A, 0xB2, 0x5D, 0xCB, - 0x55, 0xFF, 0xC8, 0xEF, 0x83, 0x64, 0xC4, 0x70 -]); + 0xcd, 0x7e, 0x79, 0x6f, 0x2a, 0xb2, 0x5d, 0xcb, 0x55, 0xff, 0xc8, 0xef, 0x83, + 0x64, 0xc4, 0x70 +]) /** V6 协议密钥 (16 字节),用于 AES-CBC 加密/解密,密钥扩展时有额外 XOR 修改 */ export const AesKeyV6 = Buffer.from([ - 0xA9, 0x4A, 0x41, 0x95, 0xE2, 0x01, 0x43, 0x2D, - 0x9B, 0xCB, 0x46, 0x04, 0x05, 0xD8, 0x4A, 0x21 -]); + 0xa9, 0x4a, 0x41, 0x95, 0xe2, 0x01, 0x43, 0x2d, 0x9b, 0xcb, 0x46, 0x04, 0x05, + 0xd8, 0x4a, 0x21 +]) // ─── AES S-Box (参考 src/crypto_internal.c) ──────────────────────────────── // 标准 Rijndael S-Box 替换表,用于 SubBytes 步骤 const SBox: readonly number[] = [ - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, - 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, - 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, - 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, - 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, - 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, - 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, - 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, - 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, - 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, - 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 -]; + 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, + 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, + 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, + 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, + 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, + 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, + 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, + 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, + 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, + 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, + 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, + 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, + 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, + 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, + 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, + 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, + 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, + 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, + 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, + 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 +] // ─── AES 逆 S-Box ────────────────────────────────────────────────────────── // 用于 InvSubBytes 步骤(解密) const SBoxR: readonly number[] = [ - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, - 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, - 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, - 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, - 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, - 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, - 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, - 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, - 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, - 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, - 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D -]; + 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, + 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, + 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, + 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, + 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, + 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, + 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, + 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, + 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, + 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, + 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, + 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, + 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, + 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, + 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, + 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, + 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, + 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, + 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, + 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d +] // ─── 轮常量 (参考 src/crypto_internal.c 中的 AesRcon) ──────────────────────── // 大端序值,在密钥扩展中通过 BE32 进行字节序转换 const RCon: readonly number[] = [ - 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000 -]; + 0x00000000, 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000 +] // ─── 32 位工具函数 (参考 src/crypto_internal.c) ───────────────────────────── /** 32 位字节序交换(等同于小端系统上的 BE32 宏) */ function be32(v: number): number { - return ( - ((v & 0xFF) << 24) | - ((v & 0xFF00) << 8) | - ((v >>> 8) & 0xFF00) | - ((v >>> 24) & 0xFF) - ) >>> 0; + return ( + (((v & 0xff) << 24) | + ((v & 0xff00) << 8) | + ((v >>> 8) & 0xff00) | + ((v >>> 24) & 0xff)) >>> + 0 + ) } /** 32 位无符号右旋转 */ function ror32(v: number, n: number): number { - return ((v << (32 - n)) | (v >>> n)) >>> 0; + return ((v << (32 - n)) | (v >>> n)) >>> 0 } /** 对 DWORD 的每个字节应用 S-Box 替换(本机小端字节序) */ function subDword(v: number): number { - return ( - SBox[v & 0xFF] | - (SBox[(v >>> 8) & 0xFF] << 8) | - (SBox[(v >>> 16) & 0xFF] << 16) | - (SBox[(v >>> 24) & 0xFF] << 24) - ) >>> 0; + return ( + (SBox[v & 0xff] | + (SBox[(v >>> 8) & 0xff] << 8) | + (SBox[(v >>> 16) & 0xff] << 16) | + (SBox[(v >>> 24) & 0xff] << 24)) >>> + 0 + ) } // ─── GF(2^8) 有限域乘法 (参考 src/crypto_internal.c) ─────────────────────── // 在 32 位打包字上执行 GF(2^8) 乘法,用于 MixColumns 步骤 function mul2(w: number): number { - return (((w & 0x7f7f7f7f) << 1) ^ (((w & 0x80808080) >>> 7) * 0x1b)) >>> 0; + return (((w & 0x7f7f7f7f) << 1) ^ (((w & 0x80808080) >>> 7) * 0x1b)) >>> 0 } function mul3(w: number): number { - return (mul2(w) ^ w) >>> 0; + return (mul2(w) ^ w) >>> 0 } function mul4(w: number): number { - return mul2(mul2(w)); + return mul2(mul2(w)) } function mul8(w: number): number { - return mul2(mul4(w)); + return mul2(mul4(w)) } function mul9(w: number): number { - return (mul8(w) ^ w) >>> 0; + return (mul8(w) ^ w) >>> 0 } function mulB(w: number): number { - return (mul8(w) ^ mul3(w)) >>> 0; + return (mul8(w) ^ mul3(w)) >>> 0 } function mulD(w: number): number { - return (mul8(w) ^ mul4(w) ^ w) >>> 0; + return (mul8(w) ^ mul4(w) ^ w) >>> 0 } function mulE(w: number): number { - return (mul8(w) ^ mul4(w) ^ mul2(w)) >>> 0; + return (mul8(w) ^ mul4(w) ^ mul2(w)) >>> 0 } // ─── AES 块操作 (参考 src/crypto_internal.c) ──────────────────────────────── /** SubBytes: 对块中每个字节执行 S-Box 替换 */ function subBytesBlock(buf: Buffer, off: number): void { - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - buf[off + i] = SBox[buf[off + i]]; - } + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + buf[off + i] = SBox[buf[off + i]] + } } /** InvSubBytes: 对块中每个字节执行逆 S-Box 替换 */ function subBytesRBlock(buf: Buffer, off: number): void { - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - buf[off + i] = SBoxR[buf[off + i]]; - } + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + buf[off + i] = SBoxR[buf[off + i]] + } } /** ShiftRows: 行移位操作 */ function shiftRowsBlock(buf: Buffer, off: number): void { - const tmp = Buffer.allocUnsafe(AES_BLOCK_BYTES); - buf.copy(tmp, 0, off, off + AES_BLOCK_BYTES); - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - buf[off + i] = tmp[(i + ((i & 3) << 2)) & 0xf]; - } + const tmp = Buffer.allocUnsafe(AES_BLOCK_BYTES) + buf.copy(tmp, 0, off, off + AES_BLOCK_BYTES) + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + buf[off + i] = tmp[(i + ((i & 3) << 2)) & 0xf] + } } /** InvShiftRows: 逆行移位操作 */ function shiftRowsRBlock(buf: Buffer, off: number): void { - const tmp = Buffer.allocUnsafe(AES_BLOCK_BYTES); - buf.copy(tmp, 0, off, off + AES_BLOCK_BYTES); - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - buf[off + i] = tmp[(i - ((i & 3) << 2)) & 0xf]; - } + const tmp = Buffer.allocUnsafe(AES_BLOCK_BYTES) + buf.copy(tmp, 0, off, off + AES_BLOCK_BYTES) + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + buf[off + i] = tmp[(i - ((i & 3) << 2)) & 0xf] + } } /** MixColumns: 列混合操作(加密方向) */ function mixColumnsBlock(buf: Buffer, off: number): void { - for (let i = 0; i < AES_BLOCK_WORDS; i++) { - const byteOff = off + i * 4; - const w = buf.readUInt32LE(byteOff); - buf.writeUInt32LE( - (mul2(w) ^ ror32(mul3(w), 8) ^ ror32(w, 16) ^ ror32(w, 24)) >>> 0, - byteOff - ); - } + for (let i = 0; i < AES_BLOCK_WORDS; i++) { + const byteOff = off + i * 4 + const w = buf.readUInt32LE(byteOff) + buf.writeUInt32LE( + (mul2(w) ^ ror32(mul3(w), 8) ^ ror32(w, 16) ^ ror32(w, 24)) >>> 0, + byteOff + ) + } } /** InvMixColumns: 逆列混合操作(解密方向) */ function mixColumnsRBlock(buf: Buffer, off: number): void { - for (let i = 0; i < AES_BLOCK_WORDS; i++) { - const byteOff = off + i * 4; - const w = buf.readUInt32LE(byteOff); - buf.writeUInt32LE( - (mulE(w) ^ ror32(mulB(w), 8) ^ ror32(mulD(w), 16) ^ ror32(mul9(w), 24)) >>> 0, - byteOff - ); - } + for (let i = 0; i < AES_BLOCK_WORDS; i++) { + const byteOff = off + i * 4 + const w = buf.readUInt32LE(byteOff) + buf.writeUInt32LE( + (mulE(w) ^ + ror32(mulB(w), 8) ^ + ror32(mulD(w), 16) ^ + ror32(mul9(w), 24)) >>> + 0, + byteOff + ) + } } /** AddRoundKey: 将轮密钥与块进行异或 */ -function addRoundKey(buf: Buffer, blockOff: number, keyBuf: Buffer, keyByteOff: number): void { - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - buf[blockOff + i] ^= keyBuf[keyByteOff + i]; - } +function addRoundKey( + buf: Buffer, + blockOff: number, + keyBuf: Buffer, + keyByteOff: number +): void { + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + buf[blockOff + i] ^= keyBuf[keyByteOff + i] + } } // ─── 异或块操作 ───────────────────────────────────────────────────────────── /** 将 inBuf 的 16 字节异或到 outBuf(就地修改 outBuf) */ export function xorBlock( - inBuf: Buffer, - outBuf: Buffer, - inOffset: number = 0, - outOffset: number = 0 + inBuf: Buffer, + outBuf: Buffer, + inOffset: number = 0, + outOffset: number = 0 ): void { - for (let i = 0; i < AES_BLOCK_BYTES; i++) { - outBuf[outOffset + i] ^= inBuf[inOffset + i]; - } + for (let i = 0; i < AES_BLOCK_BYTES; i++) { + outBuf[outOffset + i] ^= inBuf[inOffset + i] + } } // ─── AES 上下文 (参考 src/crypto_internal.c 中的 AES_KEY) ────────────────── @@ -243,94 +261,92 @@ export function xorBlock( * 对应原版 AES_KEY 结构体 */ export class AesCtx { - /** 扩展密钥(最多 48 个 DWORD = 192 字节) */ - private keyBuf: Buffer; - /** AES 轮数 */ - rounds: number; - - constructor() { - this.keyBuf = Buffer.alloc(48 * 4); - this.rounds = 0; + /** 扩展密钥(最多 48 个 DWORD = 192 字节) */ + private keyBuf: Buffer + /** AES 轮数 */ + rounds: number + + constructor() { + this.keyBuf = Buffer.alloc(48 * 4) + this.rounds = 0 + } + + /** + * 初始化 AES 密钥扩展 + * 完全匹配原版 AesInitKey 函数,包括 V6 协议的特殊修改 + * + * 参考: src/crypto_internal.c 中的 AesInitKey() + * + * @param key 原始密钥 + * @param isV6 是否为 V6 协议(需要额外的密钥修改) + * @param keyBytes 密钥长度(字节) + */ + initKey(key: Buffer, isV6: boolean, keyBytes: number): void { + const keyDwords = keyBytes >>> 2 + this.rounds = keyDwords + 6 + + // 复制原始密钥到密钥缓冲区 + key.copy(this.keyBuf, 0, 0, keyBytes) + + // 密钥扩展算法 + const totalDwords = (this.rounds + 1) << 2 + for (let i = keyDwords; i < totalDwords; i++) { + let temp = this.keyBuf.readUInt32LE((i - 1) * 4) + + if (i % keyDwords === 0) { + const rconIdx = (i / keyDwords) | 0 + temp = be32((subDword(ror32(be32(temp), 24)) ^ RCon[rconIdx]) >>> 0) + } + + const prev = this.keyBuf.readUInt32LE((i - keyDwords) * 4) + this.keyBuf.writeUInt32LE((prev ^ temp) >>> 0, i * 4) } - /** - * 初始化 AES 密钥扩展 - * 完全匹配原版 AesInitKey 函数,包括 V6 协议的特殊修改 - * - * 参考: src/crypto_internal.c 中的 AesInitKey() - * - * @param key 原始密钥 - * @param isV6 是否为 V6 协议(需要额外的密钥修改) - * @param keyBytes 密钥长度(字节) - */ - initKey(key: Buffer, isV6: boolean, keyBytes: number): void { - const keyDwords = (keyBytes >>> 2); - this.rounds = keyDwords + 6; - - // 复制原始密钥到密钥缓冲区 - key.copy(this.keyBuf, 0, 0, keyBytes); - - // 密钥扩展算法 - const totalDwords = (this.rounds + 1) << 2; - for (let i = keyDwords; i < totalDwords; i++) { - let temp = this.keyBuf.readUInt32LE((i - 1) * 4); - - if ((i % keyDwords) === 0) { - const rconIdx = (i / keyDwords) | 0; - temp = be32( - (subDword(ror32(be32(temp), 24)) ^ RCon[rconIdx]) >>> 0 - ); - } - - const prev = this.keyBuf.readUInt32LE((i - keyDwords) * 4); - this.keyBuf.writeUInt32LE((prev ^ temp) >>> 0, i * 4); - } - - // V6 协议密钥修改: 对扩展密钥的特定字节执行 XOR - // 这是 vlmcsd 独有的修改,使 V6 协议的加密与标准 AES 不同 - if (isV6) { - this.keyBuf[4 * 16] ^= 0x73; - this.keyBuf[6 * 16] ^= 0x09; - this.keyBuf[8 * 16] ^= 0xE4; - } + // V6 协议密钥修改: 对扩展密钥的特定字节执行 XOR + // 这是 vlmcsd 独有的修改,使 V6 协议的加密与标准 AES 不同 + if (isV6) { + this.keyBuf[4 * 16] ^= 0x73 + this.keyBuf[6 * 16] ^= 0x09 + this.keyBuf[8 * 16] ^= 0xe4 } - - /** - * 就地加密单个 16 字节 AES 块 - * 标准 Rijndael 流程: AddRoundKey → SubBytes → ShiftRows → MixColumns - * - * 参考: src/crypto_internal.c 中的 AesEncryptBlock() - */ - encryptBlock(block: Buffer, offset: number = 0): void { - for (let keyIdx = 0; ; keyIdx += 4) { - addRoundKey(block, offset, this.keyBuf, keyIdx * 4); - subBytesBlock(block, offset); - shiftRowsBlock(block, offset); - if (keyIdx >= (this.rounds - 1) << 2) break; - mixColumnsBlock(block, offset); - } - // 最后一轮 AddRoundKey - addRoundKey(block, offset, this.keyBuf, this.rounds << 4); + } + + /** + * 就地加密单个 16 字节 AES 块 + * 标准 Rijndael 流程: AddRoundKey → SubBytes → ShiftRows → MixColumns + * + * 参考: src/crypto_internal.c 中的 AesEncryptBlock() + */ + encryptBlock(block: Buffer, offset: number = 0): void { + for (let keyIdx = 0; ; keyIdx += 4) { + addRoundKey(block, offset, this.keyBuf, keyIdx * 4) + subBytesBlock(block, offset) + shiftRowsBlock(block, offset) + if (keyIdx >= (this.rounds - 1) << 2) break + mixColumnsBlock(block, offset) } - - /** - * 就地解密单个 16 字节 AES 块 - * 逆 Rijndael 流程: AddRoundKey → InvShiftRows → InvSubBytes → InvMixColumns - * - * 参考: src/crypto_internal.c 中的 AesDecryptBlock() - */ - decryptBlock(block: Buffer, offset: number = 0): void { - // 初始 AddRoundKey(使用最后一轮密钥) - addRoundKey(block, offset, this.keyBuf, this.rounds << 4); - - for (let keyIdx = (this.rounds - 1) << 2; ; keyIdx -= 4) { - shiftRowsRBlock(block, offset); - subBytesRBlock(block, offset); - addRoundKey(block, offset, this.keyBuf, keyIdx * 4); - if (keyIdx === 0) break; - mixColumnsRBlock(block, offset); - } + // 最后一轮 AddRoundKey + addRoundKey(block, offset, this.keyBuf, this.rounds << 4) + } + + /** + * 就地解密单个 16 字节 AES 块 + * 逆 Rijndael 流程: AddRoundKey → InvShiftRows → InvSubBytes → InvMixColumns + * + * 参考: src/crypto_internal.c 中的 AesDecryptBlock() + */ + decryptBlock(block: Buffer, offset: number = 0): void { + // 初始 AddRoundKey(使用最后一轮密钥) + addRoundKey(block, offset, this.keyBuf, this.rounds << 4) + + for (let keyIdx = (this.rounds - 1) << 2; ; keyIdx -= 4) { + shiftRowsRBlock(block, offset) + subBytesRBlock(block, offset) + addRoundKey(block, offset, this.keyBuf, keyIdx * 4) + if (keyIdx === 0) break + mixColumnsRBlock(block, offset) } + } } // ─── AES-CBC 加密 (参考 src/crypto.c 中的 AesEncryptCbc) ──────────────────── @@ -342,30 +358,30 @@ export class AesCtx { * 参考: src/crypto.c 中的 AesEncryptCbc() */ export function aesEncryptCbc( - ctx: AesCtx, - iv: Buffer | null, - data: Buffer + ctx: AesCtx, + iv: Buffer | null, + data: Buffer ): { encrypted: Buffer; totalLen: number } { - const origLen = data.length; - // 计算 PKCS#7 填充长度: 1 到 16 字节 - const pad = (~origLen & (AES_BLOCK_BYTES - 1)) + 1; - const totalLen = origLen + pad; - - const result = Buffer.alloc(totalLen); - data.copy(result, 0, 0, origLen); - result.fill(pad, origLen, totalLen); - - // 第一块: 与 IV 异或后加密 - if (iv) xorBlock(iv, result, 0, 0); - ctx.encryptBlock(result, 0); - - // 后续块: 与前一块密文异或后加密(CBC 模式链接) - for (let off = AES_BLOCK_BYTES; off < totalLen; off += AES_BLOCK_BYTES) { - xorBlock(result, result, off - AES_BLOCK_BYTES, off); - ctx.encryptBlock(result, off); - } - - return { encrypted: result, totalLen }; + const origLen = data.length + // 计算 PKCS#7 填充长度: 1 到 16 字节 + const pad = (~origLen & (AES_BLOCK_BYTES - 1)) + 1 + const totalLen = origLen + pad + + const result = Buffer.alloc(totalLen) + data.copy(result, 0, 0, origLen) + result.fill(pad, origLen, totalLen) + + // 第一块: 与 IV 异或后加密 + if (iv) xorBlock(iv, result, 0, 0) + ctx.encryptBlock(result, 0) + + // 后续块: 与前一块密文异或后加密(CBC 模式链接) + for (let off = AES_BLOCK_BYTES; off < totalLen; off += AES_BLOCK_BYTES) { + xorBlock(result, result, off - AES_BLOCK_BYTES, off) + ctx.encryptBlock(result, off) + } + + return { encrypted: result, totalLen } } // ─── AES-CBC 解密 (参考 src/crypto.c 中的 AesDecryptCbc) ──────────────────── @@ -377,20 +393,20 @@ export function aesEncryptCbc( * 参考: src/crypto.c 中的 AesDecryptCbc() */ export function aesDecryptCbc( - ctx: AesCtx, - iv: Buffer | null, - data: Buffer, - len: number + ctx: AesCtx, + iv: Buffer | null, + data: Buffer, + len: number ): void { - // 从最后一块到第二块逆序处理 - for (let cc = len - AES_BLOCK_BYTES; cc > 0; cc -= AES_BLOCK_BYTES) { - ctx.decryptBlock(data, cc); - xorBlock(data, data, cc - AES_BLOCK_BYTES, cc); - } - - // 处理第一块 - ctx.decryptBlock(data, 0); - if (iv) xorBlock(iv, data, 0, 0); + // 从最后一块到第二块逆序处理 + for (let cc = len - AES_BLOCK_BYTES; cc > 0; cc -= AES_BLOCK_BYTES) { + ctx.decryptBlock(data, cc) + xorBlock(data, data, cc - AES_BLOCK_BYTES, cc) + } + + // 处理第一块 + ctx.decryptBlock(data, 0) + if (iv) xorBlock(iv, data, 0, 0) } // ─── AES-CMAC V4 (参考 src/crypto.c 中的 AesCmacV4) ──────────────────────── @@ -402,42 +418,42 @@ export function aesDecryptCbc( * 参考: src/crypto.c 中的 AesCmacV4() */ export function aesCmacV4(message: Buffer, messageSize: number): Buffer { - const ctx = new AesCtx(); - ctx.initKey(AesKeyV4, false, V4_KEY_BYTES); + const ctx = new AesCtx() + ctx.initKey(AesKeyV4, false, V4_KEY_BYTES) - const mac = Buffer.alloc(AES_BLOCK_BYTES); + const mac = Buffer.alloc(AES_BLOCK_BYTES) - // 创建填充消息: 原始数据 + 0x80 + 零填充(到下一个块边界) - const padded = Buffer.alloc(messageSize + AES_BLOCK_BYTES); - message.copy(padded, 0, 0, messageSize); - padded[messageSize] = 0x80; + // 创建填充消息: 原始数据 + 0x80 + 零填充(到下一个块边界) + const padded = Buffer.alloc(messageSize + AES_BLOCK_BYTES) + message.copy(padded, 0, 0, messageSize) + padded[messageSize] = 0x80 - // 逐块异或并加密,累积 MAC 值 - for (let i = 0; i <= messageSize; i += AES_BLOCK_BYTES) { - xorBlock(padded, mac, i, 0); - ctx.encryptBlock(mac, 0); - } + // 逐块异或并加密,累积 MAC 值 + for (let i = 0; i <= messageSize; i += AES_BLOCK_BYTES) { + xorBlock(padded, mac, i, 0) + ctx.encryptBlock(mac, 0) + } - return Buffer.from(mac); + return Buffer.from(mac) } // ─── SHA-256 哈希 ─────────────────────────────────────────────────────────── /** 计算 SHA-256 哈希(使用 Node.js 内建 crypto) */ export function sha256(data: Buffer): Buffer { - return crypto.createHash('sha256').update(data).digest(); + return crypto.createHash('sha256').update(data).digest() } // ─── HMAC-SHA256 ──────────────────────────────────────────────────────────── /** 计算 HMAC-SHA256(使用 Node.js 内建 crypto) */ export function sha256Hmac(key: Buffer, data: Buffer): Buffer { - return crypto.createHmac('sha256', key).update(data).digest(); + return crypto.createHmac('sha256', key).update(data).digest() } // ─── 随机数生成 ───────────────────────────────────────────────────────────── /** 生成 16 字节密码学安全随机数 */ export function get16RandomBytes(): Buffer { - return crypto.randomBytes(16); + return crypto.randomBytes(16) } diff --git a/node-vlmcs/src/data.ts b/node-vlmcs/src/data.ts index e5365b38..d30b1082 100644 --- a/node-vlmcs/src/data.ts +++ b/node-vlmcs/src/data.ts @@ -13,2721 +13,2721 @@ /** CSVLK 数据项 — 对应 CsvlkData_t,包含 ePID 模板和密钥范围 */ export interface CsvlkItem { - ePid: string; // ePID 模板字符串 - ePidGroup: string; // ePID 分组名称(如 Windows、Office2010) - groupId: number; // 分组 ID - minKeyId: number; // 最小密钥 ID - maxKeyId: number; // 最大密钥 ID - minActiveClients: number; // 最小活跃客户端数 - releaseDate: number; // 发布日期(Unix 时间戳) + ePid: string // ePID 模板字符串 + ePidGroup: string // ePID 分组名称(如 Windows、Office2010) + groupId: number // 分组 ID + minKeyId: number // 最小密钥 ID + maxKeyId: number // 最大密钥 ID + minActiveClients: number // 最小活跃客户端数 + releaseDate: number // 发布日期(Unix 时间戳) } /** 应用程序项 — 对应 kmsdata.h 中的应用数据 */ export interface AppItem { - guid: string; // 应用程序 GUID - name: string; // 应用程序名称 - nCountPolicy: number; // N 计数策略(最小客户端数) + guid: string // 应用程序 GUID + name: string // 应用程序名称 + nCountPolicy: number // N 计数策略(最小客户端数) } /** KMS 项目 — 对应 KmsData_t,描述可激活的产品组 */ export interface KmsItem { - guid: string; // KMS 计数 ID (GUID) - name: string; // 产品组名称 - appIndex: number; // 关联的应用程序索引 - ePidIndex: number; // 关联的 ePID 索引 - nCountPolicy: number; // N 计数策略 - protocolVersion: number; // 协议版本(4/5/6) - isRetail: number; // 是否为零售版 - isPreview: number; // 是否为预览版 + guid: string // KMS 计数 ID (GUID) + name: string // 产品组名称 + appIndex: number // 关联的应用程序索引 + ePidIndex: number // 关联的 ePID 索引 + nCountPolicy: number // N 计数策略 + protocolVersion: number // 协议版本(4/5/6) + isRetail: number // 是否为零售版 + isPreview: number // 是否为预览版 } /** SKU 项目 — 描述具体的产品 SKU(最终用户可见的产品) */ export interface SkuItem { - guid: string; // 激活 ID (SKU GUID) - name: string; // 产品名称 - appIndex: number; // 关联的应用程序索引 - kmsIndex: number; // 关联的 KMS 项目索引 - protocolVersion: number; // 协议版本 - nCountPolicy: number; // N 计数策略 - isRetail: number; // 是否为零售版 - isPreview: number; // 是否为预览版 - ePidIndex: number; // 关联的 ePID 索引 + guid: string // 激活 ID (SKU GUID) + name: string // 产品名称 + appIndex: number // 关联的应用程序索引 + kmsIndex: number // 关联的 KMS 项目索引 + protocolVersion: number // 协议版本 + nCountPolicy: number // N 计数策略 + isRetail: number // 是否为零售版 + isPreview: number // 是否为预览版 + ePidIndex: number // 关联的 ePID 索引 } /** 主机构建信息 — 对应 VlmcsdHeader_t 中的构建信息 */ export interface HostBuild { - buildNumber: number; // Windows 构建号 - platformId: number; // 平台 ID - displayName: string; // 显示名称 - flags: number; // 标志位(UseNdr64, UseForEpid, MayBeServer) - releaseDate: number; // 发布日期(Unix 时间戳) + buildNumber: number // Windows 构建号 + platformId: number // 平台 ID + displayName: string // 显示名称 + flags: number // 标志位(UseNdr64, UseForEpid, MayBeServer) + releaseDate: number // 发布日期(Unix 时间戳) } /** KMS 数据库总结构 — 对应 VlmcsdHeader_t */ export interface KmsDatabase { - csvlkCount: number; - appItemCount: number; - kmsItemCount: number; - skuItemCount: number; - hostBuildCount: number; - csvlkData: CsvlkItem[]; - appItems: AppItem[]; - kmsItems: KmsItem[]; - skuItems: SkuItem[]; - hostBuilds: HostBuild[]; + csvlkCount: number + appItemCount: number + kmsItemCount: number + skuItemCount: number + hostBuildCount: number + csvlkData: CsvlkItem[] + appItems: AppItem[] + kmsItems: KmsItem[] + skuItems: SkuItem[] + hostBuilds: HostBuild[] } // ─── 主机构建标志位 (参考 src/kmsdata.h) ──────────────────────────────────── /** 使用 NDR64 传输语法 */ -export const UseNdr64 = 1 << 0; +export const UseNdr64 = 1 << 0 /** 用于 ePID 生成 */ -export const UseForEpid = 1 << 1; +export const UseForEpid = 1 << 1 /** 可能是服务器版本 */ -export const MayBeServer = 1 << 2; +export const MayBeServer = 1 << 2 // ─── 产品数据库 (从 src/kmsdata-full.c 提取) ──────────────────────────────── export const KmsData: KmsDatabase = { - "csvlkCount": 6, - "appItemCount": 3, - "kmsItemCount": 29, - "skuItemCount": 202, - "hostBuildCount": 6, - "csvlkData": [ - { - "ePid": "03612-00206-556-123727-03-1033-17763.0000-2972018", - "ePidGroup": "Windows", - "groupId": 206, - "minKeyId": 551000000, - "maxKeyId": 570999999, - "minActiveClients": 0, - "releaseDate": 1538438400 - }, - { - "ePid": "03612-00096-199-799188-03-1033-17763.0000-2972018", - "ePidGroup": "Office2010", - "groupId": 96, - "minKeyId": 199000000, - "maxKeyId": 217999999, - "minActiveClients": 0, - "releaseDate": 1279152000 - }, - { - "ePid": "03612-00206-240-719639-03-1033-17763.0000-2972018", - "ePidGroup": "Office2013", - "groupId": 206, - "minKeyId": 234000000, - "maxKeyId": 255999999, - "minActiveClients": 0, - "releaseDate": 1359417600 - }, - { - "ePid": "03612-00206-438-004532-03-1033-17763.0000-2972018", - "ePidGroup": "Office2016", - "groupId": 206, - "minKeyId": 437000000, - "maxKeyId": 458999999, - "minActiveClients": 0, - "releaseDate": 1442880000 - }, - { - "ePid": "03612-03858-053-089516-03-1033-17763.0000-2972018", - "ePidGroup": "WinChinaGov", - "groupId": 3858, - "minKeyId": 15000000, - "maxKeyId": 999999999, - "minActiveClients": 0, - "releaseDate": 1491350400 - }, - { - "ePid": "03612-00206-684-137669-03-1033-17763.0000-2972018", - "ePidGroup": "Office2019", - "groupId": 206, - "minKeyId": 666000000, - "maxKeyId": 685999999, - "minActiveClients": 0, - "releaseDate": 1537747200 + csvlkCount: 6, + appItemCount: 3, + kmsItemCount: 29, + skuItemCount: 202, + hostBuildCount: 6, + csvlkData: [ + { + ePid: '03612-00206-556-123727-03-1033-17763.0000-2972018', + ePidGroup: 'Windows', + groupId: 206, + minKeyId: 551000000, + maxKeyId: 570999999, + minActiveClients: 0, + releaseDate: 1538438400 + }, + { + ePid: '03612-00096-199-799188-03-1033-17763.0000-2972018', + ePidGroup: 'Office2010', + groupId: 96, + minKeyId: 199000000, + maxKeyId: 217999999, + minActiveClients: 0, + releaseDate: 1279152000 + }, + { + ePid: '03612-00206-240-719639-03-1033-17763.0000-2972018', + ePidGroup: 'Office2013', + groupId: 206, + minKeyId: 234000000, + maxKeyId: 255999999, + minActiveClients: 0, + releaseDate: 1359417600 + }, + { + ePid: '03612-00206-438-004532-03-1033-17763.0000-2972018', + ePidGroup: 'Office2016', + groupId: 206, + minKeyId: 437000000, + maxKeyId: 458999999, + minActiveClients: 0, + releaseDate: 1442880000 + }, + { + ePid: '03612-03858-053-089516-03-1033-17763.0000-2972018', + ePidGroup: 'WinChinaGov', + groupId: 3858, + minKeyId: 15000000, + maxKeyId: 999999999, + minActiveClients: 0, + releaseDate: 1491350400 + }, + { + ePid: '03612-00206-684-137669-03-1033-17763.0000-2972018', + ePidGroup: 'Office2019', + groupId: 206, + minKeyId: 666000000, + maxKeyId: 685999999, + minActiveClients: 0, + releaseDate: 1537747200 } ], - "appItems": [ + appItems: [ { - "guid": "55c92734-d682-4d71-983e-d6ec3f16059f", - "name": "Windows", - "nCountPolicy": 50 + guid: '55c92734-d682-4d71-983e-d6ec3f16059f', + name: 'Windows', + nCountPolicy: 50 }, { - "guid": "59a52881-a989-479d-af46-f275c6370663", - "name": "Office2010", - "nCountPolicy": 10 + guid: '59a52881-a989-479d-af46-f275c6370663', + name: 'Office2010', + nCountPolicy: 10 }, { - "guid": "0ff1ce15-a989-479d-af46-f275c6370663", - "name": "Office2013+", - "nCountPolicy": 10 + guid: '0ff1ce15-a989-479d-af46-f275c6370663', + name: 'Office2013+', + nCountPolicy: 10 } ], - "kmsItems": [ - { - "guid": "8449b1fb-f0ea-497a-99ab-66ca96e9a0f5", - "name": "Windows Server 2019", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "11b15659-e603-4cf1-9c1f-f0ec01b81888", - "name": "Windows 10 2019 (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "d27cd636-1962-44e9-8b4f-27b6c23efb85", - "name": "Windows 10 Unknown (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "7ba0bf23-d0f5-4072-91d9-d55af5a481b6", - "name": "Windows 10 China Government", - "appIndex": 0, - "ePidIndex": 4, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "969fe3c0-a3ec-491a-9f25-423605deb365", - "name": "Windows 10 2016 (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "e1c51358-fe3e-4203-a4a2-3b6b20c9734e", - "name": "Windows 10 (Retail)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 1, - "isPreview": 0 - }, - { - "guid": "58e2134f-8e11-4d17-9cb2-91069c151148", - "name": "Windows 10 2015 (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "7fde5219-fbfa-484a-82c9-34d1ad53e856", - "name": "Windows 7", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "bbb97b3b-8ca4-4a28-9717-89fabd42c4ac", - "name": "Windows 8 (Retail)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 5, - "isRetail": 1, - "isPreview": 0 - }, - { - "guid": "3c40b358-5948-45af-923b-53d21fcc7e79", - "name": "Windows 8 (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 5, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "6d646890-3606-461a-86ab-598bb84ace82", - "name": "Windows 8.1 (Retail)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 1, - "isPreview": 0 - }, - { - "guid": "cb8fc780-2c05-495a-9710-85afffc904d7", - "name": "Windows 8.1 (Volume)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "5f94a0bb-d5a0-4081-a685-5819418b2fe0", - "name": "Windows Preview", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 5, - "isRetail": 0, - "isPreview": 1 - }, - { - "guid": "33e156e4-b76f-4a52-9f91-f641dd95ac48", - "name": "Windows Server 2008 A (Web and HPC)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "8fe53387-3087-4447-8985-f75132215ac9", - "name": "Windows Server 2008 B (Standard and Enterprise)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "8a21fdf3-cbc5-44eb-83f3-fe284e6680a7", - "name": "Windows Server 2008 C (Datacenter)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "0fc6ccaf-ff0e-4fae-9d08-4370785bf7ed", - "name": "Windows Server 2008 R2 A (Web and HPC)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "ca87f5b6-cd46-40c0-b06d-8ecd57a4373f", - "name": "Windows Server 2008 R2 B (Standard and Enterprise)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "b2ca2689-a9a8-42d7-938d-cf8e9f201958", - "name": "Windows Server 2008 R2 C (Datacenter)", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "8665cb71-468c-4aa3-a337-cb9bc9d5eaac", - "name": "Windows Server 2012", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 5, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "8456efd3-0c04-4089-8740-5b7238535a65", - "name": "Windows Server 2012 R2", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "6e9fc069-257d-4bc4-b4a7-750514d32743", - "name": "Windows Server 2016", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "6d5f5270-31ac-433e-b90a-39892923c657", - "name": "Windows Server Preview", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 1 - }, - { - "guid": "212a64dc-43b1-4d3d-a30c-2fc69d2095c6", - "name": "Windows Vista", - "appIndex": 0, - "ePidIndex": 0, - "nCountPolicy": 25, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "e85af946-2e25-47b7-83e1-bebcebeac611", - "name": "Office 2010", - "appIndex": 1, - "ePidIndex": 1, - "nCountPolicy": 5, - "protocolVersion": 4, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "e6a6f1bf-9d40-40c3-aa9f-c77ba21578c0", - "name": "Office 2013", - "appIndex": 2, - "ePidIndex": 2, - "nCountPolicy": 5, - "protocolVersion": 5, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "aa4c7968-b9da-4680-92b6-acb25e2f866c", - "name": "Office 2013 (Pre-Release)", - "appIndex": 2, - "ePidIndex": 0, - "nCountPolicy": 5, - "protocolVersion": 5, - "isRetail": 0, - "isPreview": 1 - }, - { - "guid": "85b5f61b-320b-4be3-814a-b76b2bfafc82", - "name": "Office 2016", - "appIndex": 2, - "ePidIndex": 3, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 - }, - { - "guid": "617d9eb1-ef36-4f82-86e0-a65ae07b96c6", - "name": "Office 2019", - "appIndex": 2, - "ePidIndex": 5, - "nCountPolicy": 5, - "protocolVersion": 6, - "isRetail": 0, - "isPreview": 0 + kmsItems: [ + { + guid: '8449b1fb-f0ea-497a-99ab-66ca96e9a0f5', + name: 'Windows Server 2019', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '11b15659-e603-4cf1-9c1f-f0ec01b81888', + name: 'Windows 10 2019 (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'd27cd636-1962-44e9-8b4f-27b6c23efb85', + name: 'Windows 10 Unknown (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '7ba0bf23-d0f5-4072-91d9-d55af5a481b6', + name: 'Windows 10 China Government', + appIndex: 0, + ePidIndex: 4, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '969fe3c0-a3ec-491a-9f25-423605deb365', + name: 'Windows 10 2016 (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'e1c51358-fe3e-4203-a4a2-3b6b20c9734e', + name: 'Windows 10 (Retail)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 1, + isPreview: 0 + }, + { + guid: '58e2134f-8e11-4d17-9cb2-91069c151148', + name: 'Windows 10 2015 (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '7fde5219-fbfa-484a-82c9-34d1ad53e856', + name: 'Windows 7', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'bbb97b3b-8ca4-4a28-9717-89fabd42c4ac', + name: 'Windows 8 (Retail)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 5, + isRetail: 1, + isPreview: 0 + }, + { + guid: '3c40b358-5948-45af-923b-53d21fcc7e79', + name: 'Windows 8 (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 5, + isRetail: 0, + isPreview: 0 + }, + { + guid: '6d646890-3606-461a-86ab-598bb84ace82', + name: 'Windows 8.1 (Retail)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 1, + isPreview: 0 + }, + { + guid: 'cb8fc780-2c05-495a-9710-85afffc904d7', + name: 'Windows 8.1 (Volume)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '5f94a0bb-d5a0-4081-a685-5819418b2fe0', + name: 'Windows Preview', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 5, + isRetail: 0, + isPreview: 1 + }, + { + guid: '33e156e4-b76f-4a52-9f91-f641dd95ac48', + name: 'Windows Server 2008 A (Web and HPC)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: '8fe53387-3087-4447-8985-f75132215ac9', + name: 'Windows Server 2008 B (Standard and Enterprise)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: '8a21fdf3-cbc5-44eb-83f3-fe284e6680a7', + name: 'Windows Server 2008 C (Datacenter)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: '0fc6ccaf-ff0e-4fae-9d08-4370785bf7ed', + name: 'Windows Server 2008 R2 A (Web and HPC)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'ca87f5b6-cd46-40c0-b06d-8ecd57a4373f', + name: 'Windows Server 2008 R2 B (Standard and Enterprise)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'b2ca2689-a9a8-42d7-938d-cf8e9f201958', + name: 'Windows Server 2008 R2 C (Datacenter)', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: '8665cb71-468c-4aa3-a337-cb9bc9d5eaac', + name: 'Windows Server 2012', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 5, + isRetail: 0, + isPreview: 0 + }, + { + guid: '8456efd3-0c04-4089-8740-5b7238535a65', + name: 'Windows Server 2012 R2', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '6e9fc069-257d-4bc4-b4a7-750514d32743', + name: 'Windows Server 2016', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '6d5f5270-31ac-433e-b90a-39892923c657', + name: 'Windows Server Preview', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 1 + }, + { + guid: '212a64dc-43b1-4d3d-a30c-2fc69d2095c6', + name: 'Windows Vista', + appIndex: 0, + ePidIndex: 0, + nCountPolicy: 25, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'e85af946-2e25-47b7-83e1-bebcebeac611', + name: 'Office 2010', + appIndex: 1, + ePidIndex: 1, + nCountPolicy: 5, + protocolVersion: 4, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'e6a6f1bf-9d40-40c3-aa9f-c77ba21578c0', + name: 'Office 2013', + appIndex: 2, + ePidIndex: 2, + nCountPolicy: 5, + protocolVersion: 5, + isRetail: 0, + isPreview: 0 + }, + { + guid: 'aa4c7968-b9da-4680-92b6-acb25e2f866c', + name: 'Office 2013 (Pre-Release)', + appIndex: 2, + ePidIndex: 0, + nCountPolicy: 5, + protocolVersion: 5, + isRetail: 0, + isPreview: 1 + }, + { + guid: '85b5f61b-320b-4be3-814a-b76b2bfafc82', + name: 'Office 2016', + appIndex: 2, + ePidIndex: 3, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 + }, + { + guid: '617d9eb1-ef36-4f82-86e0-a65ae07b96c6', + name: 'Office 2019', + appIndex: 2, + ePidIndex: 5, + nCountPolicy: 5, + protocolVersion: 6, + isRetail: 0, + isPreview: 0 } ], - "skuItems": [ - { - "guid": "8de8eb62-bbe0-40ac-ac17-f75595071ea3", - "name": "Windows Server 2019 ARM64", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a99cc1f0-7719-4306-9645-294102fbff95", - "name": "Windows Server 2019 Azure Core", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "34e1ae55-27f8-4950-8877-7a03be5fb181", - "name": "Windows Server 2019 Datacenter", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "034d3cbb-5d4b-4245-b3f8-f84571314078", - "name": "Windows Server 2019 Essentials", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "de32eafd-aaee-4662-9444-c1befb41bde2", - "name": "Windows Server 2019 Standard", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "90c362e5-0da1-4bfd-b53b-b87d309ade43", - "name": "Windows Server 2019 Datacenter (Semi-Annual Channel)", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "73e3957c-fc0c-400d-9184-5f7b6f2eb409", - "name": "Windows Server 2019 Standard (Semi-Annual Channel)", - "appIndex": 0, - "kmsIndex": 0, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "32d2fab3-e4a8-42c2-923b-4bf4fd13e6ee", - "name": "Windows 10 Enterprise LTSC 2019", - "appIndex": 0, - "kmsIndex": 1, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7103a333-b8c8-49cc-93ce-d37c09687f92", - "name": "Windows 10 Enterprise LTSC 2019 N", - "appIndex": 0, - "kmsIndex": 1, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e0b2d383-d112-413f-8a80-97f373a5820c", - "name": "Windows 10 Enterprise G", - "appIndex": 0, - "kmsIndex": 3, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 4 - }, - { - "guid": "e38454fb-41a4-4f59-a5dc-25080e354730", - "name": "Windows 10 Enterprise GN", - "appIndex": 0, - "kmsIndex": 3, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 4 - }, - { - "guid": "2d5a5a60-3040-48bf-beb0-fcd770c20ce0", - "name": "Windows 10 Enterprise 2016 LTSB", - "appIndex": 0, - "kmsIndex": 4, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "9f776d83-7156-45b2-8a5c-359b9c9f22a3", - "name": "Windows 10 Enterprise 2016 LTSB N", - "appIndex": 0, - "kmsIndex": 4, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "58e97c99-f377-4ef1-81d5-4ad5522b5fd8", - "name": "Windows 10 Home", - "appIndex": 0, - "kmsIndex": 5, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a9107544-f4a0-4053-a96a-1479abdef912", - "name": "Windows 10 Home Country Specific", - "appIndex": 0, - "kmsIndex": 5, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7b9e1751-a8da-4f75-9560-5fadfe3d8e38", - "name": "Windows 10 Home N", - "appIndex": 0, - "kmsIndex": 5, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cd918a57-a41b-4c82-8dce-1a538e221a83", - "name": "Windows 10 Home Single Language", - "appIndex": 0, - "kmsIndex": 5, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e0c42288-980c-4788-a014-c080d2e1926e", - "name": "Windows 10 Education", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "3c102355-d027-42c6-ad23-2e7ef8a02585", - "name": "Windows 10 Education N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "73111121-5638-40f6-bc11-f1d7b0d64300", - "name": "Windows 10 Enterprise", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7b51a46c-0c04-4e8f-9af4-8496cca90d5e", - "name": "Windows 10 Enterprise 2015 LTSB", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "87b838b7-41b6-4590-8318-5797951d8529", - "name": "Windows 10 Enterprise 2015 LTSB N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e272e3e2-732f-4c65-a8f0-484747d0d947", - "name": "Windows 10 Enterprise N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "82bbc092-bc50-4e16-8e18-b74fc486aec3", - "name": "Windows 10 Professional Workstation", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "4b1571d3-bafb-4b40-8087-a961be2caf65", - "name": "Windows 10 Professional Workstation N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "2de67392-b7a7-462a-b1ca-108dd189f588", - "name": "Windows 10 Professional", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "3f1afc82-f8ac-4f6c-8005-1d233e606eee", - "name": "Windows 10 Professional Education", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "5300b18c-2e33-4dc2-8291-47ffcec746dd", - "name": "Windows 10 Professional Education N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a80b5abf-76ad-428b-b05d-a47d2dffeebf", - "name": "Windows 10 Professional N", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ff808201-fec6-4fd4-ae16-abbddade5706", - "name": "Windows 10 Professional Preview", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "43f2ab05-7c87-4d56-b27c-44d0f9a3dabd", - "name": "Windows 10 Enterprise Preview", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ec868e65-fadf-4759-b23e-93fe37f2cc29", - "name": "Windows 10 Enterprise for Virtual Desktops", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e4db50ea-bda1-4566-b047-0ca50abc6f07", - "name": "Windows 10 Remote Server", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "0df4f814-3f57-4b8b-9a9d-fddadcd69fac", - "name": "Windows 10 S (Lean)", - "appIndex": 0, - "kmsIndex": 6, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ae2ee509-1b34-41c0-acb7-6d4650168915", - "name": "Windows 7 Enterprise", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "46bbed08-9c7b-48fc-a614-95250573f4ea", - "name": "Windows 7 Enterprise E", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "1cb6d605-11b3-4e14-bb30-da91c8e3983a", - "name": "Windows 7 Enterprise N", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "b92e9980-b9d5-4821-9c94-140f632f6312", - "name": "Windows 7 Professional", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "5a041529-fef8-4d07-b06f-b59b573b32d2", - "name": "Windows 7 Professional E", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "54a09a0d-d57b-4c10-8b69-a842d6590ad5", - "name": "Windows 7 Professional N", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "db537896-376f-48ae-a492-53d0547773d0", - "name": "Windows 7 Embedded POSReady", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e1a8296a-db37-44d1-8cce-7bc961d59c54", - "name": "Windows 7 Embedded Standard", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "aa6dd3aa-c2b4-40e2-a544-a6bbb3f5c395", - "name": "Windows 7 ThinPC", - "appIndex": 0, - "kmsIndex": 7, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "c04ed6bf-55c8-4b47-9f8e-5a1f31ceee60", - "name": "Windows 8 Core", - "appIndex": 0, - "kmsIndex": 8, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "9d5584a2-2d85-419a-982c-a00888bb9ddf", - "name": "Windows 8 Core Country Specific", - "appIndex": 0, - "kmsIndex": 8, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "197390a0-65f6-4a95-bdc4-55d58a3b0253", - "name": "Windows 8 Core N", - "appIndex": 0, - "kmsIndex": 8, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "8860fcd4-a77b-4a20-9045-a150ff11d609", - "name": "Windows 8 Core Single Language", - "appIndex": 0, - "kmsIndex": 8, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a00018a3-f20f-4632-bf7c-8daa5351c914", - "name": "Windows 8 Professional WMC", - "appIndex": 0, - "kmsIndex": 8, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "10018baf-ce21-4060-80bd-47fe74ed4dab", - "name": "Windows 8 Embedded Industry Professional", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "18db1848-12e0-4167-b9d7-da7fcda507db", - "name": "Windows 8 Embedded Industry Enterprise", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "458e1bec-837a-45f6-b9d5-925ed5d299de", - "name": "Windows 8 Enterprise", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e14997e7-800a-4cf7-ad10-de4b45b578db", - "name": "Windows 8 Enterprise N", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a98bcd6d-5343-4603-8afe-5908e4611112", - "name": "Windows 8 Professional", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ebf245c1-29a8-4daf-9cb1-38dfc608a8c8", - "name": "Windows 8 Professional N", - "appIndex": 0, - "kmsIndex": 9, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "fe1c3238-432a-43a1-8e25-97e7d1ef10f3", - "name": "Windows 8.1 Core", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ffee456a-cd87-4390-8e07-16146c672fd0", - "name": "Windows 8.1 Core ARM", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "db78b74f-ef1c-4892-abfe-1e66b8231df6", - "name": "Windows 8.1 Core Country Specific", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "78558a64-dc19-43fe-a0d0-8075b2a370a3", - "name": "Windows 8.1 Core N", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "c72c6a1d-f252-4e7e-bdd1-3fca342acb35", - "name": "Windows 8.1 Core Single Language", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e58d87b5-8126-4580-80fb-861b22f79296", - "name": "Windows 8.1 Professional Student", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cab491c7-a918-4f60-b502-dab75e334f40", - "name": "Windows 8.1 Professional Student N", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "096ce63d-4fac-48a9-82a9-61ae9e800e5f", - "name": "Windows 8.1 Professional WMC", - "appIndex": 0, - "kmsIndex": 10, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 1, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e9942b32-2e55-4197-b0bd-5ff58cba8860", - "name": "Windows 8.1 Core Connected", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ba998212-460a-44db-bfb5-71bf09d1c68b", - "name": "Windows 8.1 Core Connected Country Specific", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "c6ddecd6-2354-4c19-909b-306a3058484e", - "name": "Windows 8.1 Core Connected N", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "b8f5e3a3-ed33-4608-81e1-37d6c9dcfd9c", - "name": "Windows 8.1 Core Connected Single Language", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "81671aaf-79d1-4eb1-b004-8cbbe173afea", - "name": "Windows 8.1 Enterprise", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "113e705c-fa49-48a4-beea-7dd879b46b14", - "name": "Windows 8.1 Enterprise N", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "c06b6981-d7fd-4a35-b7b4-054742b7af67", - "name": "Windows 8.1 Professional", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7476d79f-8e48-49b4-ab63-4d0b813a16e4", - "name": "Windows 8.1 Professional N", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "0ab82d54-47f4-4acb-818c-cc5bf0ecb649", - "name": "Windows 8.1 Embedded Industry Professional", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "f7e88590-dfc7-4c78-bccb-6f3865b99d1a", - "name": "Windows 8.1 Embedded Industry Automotive", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cd4e2d9f-5059-4a50-a92d-05d5bb1267c7", - "name": "Windows 8.1 Embedded Industry Enterprise", - "appIndex": 0, - "kmsIndex": 11, - "protocolVersion": 6, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cde952c7-2f96-4d9d-8f2b-2d349f64fc51", - "name": "Windows 10 Enterprise Preview", - "appIndex": 0, - "kmsIndex": 12, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "a4383e6b-dada-423d-a43d-f25678429676", - "name": "Windows 10 Professional Preview", - "appIndex": 0, - "kmsIndex": 12, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "cf59a07b-1a2a-4be0-bfe0-423b5823e663", - "name": "Windows 10 Professional WMC Preview", - "appIndex": 0, - "kmsIndex": 12, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "2b9c337f-7a1d-4271-90a3-c6855a2b8a1c", - "name": "Windows 8.x Preview", - "appIndex": 0, - "kmsIndex": 12, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "631ead72-a8ab-4df8-bbdf-372029989bdd", - "name": "Windows 8.x Preview ARM", - "appIndex": 0, - "kmsIndex": 12, - "protocolVersion": 5, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "ddfa9f7c-f09e-40b9-8c1a-be877a9a7f4b", - "name": "Windows Server 2008 Web", - "appIndex": 0, - "kmsIndex": 13, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7afb1156-2c1d-40fc-b260-aab7442b62fe", - "name": "Windows Server 2008 Compute Cluster", - "appIndex": 0, - "kmsIndex": 13, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ad2542d4-9154-4c6d-8a44-30f11ee96989", - "name": "Windows Server 2008 Standard", - "appIndex": 0, - "kmsIndex": 14, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "2401e3d0-c50a-4b58-87b2-7e794b7d2607", - "name": "Windows Server 2008 Standard without Hyper-V", - "appIndex": 0, - "kmsIndex": 14, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "c1af4d90-d1bc-44ca-85d4-003ba33db3b9", - "name": "Windows Server 2008 Enterprise", - "appIndex": 0, - "kmsIndex": 14, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "8198490a-add0-47b2-b3ba-316b12d647b4", - "name": "Windows Server 2008 Enterprise without Hyper-V", - "appIndex": 0, - "kmsIndex": 14, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "68b6e220-cf09-466b-92d3-45cd964b9509", - "name": "Windows Server 2008 Datacenter", - "appIndex": 0, - "kmsIndex": 15, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "fd09ef77-5647-4eff-809c-af2b64659a45", - "name": "Windows Server 2008 Datacenter without Hyper-V", - "appIndex": 0, - "kmsIndex": 15, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "01ef176b-3e0d-422a-b4f8-4ea880035e8f", - "name": "Windows Server 2008 for Itanium", - "appIndex": 0, - "kmsIndex": 15, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "f772515c-0e87-48d5-a676-e6962c3e1195", - "name": "Windows MultiPoint Server 2010", - "appIndex": 0, - "kmsIndex": 16, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "a78b8bd9-8017-4df5-b86a-09f756affa7c", - "name": "Windows Server 2008 R2 Web", - "appIndex": 0, - "kmsIndex": 16, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cda18cf3-c196-46ad-b289-60c072869994", - "name": "Windows Server 2008 R2 HPC Edition", - "appIndex": 0, - "kmsIndex": 16, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "68531fb9-5511-4989-97be-d11a0f55633f", - "name": "Windows Server 2008 R2 Standard", - "appIndex": 0, - "kmsIndex": 17, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "620e2b3d-09e7-42fd-802a-17a13652fe7a", - "name": "Windows Server 2008 R2 Enterprise", - "appIndex": 0, - "kmsIndex": 17, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7482e61b-c589-4b7f-8ecc-46d455ac3b87", - "name": "Windows Server 2008 R2 Datacenter", - "appIndex": 0, - "kmsIndex": 18, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "8a26851c-1c7e-48d3-a687-fbca9b9ac16b", - "name": "Windows Server 2008 R2 for Itanium Enterprise", - "appIndex": 0, - "kmsIndex": 18, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "d3643d60-0c42-412d-a7d6-52e6635327f6", - "name": "Windows Server 2012 Datacenter", - "appIndex": 0, - "kmsIndex": 19, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "95fd1c83-7df5-494a-be8b-1300e1c9d1cd", - "name": "Windows Server 2012 MultiPoint Premium", - "appIndex": 0, - "kmsIndex": 19, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7d5486c7-e120-4771-b7f1-7b56c6d3170c", - "name": "Windows Server 2012 MultiPoint Standard", - "appIndex": 0, - "kmsIndex": 19, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "f0f5ec41-0d55-4732-af02-440a44a3cf0f", - "name": "Windows Server 2012 Standard", - "appIndex": 0, - "kmsIndex": 19, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "b743a2be-68d4-4dd3-af32-92425b7bb623", - "name": "Windows Server 2012 R2 Cloud Storage", - "appIndex": 0, - "kmsIndex": 20, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "00091344-1ea4-4f37-b789-01750ba6988c", - "name": "Windows Server 2012 R2 Datacenter", - "appIndex": 0, - "kmsIndex": 20, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "21db6ba4-9a7b-4a14-9e29-64a60c59301d", - "name": "Windows Server 2012 R2 Essentials", - "appIndex": 0, - "kmsIndex": 20, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "b3ca044e-a358-4d68-9883-aaa2941aca99", - "name": "Windows Server 2012 R2 Standard", - "appIndex": 0, - "kmsIndex": 20, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "3dbf341b-5f6c-4fa7-b936-699dce9e263f", - "name": "Windows Server 2016 Azure Core", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "7b4433f4-b1e7-4788-895a-c45378d38253", - "name": "Windows Server 2016 Cloud Storage", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "21c56779-b449-4d20-adfc-eece0e1ad74b", - "name": "Windows Server 2016 Datacenter", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "2b5a1b0f-a5ab-4c54-ac2f-a6d94824a283", - "name": "Windows Server 2016 Essentials", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "8c1c5410-9f39-4805-8c9d-63a07706358f", - "name": "Windows Server 2016 Standard", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "43d9af6e-5e86-4be8-a797-d072a046896c", - "name": "Windows Server 2016 ARM64", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "e49c08e7-da82-42f8-bde2-b570fbcae76c", - "name": "Windows Server 2016 Datacenter (Semi-Annual Channel)", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "61c5ef22-f14f-4553-a824-c4b31e84b100", - "name": "Windows Server 2016 Standard (Semi-Annual Channel)", - "appIndex": 0, - "kmsIndex": 21, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "ba947c44-d19d-4786-b6ae-22770bc94c54", - "name": "Windows Server 2016 Datacenter Preview", - "appIndex": 0, - "kmsIndex": 22, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "4f3d1606-3fea-4c01-be3c-8d671c401e3b", - "name": "Windows Vista Business", - "appIndex": 0, - "kmsIndex": 23, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "2c682dc2-8b68-4f63-a165-ae291d4cf138", - "name": "Windows Vista Business N", - "appIndex": 0, - "kmsIndex": 23, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "cfd8ff08-c0d7-452b-9f60-ef5c70c32094", - "name": "Windows Vista Enterprise", - "appIndex": 0, - "kmsIndex": 23, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "d4f54950-26f2-4fb4-ba21-ffab16afcade", - "name": "Windows Vista Enterprise N", - "appIndex": 0, - "kmsIndex": 23, - "protocolVersion": 4, - "nCountPolicy": 25, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 0 - }, - { - "guid": "8ce7e872-188c-4b98-9d90-f8f90b7aad02", - "name": "Office Access 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "cee5d470-6e3b-4fcc-8c2b-d17428568a9f", - "name": "Office Excel 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "8947d0b8-c33b-43e1-8c56-9b674c052832", - "name": "Office Groove 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "ca6b6639-4ad6-40ae-a575-14dee07f6430", - "name": "Office InfoPath 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "09ed9640-f020-400a-acd8-d7d867dfd9c2", - "name": "Office Mondo 1 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "ef3d4e49-a53d-4d81-a2b1-2ca6c2556b2c", - "name": "Office Mondo 2 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "ab586f5c-5256-4632-962f-fefd8b49e6f4", - "name": "Office OneNote 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "ecb7c192-73ab-4ded-acf4-2399b095d0cc", - "name": "Office OutLook 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "45593b1d-dfb1-4e91-bbfb-2d5d0ce2227a", - "name": "Office PowerPoint 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "6f327760-8c5c-417c-9b61-836a98287e0c", - "name": "Office Professional Plus 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "df133ff7-bf14-4f95-afe3-7b48e7e331ef", - "name": "Office Project Pro 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "5dc7bf61-5ec9-4996-9ccb-df806a2d0efe", - "name": "Office Project Standard 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "b50c4f75-599b-43e8-8dcd-1081a7967241", - "name": "Office Publisher 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "ea509e87-07a1-4a45-9edc-eba5a39f36af", - "name": "Office Small Business Basics 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "9da2a678-fb6b-4e67-ab84-60dd6a9c819a", - "name": "Office Standard 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "92236105-bb67-494f-94c7-7f7a607929bd", - "name": "Office Visio Premium 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "e558389c-83c3-4b29-adfe-5e4d7f46c358", - "name": "Office Visio Pro 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "9ed833ff-4f92-4f36-b370-8683a4f13275", - "name": "Office Visio Standard 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "2d0882e7-a4e7-423b-8ccc-70d91e0158b1", - "name": "Office Word 2010", - "appIndex": 1, - "kmsIndex": 24, - "protocolVersion": 4, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 1 - }, - { - "guid": "6ee7622c-18d8-4005-9fb7-92db644a279b", - "name": "Office Access 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "f7461d52-7c2b-43b2-8744-ea958e0bd09a", - "name": "Office Excel 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "a30b8040-d68a-423f-b0b5-9ce292ea5a8f", - "name": "Office InfoPath 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "1b9f11e3-c85c-4e1b-bb29-879ad2c909e3", - "name": "Office Lync 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "dc981c6b-fc8e-420f-aa43-f8f33e5c0923", - "name": "Office Mondo 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "efe1f3e6-aea2-4144-a208-32aa872b6545", - "name": "Office OneNote 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "771c3afa-50c5-443f-b151-ff2546d863a0", - "name": "Office OutLook 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "8c762649-97d1-4953-ad27-b7e2c25b972e", - "name": "Office PowerPoint 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "b322da9c-a2e2-4058-9e4e-f59a6970bd69", - "name": "Office Professional Plus 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "4a5d124a-e620-44ba-b6ff-658961b33b9a", - "name": "Office Project Pro 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "427a28d1-d17c-4abf-b717-32c780ba6f07", - "name": "Office Project Standard 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "00c79ff1-6850-443d-bf61-71cde0de305f", - "name": "Office Publisher 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "b13afb38-cd79-4ae5-9f7f-eed058d750ca", - "name": "Office Standard 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "e13ac10e-75d0-4aff-a0cd-764982cf541c", - "name": "Office Visio Pro 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "ac4efaf0-f81f-4f61-bdf7-ea32b02ab117", - "name": "Office Visio Standard 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "d9f5b1c6-5386-495a-88f9-9ad6b41ac9b3", - "name": "Office Word 2013", - "appIndex": 2, - "kmsIndex": 25, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 2 - }, - { - "guid": "44b538e2-fb34-4732-81e4-644c17d2e746", - "name": "Office Access 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "9373bfa0-97b3-4587-ab73-30934461d55c", - "name": "Office Excel 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "aa286eb4-556f-4eeb-967c-c1b771b7673e", - "name": "Office Groove 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "7ccc8256-fbaa-49c6-b2a9-f5afb4257cd2", - "name": "Office InfoPath 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "c53dfe17-cc00-4967-b188-a088a965494d", - "name": "Office Lync 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "2816a87d-e1ed-4097-b311-e2341c57b179", - "name": "Office Mondo 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "67c0f908-184f-4f64-8250-12db797ab3c3", - "name": "Office OneNote 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "7bce4e7a-dd80-4682-98fa-f993725803d2", - "name": "Office Outlook 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "1ec10c0a-54f6-453e-b85a-6fa1bbfea9b7", - "name": "Office PowerPoint 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "87d2b5bf-d47b-41fb-af62-71c382f5cc85", - "name": "Office Professional Plus 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "3cfe50a9-0e03-4b29-9754-9f193f07b71f", - "name": "Office Project Pro 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "39e49e57-ae68-4ee3-b098-26480df3da96", - "name": "Office Project Standard 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "15aa2117-8f79-49a8-8317-753026d6a054", - "name": "Office Publisher 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "cfbfd60e-0b5f-427d-917c-a4df42a80e44", - "name": "Office Visio Pro 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "7012cc81-8887-42e9-b17d-4e5e42760f0d", - "name": "Office Visio Standard 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "de9c7eb6-5a85-420d-9703-fff11bdd4d43", - "name": "Office Word 2013 (Pre-Release)", - "appIndex": 2, - "kmsIndex": 26, - "protocolVersion": 5, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 1, - "ePidIndex": 0 - }, - { - "guid": "67c0fc0c-deba-401b-bf8b-9c8ad8395804", - "name": "Office Access 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "c3e65d36-141f-4d2f-a303-a842ee756a29", - "name": "Office Excel 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "9caabccb-61b1-4b4b-8bec-d10a3c3ac2ce", - "name": "Office Mondo 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "e914ea6e-a5fa-4439-a394-a9bb3293ca09", - "name": "Office Mondo R 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "d8cace59-33d2-4ac7-9b1b-9b72339c51c8", - "name": "Office OneNote 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "ec9d9265-9d1e-4ed0-838a-cdc20f2551a1", - "name": "Office Outlook 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "d70b1bba-b893-4544-96e2-b7a318091c33", - "name": "Office Powerpoint 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "d450596f-894d-49e0-966a-fd39ed4c4c64", - "name": "Office Professional Plus 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "4f414197-0fc2-4c01-b68a-86cbb9ac254c", - "name": "Office Project Pro 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "829b8110-0e6f-4349-bca4-42803577788d", - "name": "Office Project Pro 2016 C2R", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "da7ddabc-3fbe-4447-9e01-6ab7440b4cd4", - "name": "Office Project Standard 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "cbbaca45-556a-4416-ad03-bda598eaa7c8", - "name": "Office Project Standard 2016 C2R", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "041a06cb-c5b8-4772-809f-416d03d16654", - "name": "Office Publisher 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "83e04ee1-fa8d-436d-8994-d31a862cab77", - "name": "Office Skype for Business 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "dedfa23d-6ed1-45a6-85dc-63cae0546de6", - "name": "Office Standard 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "6bf301c1-b94a-43e9-ba31-d494598c47fb", - "name": "Office Visio Pro 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "b234abe3-0857-4f9c-b05a-4dc314f85557", - "name": "Office Visio Pro 2016 C2R", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "aa2a7821-1827-4c2c-8f1d-4513a34dda97", - "name": "Office Visio Standard 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "361fe620-64f4-41b5-ba77-84f8e079b1f7", - "name": "Office Visio Standard 2016 C2R", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "bb11badf-d8aa-470e-9311-20eaf80fe5cc", - "name": "Office Word 2016", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "0bc88885-718c-491d-921f-6f214349e79c", - "name": "Office Professional Plus 2019 C2R Preview", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "fc7c4d0c-2e85-4bb9-afd4-01ed1476b5e9", - "name": "Office Project Pro 2019 C2R Preview", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "500f6619-ef93-4b75-bcb4-82819998a3ca", - "name": "Office Visio Pro 2019 C2R Preview", - "appIndex": 2, - "kmsIndex": 27, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 3 - }, - { - "guid": "9e9bceeb-e736-4f26-88de-763f87dcc485", - "name": "Office Access 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "237854e9-79fc-4497-a0c1-a70969691c6b", - "name": "Office Excel 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "c8f8a301-19f5-4132-96ce-2de9d4adbd33", - "name": "Office Outlook 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "3131fd61-5e4f-4308-8d6d-62be1987c92c", - "name": "Office Powerpoint 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "85dd8b5f-eaa4-4af3-a628-cce9e77c9a03", - "name": "Office Professional Plus 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "2ca2bf3f-949e-446a-82c7-e25a15ec78c4", - "name": "Office Project Pro 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "1777f0e3-7392-4198-97ea-8ae4de6f6381", - "name": "Office Project Standard 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "9d3e4cca-e172-46f1-a2f4-1d2107051444", - "name": "Office Publisher 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "734c6c6e-b0ba-4298-a891-671772b2bd1b", - "name": "Office Skype for Business 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "6912a74b-a5fb-401a-bfdb-2e3ab46f4b02", - "name": "Office Standard 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "5b5cf08f-b81a-431d-b080-3450d8620565", - "name": "Office Visio Pro 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "e06d7df3-aad0-419d-8dfb-0ac37e2bdf39", - "name": "Office Visio Standard 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 - }, - { - "guid": "059834fe-a8ea-4bff-b67b-4d006b5447d3", - "name": "Office Word 2019", - "appIndex": 2, - "kmsIndex": 28, - "protocolVersion": 6, - "nCountPolicy": 5, - "isRetail": 0, - "isPreview": 0, - "ePidIndex": 5 + skuItems: [ + { + guid: '8de8eb62-bbe0-40ac-ac17-f75595071ea3', + name: 'Windows Server 2019 ARM64', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a99cc1f0-7719-4306-9645-294102fbff95', + name: 'Windows Server 2019 Azure Core', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '34e1ae55-27f8-4950-8877-7a03be5fb181', + name: 'Windows Server 2019 Datacenter', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '034d3cbb-5d4b-4245-b3f8-f84571314078', + name: 'Windows Server 2019 Essentials', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'de32eafd-aaee-4662-9444-c1befb41bde2', + name: 'Windows Server 2019 Standard', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '90c362e5-0da1-4bfd-b53b-b87d309ade43', + name: 'Windows Server 2019 Datacenter (Semi-Annual Channel)', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '73e3957c-fc0c-400d-9184-5f7b6f2eb409', + name: 'Windows Server 2019 Standard (Semi-Annual Channel)', + appIndex: 0, + kmsIndex: 0, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '32d2fab3-e4a8-42c2-923b-4bf4fd13e6ee', + name: 'Windows 10 Enterprise LTSC 2019', + appIndex: 0, + kmsIndex: 1, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7103a333-b8c8-49cc-93ce-d37c09687f92', + name: 'Windows 10 Enterprise LTSC 2019 N', + appIndex: 0, + kmsIndex: 1, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e0b2d383-d112-413f-8a80-97f373a5820c', + name: 'Windows 10 Enterprise G', + appIndex: 0, + kmsIndex: 3, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 4 + }, + { + guid: 'e38454fb-41a4-4f59-a5dc-25080e354730', + name: 'Windows 10 Enterprise GN', + appIndex: 0, + kmsIndex: 3, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 4 + }, + { + guid: '2d5a5a60-3040-48bf-beb0-fcd770c20ce0', + name: 'Windows 10 Enterprise 2016 LTSB', + appIndex: 0, + kmsIndex: 4, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '9f776d83-7156-45b2-8a5c-359b9c9f22a3', + name: 'Windows 10 Enterprise 2016 LTSB N', + appIndex: 0, + kmsIndex: 4, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '58e97c99-f377-4ef1-81d5-4ad5522b5fd8', + name: 'Windows 10 Home', + appIndex: 0, + kmsIndex: 5, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a9107544-f4a0-4053-a96a-1479abdef912', + name: 'Windows 10 Home Country Specific', + appIndex: 0, + kmsIndex: 5, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7b9e1751-a8da-4f75-9560-5fadfe3d8e38', + name: 'Windows 10 Home N', + appIndex: 0, + kmsIndex: 5, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cd918a57-a41b-4c82-8dce-1a538e221a83', + name: 'Windows 10 Home Single Language', + appIndex: 0, + kmsIndex: 5, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e0c42288-980c-4788-a014-c080d2e1926e', + name: 'Windows 10 Education', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '3c102355-d027-42c6-ad23-2e7ef8a02585', + name: 'Windows 10 Education N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '73111121-5638-40f6-bc11-f1d7b0d64300', + name: 'Windows 10 Enterprise', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7b51a46c-0c04-4e8f-9af4-8496cca90d5e', + name: 'Windows 10 Enterprise 2015 LTSB', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '87b838b7-41b6-4590-8318-5797951d8529', + name: 'Windows 10 Enterprise 2015 LTSB N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e272e3e2-732f-4c65-a8f0-484747d0d947', + name: 'Windows 10 Enterprise N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '82bbc092-bc50-4e16-8e18-b74fc486aec3', + name: 'Windows 10 Professional Workstation', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '4b1571d3-bafb-4b40-8087-a961be2caf65', + name: 'Windows 10 Professional Workstation N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '2de67392-b7a7-462a-b1ca-108dd189f588', + name: 'Windows 10 Professional', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '3f1afc82-f8ac-4f6c-8005-1d233e606eee', + name: 'Windows 10 Professional Education', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '5300b18c-2e33-4dc2-8291-47ffcec746dd', + name: 'Windows 10 Professional Education N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a80b5abf-76ad-428b-b05d-a47d2dffeebf', + name: 'Windows 10 Professional N', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ff808201-fec6-4fd4-ae16-abbddade5706', + name: 'Windows 10 Professional Preview', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '43f2ab05-7c87-4d56-b27c-44d0f9a3dabd', + name: 'Windows 10 Enterprise Preview', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ec868e65-fadf-4759-b23e-93fe37f2cc29', + name: 'Windows 10 Enterprise for Virtual Desktops', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e4db50ea-bda1-4566-b047-0ca50abc6f07', + name: 'Windows 10 Remote Server', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '0df4f814-3f57-4b8b-9a9d-fddadcd69fac', + name: 'Windows 10 S (Lean)', + appIndex: 0, + kmsIndex: 6, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ae2ee509-1b34-41c0-acb7-6d4650168915', + name: 'Windows 7 Enterprise', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '46bbed08-9c7b-48fc-a614-95250573f4ea', + name: 'Windows 7 Enterprise E', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '1cb6d605-11b3-4e14-bb30-da91c8e3983a', + name: 'Windows 7 Enterprise N', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'b92e9980-b9d5-4821-9c94-140f632f6312', + name: 'Windows 7 Professional', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '5a041529-fef8-4d07-b06f-b59b573b32d2', + name: 'Windows 7 Professional E', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '54a09a0d-d57b-4c10-8b69-a842d6590ad5', + name: 'Windows 7 Professional N', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'db537896-376f-48ae-a492-53d0547773d0', + name: 'Windows 7 Embedded POSReady', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e1a8296a-db37-44d1-8cce-7bc961d59c54', + name: 'Windows 7 Embedded Standard', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'aa6dd3aa-c2b4-40e2-a544-a6bbb3f5c395', + name: 'Windows 7 ThinPC', + appIndex: 0, + kmsIndex: 7, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'c04ed6bf-55c8-4b47-9f8e-5a1f31ceee60', + name: 'Windows 8 Core', + appIndex: 0, + kmsIndex: 8, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '9d5584a2-2d85-419a-982c-a00888bb9ddf', + name: 'Windows 8 Core Country Specific', + appIndex: 0, + kmsIndex: 8, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '197390a0-65f6-4a95-bdc4-55d58a3b0253', + name: 'Windows 8 Core N', + appIndex: 0, + kmsIndex: 8, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '8860fcd4-a77b-4a20-9045-a150ff11d609', + name: 'Windows 8 Core Single Language', + appIndex: 0, + kmsIndex: 8, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a00018a3-f20f-4632-bf7c-8daa5351c914', + name: 'Windows 8 Professional WMC', + appIndex: 0, + kmsIndex: 8, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '10018baf-ce21-4060-80bd-47fe74ed4dab', + name: 'Windows 8 Embedded Industry Professional', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '18db1848-12e0-4167-b9d7-da7fcda507db', + name: 'Windows 8 Embedded Industry Enterprise', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '458e1bec-837a-45f6-b9d5-925ed5d299de', + name: 'Windows 8 Enterprise', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e14997e7-800a-4cf7-ad10-de4b45b578db', + name: 'Windows 8 Enterprise N', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a98bcd6d-5343-4603-8afe-5908e4611112', + name: 'Windows 8 Professional', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ebf245c1-29a8-4daf-9cb1-38dfc608a8c8', + name: 'Windows 8 Professional N', + appIndex: 0, + kmsIndex: 9, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'fe1c3238-432a-43a1-8e25-97e7d1ef10f3', + name: 'Windows 8.1 Core', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ffee456a-cd87-4390-8e07-16146c672fd0', + name: 'Windows 8.1 Core ARM', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'db78b74f-ef1c-4892-abfe-1e66b8231df6', + name: 'Windows 8.1 Core Country Specific', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '78558a64-dc19-43fe-a0d0-8075b2a370a3', + name: 'Windows 8.1 Core N', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'c72c6a1d-f252-4e7e-bdd1-3fca342acb35', + name: 'Windows 8.1 Core Single Language', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e58d87b5-8126-4580-80fb-861b22f79296', + name: 'Windows 8.1 Professional Student', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cab491c7-a918-4f60-b502-dab75e334f40', + name: 'Windows 8.1 Professional Student N', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '096ce63d-4fac-48a9-82a9-61ae9e800e5f', + name: 'Windows 8.1 Professional WMC', + appIndex: 0, + kmsIndex: 10, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 1, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e9942b32-2e55-4197-b0bd-5ff58cba8860', + name: 'Windows 8.1 Core Connected', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ba998212-460a-44db-bfb5-71bf09d1c68b', + name: 'Windows 8.1 Core Connected Country Specific', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'c6ddecd6-2354-4c19-909b-306a3058484e', + name: 'Windows 8.1 Core Connected N', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'b8f5e3a3-ed33-4608-81e1-37d6c9dcfd9c', + name: 'Windows 8.1 Core Connected Single Language', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '81671aaf-79d1-4eb1-b004-8cbbe173afea', + name: 'Windows 8.1 Enterprise', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '113e705c-fa49-48a4-beea-7dd879b46b14', + name: 'Windows 8.1 Enterprise N', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'c06b6981-d7fd-4a35-b7b4-054742b7af67', + name: 'Windows 8.1 Professional', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7476d79f-8e48-49b4-ab63-4d0b813a16e4', + name: 'Windows 8.1 Professional N', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '0ab82d54-47f4-4acb-818c-cc5bf0ecb649', + name: 'Windows 8.1 Embedded Industry Professional', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'f7e88590-dfc7-4c78-bccb-6f3865b99d1a', + name: 'Windows 8.1 Embedded Industry Automotive', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cd4e2d9f-5059-4a50-a92d-05d5bb1267c7', + name: 'Windows 8.1 Embedded Industry Enterprise', + appIndex: 0, + kmsIndex: 11, + protocolVersion: 6, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cde952c7-2f96-4d9d-8f2b-2d349f64fc51', + name: 'Windows 10 Enterprise Preview', + appIndex: 0, + kmsIndex: 12, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'a4383e6b-dada-423d-a43d-f25678429676', + name: 'Windows 10 Professional Preview', + appIndex: 0, + kmsIndex: 12, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'cf59a07b-1a2a-4be0-bfe0-423b5823e663', + name: 'Windows 10 Professional WMC Preview', + appIndex: 0, + kmsIndex: 12, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '2b9c337f-7a1d-4271-90a3-c6855a2b8a1c', + name: 'Windows 8.x Preview', + appIndex: 0, + kmsIndex: 12, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '631ead72-a8ab-4df8-bbdf-372029989bdd', + name: 'Windows 8.x Preview ARM', + appIndex: 0, + kmsIndex: 12, + protocolVersion: 5, + nCountPolicy: 25, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'ddfa9f7c-f09e-40b9-8c1a-be877a9a7f4b', + name: 'Windows Server 2008 Web', + appIndex: 0, + kmsIndex: 13, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7afb1156-2c1d-40fc-b260-aab7442b62fe', + name: 'Windows Server 2008 Compute Cluster', + appIndex: 0, + kmsIndex: 13, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ad2542d4-9154-4c6d-8a44-30f11ee96989', + name: 'Windows Server 2008 Standard', + appIndex: 0, + kmsIndex: 14, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '2401e3d0-c50a-4b58-87b2-7e794b7d2607', + name: 'Windows Server 2008 Standard without Hyper-V', + appIndex: 0, + kmsIndex: 14, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'c1af4d90-d1bc-44ca-85d4-003ba33db3b9', + name: 'Windows Server 2008 Enterprise', + appIndex: 0, + kmsIndex: 14, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '8198490a-add0-47b2-b3ba-316b12d647b4', + name: 'Windows Server 2008 Enterprise without Hyper-V', + appIndex: 0, + kmsIndex: 14, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '68b6e220-cf09-466b-92d3-45cd964b9509', + name: 'Windows Server 2008 Datacenter', + appIndex: 0, + kmsIndex: 15, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'fd09ef77-5647-4eff-809c-af2b64659a45', + name: 'Windows Server 2008 Datacenter without Hyper-V', + appIndex: 0, + kmsIndex: 15, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '01ef176b-3e0d-422a-b4f8-4ea880035e8f', + name: 'Windows Server 2008 for Itanium', + appIndex: 0, + kmsIndex: 15, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'f772515c-0e87-48d5-a676-e6962c3e1195', + name: 'Windows MultiPoint Server 2010', + appIndex: 0, + kmsIndex: 16, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'a78b8bd9-8017-4df5-b86a-09f756affa7c', + name: 'Windows Server 2008 R2 Web', + appIndex: 0, + kmsIndex: 16, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cda18cf3-c196-46ad-b289-60c072869994', + name: 'Windows Server 2008 R2 HPC Edition', + appIndex: 0, + kmsIndex: 16, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '68531fb9-5511-4989-97be-d11a0f55633f', + name: 'Windows Server 2008 R2 Standard', + appIndex: 0, + kmsIndex: 17, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '620e2b3d-09e7-42fd-802a-17a13652fe7a', + name: 'Windows Server 2008 R2 Enterprise', + appIndex: 0, + kmsIndex: 17, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7482e61b-c589-4b7f-8ecc-46d455ac3b87', + name: 'Windows Server 2008 R2 Datacenter', + appIndex: 0, + kmsIndex: 18, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '8a26851c-1c7e-48d3-a687-fbca9b9ac16b', + name: 'Windows Server 2008 R2 for Itanium Enterprise', + appIndex: 0, + kmsIndex: 18, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'd3643d60-0c42-412d-a7d6-52e6635327f6', + name: 'Windows Server 2012 Datacenter', + appIndex: 0, + kmsIndex: 19, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '95fd1c83-7df5-494a-be8b-1300e1c9d1cd', + name: 'Windows Server 2012 MultiPoint Premium', + appIndex: 0, + kmsIndex: 19, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7d5486c7-e120-4771-b7f1-7b56c6d3170c', + name: 'Windows Server 2012 MultiPoint Standard', + appIndex: 0, + kmsIndex: 19, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'f0f5ec41-0d55-4732-af02-440a44a3cf0f', + name: 'Windows Server 2012 Standard', + appIndex: 0, + kmsIndex: 19, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'b743a2be-68d4-4dd3-af32-92425b7bb623', + name: 'Windows Server 2012 R2 Cloud Storage', + appIndex: 0, + kmsIndex: 20, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '00091344-1ea4-4f37-b789-01750ba6988c', + name: 'Windows Server 2012 R2 Datacenter', + appIndex: 0, + kmsIndex: 20, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '21db6ba4-9a7b-4a14-9e29-64a60c59301d', + name: 'Windows Server 2012 R2 Essentials', + appIndex: 0, + kmsIndex: 20, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'b3ca044e-a358-4d68-9883-aaa2941aca99', + name: 'Windows Server 2012 R2 Standard', + appIndex: 0, + kmsIndex: 20, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '3dbf341b-5f6c-4fa7-b936-699dce9e263f', + name: 'Windows Server 2016 Azure Core', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '7b4433f4-b1e7-4788-895a-c45378d38253', + name: 'Windows Server 2016 Cloud Storage', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '21c56779-b449-4d20-adfc-eece0e1ad74b', + name: 'Windows Server 2016 Datacenter', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '2b5a1b0f-a5ab-4c54-ac2f-a6d94824a283', + name: 'Windows Server 2016 Essentials', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '8c1c5410-9f39-4805-8c9d-63a07706358f', + name: 'Windows Server 2016 Standard', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '43d9af6e-5e86-4be8-a797-d072a046896c', + name: 'Windows Server 2016 ARM64', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'e49c08e7-da82-42f8-bde2-b570fbcae76c', + name: 'Windows Server 2016 Datacenter (Semi-Annual Channel)', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '61c5ef22-f14f-4553-a824-c4b31e84b100', + name: 'Windows Server 2016 Standard (Semi-Annual Channel)', + appIndex: 0, + kmsIndex: 21, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'ba947c44-d19d-4786-b6ae-22770bc94c54', + name: 'Windows Server 2016 Datacenter Preview', + appIndex: 0, + kmsIndex: 22, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '4f3d1606-3fea-4c01-be3c-8d671c401e3b', + name: 'Windows Vista Business', + appIndex: 0, + kmsIndex: 23, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '2c682dc2-8b68-4f63-a165-ae291d4cf138', + name: 'Windows Vista Business N', + appIndex: 0, + kmsIndex: 23, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'cfd8ff08-c0d7-452b-9f60-ef5c70c32094', + name: 'Windows Vista Enterprise', + appIndex: 0, + kmsIndex: 23, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: 'd4f54950-26f2-4fb4-ba21-ffab16afcade', + name: 'Windows Vista Enterprise N', + appIndex: 0, + kmsIndex: 23, + protocolVersion: 4, + nCountPolicy: 25, + isRetail: 0, + isPreview: 0, + ePidIndex: 0 + }, + { + guid: '8ce7e872-188c-4b98-9d90-f8f90b7aad02', + name: 'Office Access 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'cee5d470-6e3b-4fcc-8c2b-d17428568a9f', + name: 'Office Excel 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '8947d0b8-c33b-43e1-8c56-9b674c052832', + name: 'Office Groove 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'ca6b6639-4ad6-40ae-a575-14dee07f6430', + name: 'Office InfoPath 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '09ed9640-f020-400a-acd8-d7d867dfd9c2', + name: 'Office Mondo 1 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'ef3d4e49-a53d-4d81-a2b1-2ca6c2556b2c', + name: 'Office Mondo 2 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'ab586f5c-5256-4632-962f-fefd8b49e6f4', + name: 'Office OneNote 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'ecb7c192-73ab-4ded-acf4-2399b095d0cc', + name: 'Office OutLook 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '45593b1d-dfb1-4e91-bbfb-2d5d0ce2227a', + name: 'Office PowerPoint 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '6f327760-8c5c-417c-9b61-836a98287e0c', + name: 'Office Professional Plus 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'df133ff7-bf14-4f95-afe3-7b48e7e331ef', + name: 'Office Project Pro 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '5dc7bf61-5ec9-4996-9ccb-df806a2d0efe', + name: 'Office Project Standard 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'b50c4f75-599b-43e8-8dcd-1081a7967241', + name: 'Office Publisher 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'ea509e87-07a1-4a45-9edc-eba5a39f36af', + name: 'Office Small Business Basics 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '9da2a678-fb6b-4e67-ab84-60dd6a9c819a', + name: 'Office Standard 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '92236105-bb67-494f-94c7-7f7a607929bd', + name: 'Office Visio Premium 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: 'e558389c-83c3-4b29-adfe-5e4d7f46c358', + name: 'Office Visio Pro 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '9ed833ff-4f92-4f36-b370-8683a4f13275', + name: 'Office Visio Standard 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '2d0882e7-a4e7-423b-8ccc-70d91e0158b1', + name: 'Office Word 2010', + appIndex: 1, + kmsIndex: 24, + protocolVersion: 4, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 1 + }, + { + guid: '6ee7622c-18d8-4005-9fb7-92db644a279b', + name: 'Office Access 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'f7461d52-7c2b-43b2-8744-ea958e0bd09a', + name: 'Office Excel 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'a30b8040-d68a-423f-b0b5-9ce292ea5a8f', + name: 'Office InfoPath 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '1b9f11e3-c85c-4e1b-bb29-879ad2c909e3', + name: 'Office Lync 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'dc981c6b-fc8e-420f-aa43-f8f33e5c0923', + name: 'Office Mondo 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'efe1f3e6-aea2-4144-a208-32aa872b6545', + name: 'Office OneNote 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '771c3afa-50c5-443f-b151-ff2546d863a0', + name: 'Office OutLook 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '8c762649-97d1-4953-ad27-b7e2c25b972e', + name: 'Office PowerPoint 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'b322da9c-a2e2-4058-9e4e-f59a6970bd69', + name: 'Office Professional Plus 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '4a5d124a-e620-44ba-b6ff-658961b33b9a', + name: 'Office Project Pro 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '427a28d1-d17c-4abf-b717-32c780ba6f07', + name: 'Office Project Standard 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '00c79ff1-6850-443d-bf61-71cde0de305f', + name: 'Office Publisher 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'b13afb38-cd79-4ae5-9f7f-eed058d750ca', + name: 'Office Standard 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'e13ac10e-75d0-4aff-a0cd-764982cf541c', + name: 'Office Visio Pro 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'ac4efaf0-f81f-4f61-bdf7-ea32b02ab117', + name: 'Office Visio Standard 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: 'd9f5b1c6-5386-495a-88f9-9ad6b41ac9b3', + name: 'Office Word 2013', + appIndex: 2, + kmsIndex: 25, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 2 + }, + { + guid: '44b538e2-fb34-4732-81e4-644c17d2e746', + name: 'Office Access 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '9373bfa0-97b3-4587-ab73-30934461d55c', + name: 'Office Excel 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'aa286eb4-556f-4eeb-967c-c1b771b7673e', + name: 'Office Groove 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '7ccc8256-fbaa-49c6-b2a9-f5afb4257cd2', + name: 'Office InfoPath 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'c53dfe17-cc00-4967-b188-a088a965494d', + name: 'Office Lync 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '2816a87d-e1ed-4097-b311-e2341c57b179', + name: 'Office Mondo 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '67c0f908-184f-4f64-8250-12db797ab3c3', + name: 'Office OneNote 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '7bce4e7a-dd80-4682-98fa-f993725803d2', + name: 'Office Outlook 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '1ec10c0a-54f6-453e-b85a-6fa1bbfea9b7', + name: 'Office PowerPoint 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '87d2b5bf-d47b-41fb-af62-71c382f5cc85', + name: 'Office Professional Plus 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '3cfe50a9-0e03-4b29-9754-9f193f07b71f', + name: 'Office Project Pro 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '39e49e57-ae68-4ee3-b098-26480df3da96', + name: 'Office Project Standard 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '15aa2117-8f79-49a8-8317-753026d6a054', + name: 'Office Publisher 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'cfbfd60e-0b5f-427d-917c-a4df42a80e44', + name: 'Office Visio Pro 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '7012cc81-8887-42e9-b17d-4e5e42760f0d', + name: 'Office Visio Standard 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: 'de9c7eb6-5a85-420d-9703-fff11bdd4d43', + name: 'Office Word 2013 (Pre-Release)', + appIndex: 2, + kmsIndex: 26, + protocolVersion: 5, + nCountPolicy: 5, + isRetail: 0, + isPreview: 1, + ePidIndex: 0 + }, + { + guid: '67c0fc0c-deba-401b-bf8b-9c8ad8395804', + name: 'Office Access 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'c3e65d36-141f-4d2f-a303-a842ee756a29', + name: 'Office Excel 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '9caabccb-61b1-4b4b-8bec-d10a3c3ac2ce', + name: 'Office Mondo 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'e914ea6e-a5fa-4439-a394-a9bb3293ca09', + name: 'Office Mondo R 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'd8cace59-33d2-4ac7-9b1b-9b72339c51c8', + name: 'Office OneNote 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'ec9d9265-9d1e-4ed0-838a-cdc20f2551a1', + name: 'Office Outlook 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'd70b1bba-b893-4544-96e2-b7a318091c33', + name: 'Office Powerpoint 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'd450596f-894d-49e0-966a-fd39ed4c4c64', + name: 'Office Professional Plus 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '4f414197-0fc2-4c01-b68a-86cbb9ac254c', + name: 'Office Project Pro 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '829b8110-0e6f-4349-bca4-42803577788d', + name: 'Office Project Pro 2016 C2R', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'da7ddabc-3fbe-4447-9e01-6ab7440b4cd4', + name: 'Office Project Standard 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'cbbaca45-556a-4416-ad03-bda598eaa7c8', + name: 'Office Project Standard 2016 C2R', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '041a06cb-c5b8-4772-809f-416d03d16654', + name: 'Office Publisher 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '83e04ee1-fa8d-436d-8994-d31a862cab77', + name: 'Office Skype for Business 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'dedfa23d-6ed1-45a6-85dc-63cae0546de6', + name: 'Office Standard 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '6bf301c1-b94a-43e9-ba31-d494598c47fb', + name: 'Office Visio Pro 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'b234abe3-0857-4f9c-b05a-4dc314f85557', + name: 'Office Visio Pro 2016 C2R', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'aa2a7821-1827-4c2c-8f1d-4513a34dda97', + name: 'Office Visio Standard 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '361fe620-64f4-41b5-ba77-84f8e079b1f7', + name: 'Office Visio Standard 2016 C2R', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'bb11badf-d8aa-470e-9311-20eaf80fe5cc', + name: 'Office Word 2016', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '0bc88885-718c-491d-921f-6f214349e79c', + name: 'Office Professional Plus 2019 C2R Preview', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: 'fc7c4d0c-2e85-4bb9-afd4-01ed1476b5e9', + name: 'Office Project Pro 2019 C2R Preview', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '500f6619-ef93-4b75-bcb4-82819998a3ca', + name: 'Office Visio Pro 2019 C2R Preview', + appIndex: 2, + kmsIndex: 27, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 3 + }, + { + guid: '9e9bceeb-e736-4f26-88de-763f87dcc485', + name: 'Office Access 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '237854e9-79fc-4497-a0c1-a70969691c6b', + name: 'Office Excel 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: 'c8f8a301-19f5-4132-96ce-2de9d4adbd33', + name: 'Office Outlook 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '3131fd61-5e4f-4308-8d6d-62be1987c92c', + name: 'Office Powerpoint 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '85dd8b5f-eaa4-4af3-a628-cce9e77c9a03', + name: 'Office Professional Plus 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '2ca2bf3f-949e-446a-82c7-e25a15ec78c4', + name: 'Office Project Pro 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '1777f0e3-7392-4198-97ea-8ae4de6f6381', + name: 'Office Project Standard 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '9d3e4cca-e172-46f1-a2f4-1d2107051444', + name: 'Office Publisher 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '734c6c6e-b0ba-4298-a891-671772b2bd1b', + name: 'Office Skype for Business 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '6912a74b-a5fb-401a-bfdb-2e3ab46f4b02', + name: 'Office Standard 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '5b5cf08f-b81a-431d-b080-3450d8620565', + name: 'Office Visio Pro 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: 'e06d7df3-aad0-419d-8dfb-0ac37e2bdf39', + name: 'Office Visio Standard 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 + }, + { + guid: '059834fe-a8ea-4bff-b67b-4d006b5447d3', + name: 'Office Word 2019', + appIndex: 2, + kmsIndex: 28, + protocolVersion: 6, + nCountPolicy: 5, + isRetail: 0, + isPreview: 0, + ePidIndex: 5 } ], - "hostBuilds": [ + hostBuilds: [ { - "buildNumber": 17763, - "platformId": 3612, - "displayName": "Windows 10 1809 / Server 2019", - "flags": 7, - "releaseDate": 1538438400 + buildNumber: 17763, + platformId: 3612, + displayName: 'Windows 10 1809 / Server 2019', + flags: 7, + releaseDate: 1538438400 }, { - "buildNumber": 14393, - "platformId": 3612, - "displayName": "Windows 10 1607 / Server 2016", - "flags": 7, - "releaseDate": 1470096000 + buildNumber: 14393, + platformId: 3612, + displayName: 'Windows 10 1607 / Server 2016', + flags: 7, + releaseDate: 1470096000 }, { - "buildNumber": 9600, - "platformId": 6401, - "displayName": "Windows 8.1 / Server 2012 R2", - "flags": 7, - "releaseDate": 1382054400 + buildNumber: 9600, + platformId: 6401, + displayName: 'Windows 8.1 / Server 2012 R2', + flags: 7, + releaseDate: 1382054400 }, { - "buildNumber": 9200, - "platformId": 5426, - "displayName": "Windows 8 / Server 2012", - "flags": 7, - "releaseDate": 1351209600 + buildNumber: 9200, + platformId: 5426, + displayName: 'Windows 8 / Server 2012', + flags: 7, + releaseDate: 1351209600 }, { - "buildNumber": 7601, - "platformId": 55041, - "displayName": "Windows 7 / Server 2008 R2 SP1", - "flags": 6, - "releaseDate": 1298332800 + buildNumber: 7601, + platformId: 55041, + displayName: 'Windows 7 / Server 2008 R2 SP1', + flags: 6, + releaseDate: 1298332800 }, { - "buildNumber": 6002, - "platformId": 55041, - "displayName": "Windows Vista / Server 2008 SP2", - "flags": 6, - "releaseDate": 1243296000 + buildNumber: 6002, + platformId: 55041, + displayName: 'Windows Vista / Server 2008 SP2', + flags: 6, + releaseDate: 1243296000 } ] -}; +} // ─── 数据查询工具函数 ────────────────────────────────────────────────────── @@ -2743,13 +2743,13 @@ export const KmsData: KmsDatabase = { export function getProductIndex( guid: string, list: ReadonlyArray<{ guid: string }>, - count: number, + count: number ): number { - const needle = guid.toLowerCase(); + const needle = guid.toLowerCase() for (let i = 0; i < count && i < list.length; i++) { - if (list[i].guid.toLowerCase() === needle) return i; + if (list[i].guid.toLowerCase() === needle) return i } - return -1; + return -1 } /** @@ -2760,6 +2760,6 @@ export function getProductIndex( * @returns 匹配的 SkuItem,未找到返回 undefined */ export function findLicensePackByName(name: string): SkuItem | undefined { - const needle = name.toLowerCase(); - return KmsData.skuItems.find((sku) => sku.name.toLowerCase().includes(needle)); + const needle = name.toLowerCase() + return KmsData.skuItems.find(sku => sku.name.toLowerCase().includes(needle)) } diff --git a/node-vlmcs/src/helpers.ts b/node-vlmcs/src/helpers.ts index b35ceba4..0477271a 100644 --- a/node-vlmcs/src/helpers.ts +++ b/node-vlmcs/src/helpers.ts @@ -16,45 +16,49 @@ * 参考: src/network.c 中 getSocketList() 的地址解析逻辑 */ export function parseAddress(addr: string): { host: string; port: string } { - const defaultPort = '1688'; + const defaultPort = '1688' // IPv6 方括号表示法: [::1]:port 或 [::1] if (addr.startsWith('[')) { - const closeBracket = addr.indexOf(']'); + const closeBracket = addr.indexOf(']') if (closeBracket === -1) { - return { host: addr, port: defaultPort }; + return { host: addr, port: defaultPort } } - const host = addr.slice(1, closeBracket); - const rest = addr.slice(closeBracket + 1); + const host = addr.slice(1, closeBracket) + const rest = addr.slice(closeBracket + 1) if (rest.startsWith(':') && rest.length > 1) { - return { host, port: rest.slice(1) }; + return { host, port: rest.slice(1) } } - return { host, port: defaultPort }; + return { host, port: defaultPort } } // 如果包含多个冒号,说明是裸 IPv6 地址(无端口) - const firstColon = addr.indexOf(':'); + const firstColon = addr.indexOf(':') if (firstColon !== -1 && addr.indexOf(':', firstColon + 1) !== -1) { - return { host: addr, port: defaultPort }; + return { host: addr, port: defaultPort } } // IPv4 或主机名,可选 :port if (firstColon !== -1) { - return { host: addr.slice(0, firstColon), port: addr.slice(firstColon + 1) }; + return { host: addr.slice(0, firstColon), port: addr.slice(firstColon + 1) } } - return { host: addr, port: defaultPort }; + return { host: addr, port: defaultPort } } /** * 解析十进制整数字符串,验证范围 [min, max] * 无效或超出范围返回 null */ -export function stringToInt(str: string, min: number, max: number): number | null { - if (!/^-?\d+$/.test(str)) return null; - const val = parseInt(str, 10); - if (!Number.isFinite(val) || val < min || val > max) return null; - return val; +export function stringToInt( + str: string, + min: number, + max: number +): number | null { + if (!/^-?\d+$/.test(str)) return null + const val = parseInt(str, 10) + if (!Number.isFinite(val) || val < min || val > max) return null + return val } /** @@ -62,7 +66,7 @@ export function stringToInt(str: string, min: number, max: number): number | nul * 参考: src/vlmcs.c 中 getArgumentBool() 的实现 */ export function getArgumentBool(arg: string): boolean | null { - if (arg === '1') return true; - if (arg === '0') return false; - return null; + if (arg === '1') return true + if (arg === '0') return false + return null } diff --git a/node-vlmcs/src/index.ts b/node-vlmcs/src/index.ts index cc90c4b5..7b600744 100644 --- a/node-vlmcs/src/index.ts +++ b/node-vlmcs/src/index.ts @@ -7,13 +7,13 @@ import { ucs2ToUtf8, unixTimeToFileTime, PID_BUFFER_SIZE, - WORKSTATION_NAME_BUFFER, + WORKSTATION_NAME_BUFFER } from './types' import { createRequestV4, createRequestV6, decryptResponseV4, - decryptResponseV6, + decryptResponseV6 } from './kms' import { rpcBindClient, rpcSendRequest } from './rpc' import { get16RandomBytes } from './crypto' @@ -47,7 +47,7 @@ export interface VlmcsCheckResult { function connectSocket( host: string, port: number, - timeout: number, + timeout: number ): Promise { return new Promise((resolve, reject) => { const socket = net.createConnection({ host, port }) @@ -88,7 +88,7 @@ function normalizeEdition(edition: number): number { function normalizeProtocol( protocol: number | undefined, - fallback: number, + fallback: number ): number { const raw = Number(protocol) if (!Number.isFinite(raw)) return fallback @@ -109,7 +109,7 @@ function randomWorkstationName(): string { function buildRequest({ protocol, - edition, + edition }: { protocol: number edition: number @@ -141,7 +141,7 @@ function buildRequest({ utf8ToUcs2(randomWorkstationName(), WORKSTATION_NAME_BUFFER).copy( request, - 108, + 108 ) return request } @@ -156,7 +156,7 @@ interface ParsedKmsResult { function parseKmsResponse( rawResponse: Buffer, - rawRequest: Buffer, + rawRequest: Buffer ): ParsedKmsResult { const responseMajorVersion = rawResponse.readUInt16LE(2) @@ -168,7 +168,7 @@ function parseKmsResponse( status: false, ePID: '', hwid: Buffer.alloc(8), - response, + response } } const ePID = ucs2ToUtf8(response.kmsPID, PID_BUFFER_SIZE) @@ -177,7 +177,7 @@ function parseKmsResponse( status: true, ePID, hwid: Buffer.alloc(8), - response, + response } } @@ -188,7 +188,7 @@ function parseKmsResponse( status: false, ePID: '', hwid, - response, + response } } @@ -202,7 +202,7 @@ function parseKmsResponse( status: true, ePID, hwid, - response, + response } } @@ -211,7 +211,7 @@ function parseKmsResponse( status: true, ePID, hwid, - response, + response } } @@ -269,7 +269,7 @@ async function captureVerboseOutput(fn: () => Promise): Promise<{ } export async function runVlmcs( - params: VlmcsCheckParams, + params: VlmcsCheckParams ): Promise { const { host, timeout = DEFAULT_TIMEOUT_MS, verbose = false } = params const portRaw = Number(params.port ?? 1688) @@ -304,7 +304,7 @@ export async function runVlmcs( host, status: false, delay: -1, - content: `RPC bind failed: ${bind.status}`, + content: `RPC bind failed: ${bind.status}` } } @@ -319,7 +319,7 @@ export async function runVlmcs( if (verbose) { process.stdout.write( - `Sending activation request (KMS V${protocol}) 1 of 1 `, + `Sending activation request (KMS V${protocol}) 1 of 1 ` ) } @@ -328,7 +328,7 @@ export async function runVlmcs( request, bind.rpcFlags, true, - false, + false ) if (rpcResult.status !== 0 || !rpcResult.kmsResponse) { @@ -336,7 +336,7 @@ export async function runVlmcs( host, status: false, delay: -1, - content: `KMS request failed: 0x${(rpcResult.status >>> 0).toString(16).toUpperCase().padStart(8, '0')}`, + content: `KMS request failed: 0x${(rpcResult.status >>> 0).toString(16).toUpperCase().padStart(8, '0')}` } } @@ -347,7 +347,7 @@ export async function runVlmcs( parsed.ePID, parsed.hwid, parsed.response, - rpcResult.kmsResponse.length, + rpcResult.kmsResponse.length ) } @@ -355,14 +355,14 @@ export async function runVlmcs( host, status: parsed.status, delay: parsed.status ? measureElapsedMs(startedAtNs) : -1, - content: parsed.summary, + content: parsed.summary } } catch (error) { return { host, status: false, delay: -1, - content: error instanceof Error ? error.message : String(error), + content: error instanceof Error ? error.message : String(error) } } finally { if (socket) { @@ -378,6 +378,6 @@ export async function runVlmcs( const { result, output } = await captureVerboseOutput(executeCheck) return { ...result, - content: output || result.content, + content: output || result.content } } diff --git a/node-vlmcs/src/kms.ts b/node-vlmcs/src/kms.ts index 42604c7b..8a5413aa 100644 --- a/node-vlmcs/src/kms.ts +++ b/node-vlmcs/src/kms.ts @@ -18,77 +18,77 @@ import { aesDecryptCbc, sha256, sha256Hmac, - get16RandomBytes, -} from './crypto'; + get16RandomBytes +} from './crypto' -import { - PID_BUFFER_SIZE, - ResponseResult, -} from './types'; +import { PID_BUFFER_SIZE, ResponseResult } from './types' // 重新导出时间工具函数 -export { unixTimeToFileTime as getUnixTimeAsFileTime, fileTimeToUnixTime } from './types'; +export { + unixTimeToFileTime as getUnixTimeAsFileTime, + fileTimeToUnixTime +} from './types' // ─── 协议大小常量 (参考 src/kms.h 中的结构体大小) ────────────────────────── // REQUEST 结构: Version(4) + VMInfo(4) + LicenseStatus(4) + BindingExpiration(4) + // AppID(16) + ActID(16) + KMSID(16) + CMID(16) + N_Policy(4) + // ClientTime(8) + CMID_prev(16) + WorkstationName(128) = 236 字节 -const REQUEST_SIZE = 236; +const REQUEST_SIZE = 236 /** V4 请求大小: REQUEST(236) + AES-CMAC(16) = 252 字节 */ -const REQUEST_V4_SIZE = 252; +const REQUEST_V4_SIZE = 252 /** V5/V6 请求大小: Version(4) + IV(16) + REQUEST(236) + Pad(4) = 260 字节 */ -const REQUEST_V6_SIZE = 260; +const REQUEST_V6_SIZE = 260 /** V4 响应中 ePID 前面的字段大小: Version(4) + PIDSize(4) = 8 字节 */ -const V4_PRE_EPID_SIZE = 8; +const V4_PRE_EPID_SIZE = 8 /** V4 响应中 ePID 后面的字段大小: CMID(16) + ClientTime(8) + Count(4) + VLActivation(4) + VLRenewal(4) = 36 字节 */ -const V4_POST_EPID_SIZE = 36; +const V4_POST_EPID_SIZE = 36 /** V6 未加密部分大小: Version(4) + IV(16) = 20 字节 */ -const V6_UNENCRYPTED_SIZE = 20; +const V6_UNENCRYPTED_SIZE = 20 /** V6 响应中 ePID 前面的字段大小: V6未加密(20) + ResponseBase.Version(4) + PIDSize(4) = 28 字节 */ -const V6_PRE_EPID_SIZE = 28; +const V6_PRE_EPID_SIZE = 28 /** V5 响应中 ePID 后面的额外字段: V4后(36) + RandomXoredIVs(16) + Hash(32) = 84 字节 */ -const V5_POST_EPID_SIZE = 84; +const V5_POST_EPID_SIZE = 84 /** V6 响应中 ePID 后面的额外字段: V5后(84) + HwId(8) + XoredIVs(16) + HMAC(16) = 124 字节 */ -const V6_POST_EPID_SIZE = 124; +const V6_POST_EPID_SIZE = 124 /** V6 解密大小: IV(16) + REQUEST(236) + Pad(4) = 256 字节 */ -const V6_DECRYPT_SIZE = 256; +const V6_DECRYPT_SIZE = 256 -const HMAC_SIZE = 16; -const HASH_SIZE = 32; -const HALF_HASH_SIZE = HASH_SIZE >> 1; +const HMAC_SIZE = 16 +const HASH_SIZE = 32 +const HALF_HASH_SIZE = HASH_SIZE >> 1 /** PID 最大字节数: PID_BUFFER_SIZE * 2 = 128 字节 (UCS-2 编码) */ -const KMS_PID_MAX_BYTES = PID_BUFFER_SIZE * 2; +const KMS_PID_MAX_BYTES = PID_BUFFER_SIZE * 2 // 最大结构体大小(使用完整 PID_BUFFER_SIZE 时) /** V4 响应最大大小: RESPONSE(172) + MAC(16) = 188 字节 */ -const SIZEOF_RESPONSE_V4 = 188; +const SIZEOF_RESPONSE_V4 = 188 /** V5 响应最大大小: Version(4) + IV(16) + RESPONSE(172) + RandomXoredIVs(16) + Hash(32) = 240 字节 */ -const SIZEOF_RESPONSE_V5 = 240; +const SIZEOF_RESPONSE_V5 = 240 /** V6 响应最大大小: V5(240) + HwId(8) + XoredIVs(16) + HMAC(16) = 280 字节 */ -const SIZEOF_RESPONSE_V6 = 280; +const SIZEOF_RESPONSE_V6 = 280 // V6 时间槽常量(每个时间槽约 4.11 小时) // 用于 HMAC 计算,参考 src/kms.c 中的 CreateV6Hmac() -const TIME_C1 = 0x00000022816889BDn; -const TIME_C2 = 0x000000208CBAB5EDn; -const TIME_C3 = 0x3156CD5AC628477An; -const UINT64_MASK = 0xFFFFFFFFFFFFFFFFn; +const TIME_C1 = 0x00000022816889bdn +const TIME_C2 = 0x000000208cbab5edn +const TIME_C3 = 0x3156cd5ac628477an +const UINT64_MASK = 0xffffffffffffffffn // ─── 导出类型 ─────────────────────────────────────────────────────────────── /** 解析后的 KMS 响应,对应 src/kms.h 中的 RESPONSE 结构 */ export interface ParsedResponse { - majorVer: number; // 主版本号 - minorVer: number; // 次版本号 - pidSize: number; // PID 大小(字节) - kmsPID: Buffer; // KMS ePID (UCS-2 编码) - cmid: Buffer; // 客户端机器 ID (16 字节 GUID) - clientTime: Buffer; // 客户端请求时间 (8 字节 FILETIME) - count: number; // 当前活跃客户端数 - vlActivationInterval: number; // 激活间隔(分钟) - vlRenewalInterval: number; // 续期间隔(分钟) + majorVer: number // 主版本号 + minorVer: number // 次版本号 + pidSize: number // PID 大小(字节) + kmsPID: Buffer // KMS ePID (UCS-2 编码) + cmid: Buffer // 客户端机器 ID (16 字节 GUID) + clientTime: Buffer // 客户端请求时间 (8 字节 FILETIME) + count: number // 当前活跃客户端数 + vlActivationInterval: number // 激活间隔(分钟) + vlRenewalInterval: number // 续期间隔(分钟) } // ─── 内部工具函数 ─────────────────────────────────────────────────────────── @@ -98,29 +98,35 @@ export interface ParsedResponse { * 参考: src/kms.c 中结果掩码的构建方式 */ function computeMask(r: ResponseResult): number { - let mask = 0; - if (r.hashOK) mask |= 1 << 0; - if (r.timeStampOK) mask |= 1 << 1; - if (r.clientMachineIDOK) mask |= 1 << 2; - if (r.versionOK) mask |= 1 << 3; - if (r.ivsOK) mask |= 1 << 4; - if (r.decryptSuccess) mask |= 1 << 5; - if (r.hmacSha256OK) mask |= 1 << 6; - if (r.pidLengthOK) mask |= 1 << 7; - if (r.rpcOK) mask |= 1 << 8; - if (r.ivNotSuspicious) mask |= 1 << 9; - mask |= (r.effectiveResponseSize & 0x1FF) << 14; - mask |= (r.correctResponseSize & 0x1FF) << 23; - return mask >>> 0; + let mask = 0 + if (r.hashOK) mask |= 1 << 0 + if (r.timeStampOK) mask |= 1 << 1 + if (r.clientMachineIDOK) mask |= 1 << 2 + if (r.versionOK) mask |= 1 << 3 + if (r.ivsOK) mask |= 1 << 4 + if (r.decryptSuccess) mask |= 1 << 5 + if (r.hmacSha256OK) mask |= 1 << 6 + if (r.pidLengthOK) mask |= 1 << 7 + if (r.rpcOK) mask |= 1 << 8 + if (r.ivNotSuspicious) mask |= 1 << 9 + mask |= (r.effectiveResponseSize & 0x1ff) << 14 + mask |= (r.correctResponseSize & 0x1ff) << 23 + return mask >>> 0 } /** 创建空的 ParsedResponse(用于解密失败时的早期返回) */ function emptyParsedResponse(): ParsedResponse { return { - majorVer: 0, minorVer: 0, pidSize: 0, - kmsPID: Buffer.alloc(0), cmid: Buffer.alloc(16), clientTime: Buffer.alloc(8), - count: 0, vlActivationInterval: 0, vlRenewalInterval: 0, - }; + majorVer: 0, + minorVer: 0, + pidSize: 0, + kmsPID: Buffer.alloc(0), + cmid: Buffer.alloc(16), + clientTime: Buffer.alloc(8), + count: 0, + vlActivationInterval: 0, + vlRenewalInterval: 0 + } } /** @@ -130,22 +136,22 @@ function emptyParsedResponse(): ParsedResponse { * 参考: src/kms.c 中的 checkPidLength() */ function checkPidLength(data: Buffer, pidSizeOffset: number): boolean { - const pidSize = data.readUInt32LE(pidSizeOffset); - if (pidSize > KMS_PID_MAX_BYTES) return false; + const pidSize = data.readUInt32LE(pidSizeOffset) + if (pidSize > KMS_PID_MAX_BYTES) return false - const pidOffset = pidSizeOffset + 4; - const numChars = pidSize >>> 1; - if (numChars < 1) return false; + const pidOffset = pidSizeOffset + 4 + const numChars = pidSize >>> 1 + if (numChars < 1) return false // 最后一个 WCHAR 必须是空终止符 - if (data.readUInt16LE(pidOffset + (numChars - 1) * 2) !== 0) return false; + if (data.readUInt16LE(pidOffset + (numChars - 1) * 2) !== 0) return false // 倒数第二个之前的所有 WCHAR 必须非零 for (let i = 0; i < numChars - 2; i++) { - if (data.readUInt16LE(pidOffset + i * 2) === 0) return false; + if (data.readUInt16LE(pidOffset + i * 2) === 0) return false } - return true; + return true } /** @@ -156,9 +162,9 @@ function parseResponseBase( data: Buffer, verOff: number, pidSize: number, - postEpid: Buffer, + postEpid: Buffer ): ParsedResponse { - const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES); + const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES) return { minorVer: data.readUInt16LE(verOff), @@ -169,8 +175,8 @@ function parseResponseBase( clientTime: Buffer.from(postEpid.subarray(16, 24)), count: postEpid.readUInt32LE(24), vlActivationInterval: postEpid.readUInt32LE(28), - vlRenewalInterval: postEpid.readUInt32LE(32), - }; + vlRenewalInterval: postEpid.readUInt32LE(32) + } } /** @@ -183,28 +189,33 @@ function parseResponseBase( function createV6Hmac( encryptStart: Buffer, encryptSize: number, - tolerance: number, + tolerance: number ): void { // ClientTime 位于: 加密区域末尾 - V6_POST_EPID_SIZE + sizeof(CMID) - const ftOffset = encryptSize - V6_POST_EPID_SIZE + 16; - const clientTime = encryptStart.readBigUInt64LE(ftOffset); + const ftOffset = encryptSize - V6_POST_EPID_SIZE + 16 + const clientTime = encryptStart.readBigUInt64LE(ftOffset) // 时间槽 ≈ 4.11 小时粒度 - const timeSlot = ( - (clientTime / TIME_C1) * TIME_C2 + TIME_C3 + BigInt(tolerance) * TIME_C1 - ) & UINT64_MASK; + const timeSlot = + ((clientTime / TIME_C1) * TIME_C2 + TIME_C3 + BigInt(tolerance) * TIME_C1) & + UINT64_MASK - const timeSlotBuf = Buffer.alloc(8); - timeSlotBuf.writeBigUInt64LE(timeSlot); - const hash = sha256(timeSlotBuf); + const timeSlotBuf = Buffer.alloc(8) + timeSlotBuf.writeBigUInt64LE(timeSlot) + const hash = sha256(timeSlotBuf) // HMAC 密钥 = SHA256(timeSlot) 的后 16 字节 - const hmacKey = hash.subarray(HALF_HASH_SIZE); - const hmacData = encryptStart.subarray(0, encryptSize - HMAC_SIZE); - const hmacResult = sha256Hmac(hmacKey, hmacData); + const hmacKey = hash.subarray(HALF_HASH_SIZE) + const hmacData = encryptStart.subarray(0, encryptSize - HMAC_SIZE) + const hmacResult = sha256Hmac(hmacKey, hmacData) // 将 HMAC 结果的后 16 字节写入 HMAC 字段 - hmacResult.copy(encryptStart, encryptSize - HMAC_SIZE, HALF_HASH_SIZE, HASH_SIZE); + hmacResult.copy( + encryptStart, + encryptSize - HMAC_SIZE, + HALF_HASH_SIZE, + HASH_SIZE + ) } // ─── 创建 V4 请求 (参考 src/kms.c 中的 CreateRequestV4) ──────────────────── @@ -213,14 +224,14 @@ function createV6Hmac( * 构建 252 字节的 V4 KMS 请求: REQUEST(236) + AES-CMAC(16) */ export function createRequestV4(requestBase: Buffer): Buffer { - const request = Buffer.alloc(REQUEST_V4_SIZE); - requestBase.copy(request, 0, 0, REQUEST_SIZE); + const request = Buffer.alloc(REQUEST_V4_SIZE) + requestBase.copy(request, 0, 0, REQUEST_SIZE) // 计算 AES-CMAC 并附加到请求末尾 - const mac = aesCmacV4(request, REQUEST_SIZE); - mac.copy(request, REQUEST_SIZE); + const mac = aesCmacV4(request, REQUEST_SIZE) + mac.copy(request, REQUEST_SIZE) - return request; + return request } // ─── 创建 V5/V6 请求 (参考 src/kms.c 中的 CreateRequestV6) ───────────────── @@ -229,31 +240,31 @@ export function createRequestV4(requestBase: Buffer): Buffer { * 构建 260 字节的 V5/V6 KMS 请求: Version(4) + IV(16) + 加密的请求(240) */ export function createRequestV6(requestBase: Buffer): Buffer { - const request = Buffer.alloc(REQUEST_V6_SIZE); + const request = Buffer.alloc(REQUEST_V6_SIZE) // 外层版本号 = requestBase 版本号 - requestBase.copy(request, 0, 0, 4); + requestBase.copy(request, 0, 0, 4) // 随机 16 字节 IV - const iv = get16RandomBytes(); - iv.copy(request, 4); + const iv = get16RandomBytes() + iv.copy(request, 4) // 将基础请求复制到加密区域 - requestBase.copy(request, 20, 0, REQUEST_SIZE); + requestBase.copy(request, 20, 0, REQUEST_SIZE) // 根据主版本号选择密钥(V6 使用 AesKeyV6,V5 使用 AesKeyV5) - const majorVer = request.readUInt16LE(2); - const isV6 = majorVer > 5; + const majorVer = request.readUInt16LE(2) + const isV6 = majorVer > 5 - const ctx = new AesCtx(); - ctx.initKey(isV6 ? AesKeyV6 : AesKeyV5, isV6, AES_KEY_BYTES); + const ctx = new AesCtx() + ctx.initKey(isV6 ? AesKeyV6 : AesKeyV5, isV6, AES_KEY_BYTES) // 加密请求(236 字节 → 240 字节,含 PKCS#7 填充) - const plaintext = Buffer.from(request.subarray(20, 20 + REQUEST_SIZE)); - const { encrypted } = aesEncryptCbc(ctx, iv, plaintext); - encrypted.copy(request, 20); + const plaintext = Buffer.from(request.subarray(20, 20 + REQUEST_SIZE)) + const { encrypted } = aesEncryptCbc(ctx, iv, plaintext) + encrypted.copy(request, 20) - return request; + return request } // ─── 解密 V4 响应 (参考 src/kms.c 中的 DecryptResponseV4) ────────────────── @@ -265,28 +276,30 @@ export function createRequestV6(requestBase: Buffer): Buffer { */ export function decryptResponseV4( rawResponse: Buffer, - rawRequest: Buffer, + rawRequest: Buffer ): { result: ResponseResult; response: ParsedResponse } { - const responseSize = rawResponse.length; + const responseSize = rawResponse.length // 确定变长 PID 大小 - const pidSize = rawResponse.readUInt32LE(4); - const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES); - const copySize = V4_PRE_EPID_SIZE + clampedPidSize; - const messageSize = copySize + V4_POST_EPID_SIZE; + const pidSize = rawResponse.readUInt32LE(4) + const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES) + const copySize = V4_PRE_EPID_SIZE + clampedPidSize + const messageSize = copySize + V4_POST_EPID_SIZE // 提取 ePID 后面的区域(CMID、ClientTime、Count、Intervals) - const postEpid = Buffer.from(rawResponse.subarray(copySize, copySize + V4_POST_EPID_SIZE)); - const parsed = parseResponseBase(rawResponse, 0, pidSize, postEpid); + const postEpid = Buffer.from( + rawResponse.subarray(copySize, copySize + V4_POST_EPID_SIZE) + ) + const parsed = parseResponseBase(rawResponse, 0, pidSize, postEpid) // 计算 CMAC 并与接收到的 MAC 比较 - const computedMac = aesCmacV4(rawResponse, messageSize); - const receivedMac = rawResponse.subarray(messageSize, messageSize + 16); + const computedMac = aesCmacV4(rawResponse, messageSize) + const receivedMac = rawResponse.subarray(messageSize, messageSize + 16) // 与请求字段进行验证 - const reqVersion = rawRequest.readUInt32LE(0); - const reqClientTime = rawRequest.subarray(84, 92); // REQUEST.ClientTime - const reqCMID = rawRequest.subarray(64, 80); // REQUEST.CMID + const reqVersion = rawRequest.readUInt32LE(0) + const reqClientTime = rawRequest.subarray(84, 92) // REQUEST.ClientTime + const reqCMID = rawRequest.subarray(64, 80) // REQUEST.CMID const result: ResponseResult = { mask: 0, @@ -301,11 +314,11 @@ export function decryptResponseV4( rpcOK: true, ivNotSuspicious: true, effectiveResponseSize: responseSize, - correctResponseSize: SIZEOF_RESPONSE_V4 - KMS_PID_MAX_BYTES + pidSize, - }; - result.mask = computeMask(result); + correctResponseSize: SIZEOF_RESPONSE_V4 - KMS_PID_MAX_BYTES + pidSize + } + result.mask = computeMask(result) - return { result, response: parsed }; + return { result, response: parsed } } // ─── 解密 V5/V6 响应 (参考 src/kms.c 中的 DecryptResponseV6) ─────────────── @@ -320,137 +333,166 @@ export function decryptResponseV4( */ export function decryptResponseV6( rawResponse: Buffer, - rawRequest: Buffer, + rawRequest: Buffer ): { result: ResponseResult; response: ParsedResponse; hwid: Buffer } { - const totalSize = rawResponse.length; - const hwid = Buffer.alloc(8); + const totalSize = rawResponse.length + const hwid = Buffer.alloc(8) // 创建可变工作副本(解密是就地操作) - const response = Buffer.from(rawResponse); - const request = Buffer.from(rawRequest); + const response = Buffer.from(rawResponse) + const request = Buffer.from(rawRequest) // 初始假设所有验证通过 const result: ResponseResult = { mask: 0, - hashOK: true, timeStampOK: true, clientMachineIDOK: true, - versionOK: true, ivsOK: true, decryptSuccess: true, - hmacSha256OK: true, pidLengthOK: true, rpcOK: true, ivNotSuspicious: true, - effectiveResponseSize: totalSize, correctResponseSize: 0, - }; + hashOK: true, + timeStampOK: true, + clientMachineIDOK: true, + versionOK: true, + ivsOK: true, + decryptSuccess: true, + hmacSha256OK: true, + pidLengthOK: true, + rpcOK: true, + ivNotSuspicious: true, + effectiveResponseSize: totalSize, + correctResponseSize: 0 + } // 从外层(未加密)版本字段确定协议版本 - const majorVer = response.readUInt16LE(2); - const isV6 = majorVer > 5; + const majorVer = response.readUInt16LE(2) + const isV6 = majorVer > 5 // 解密 4 字节 Version 之后的所有内容 - const ctx = new AesCtx(); - ctx.initKey(isV6 ? AesKeyV6 : AesKeyV5, isV6, AES_KEY_BYTES); + const ctx = new AesCtx() + ctx.initKey(isV6 ? AesKeyV6 : AesKeyV5, isV6, AES_KEY_BYTES) - const encryptedLen = totalSize - 4; - aesDecryptCbc(ctx, null, response.subarray(4), encryptedLen); + const encryptedLen = totalSize - 4 + aesDecryptCbc(ctx, null, response.subarray(4), encryptedLen) // ── 验证 PKCS#7 填充 ── - const lastByte = response[totalSize - 1]; + const lastByte = response[totalSize - 1] if (lastByte === 0 || lastByte > AES_BLOCK_BYTES) { - result.decryptSuccess = false; - result.mask = computeMask(result); - return { result, response: emptyParsedResponse(), hwid }; + result.decryptSuccess = false + result.mask = computeMask(result) + return { result, response: emptyParsedResponse(), hwid } } for (let i = totalSize - lastByte; i < totalSize - 1; i++) { if (response[i] !== lastByte) { - result.decryptSuccess = false; - result.mask = computeMask(result); - return { result, response: emptyParsedResponse(), hwid }; + result.decryptSuccess = false + result.mask = computeMask(result) + return { result, response: emptyParsedResponse(), hwid } } } // ── 解析解密后的响应 ── - const pidSize = response.readUInt32LE(V6_PRE_EPID_SIZE - 4); // ResponseBase.PIDSize - const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES); - const copySize1 = V6_PRE_EPID_SIZE + clampedPidSize; - - const postEpidSize = isV6 ? V6_POST_EPID_SIZE : V5_POST_EPID_SIZE; - const postEpid = Buffer.from(response.subarray(copySize1, copySize1 + postEpidSize)); - - const parsed = parseResponseBase(response, V6_UNENCRYPTED_SIZE, pidSize, postEpid); + const pidSize = response.readUInt32LE(V6_PRE_EPID_SIZE - 4) // ResponseBase.PIDSize + const clampedPidSize = Math.min(pidSize, KMS_PID_MAX_BYTES) + const copySize1 = V6_PRE_EPID_SIZE + clampedPidSize + + const postEpidSize = isV6 ? V6_POST_EPID_SIZE : V5_POST_EPID_SIZE + const postEpid = Buffer.from( + response.subarray(copySize1, copySize1 + postEpidSize) + ) + + const parsed = parseResponseBase( + response, + V6_UNENCRYPTED_SIZE, + pidSize, + postEpid + ) // ── 解密请求的 IV + RequestBase + Pad(用于验证) ── - aesDecryptCbc(ctx, null, request.subarray(4), V6_DECRYPT_SIZE); + aesDecryptCbc(ctx, null, request.subarray(4), V6_DECRYPT_SIZE) // ── 版本一致性检查 ── - const outerReqVersion = request.readUInt32LE(0); - const innerReqVersion = request.readUInt32LE(20); // RequestBase.Version - const outerRespVersion = response.readUInt32LE(0); - const innerRespVersion = response.readUInt32LE(V6_UNENCRYPTED_SIZE); // ResponseBase.Version + const outerReqVersion = request.readUInt32LE(0) + const innerReqVersion = request.readUInt32LE(20) // RequestBase.Version + const outerRespVersion = response.readUInt32LE(0) + const innerRespVersion = response.readUInt32LE(V6_UNENCRYPTED_SIZE) // ResponseBase.Version result.versionOK = outerReqVersion === innerRespVersion && outerReqVersion === outerRespVersion && - outerReqVersion === innerReqVersion; + outerReqVersion === innerReqVersion // ── PID、时间戳、CMID 检查 ── - result.pidLengthOK = checkPidLength(response, V6_PRE_EPID_SIZE - 4); + result.pidLengthOK = checkPidLength(response, V6_PRE_EPID_SIZE - 4) - const reqClientTime = request.subarray(20 + 84, 20 + 92); // RequestBase.ClientTime - result.timeStampOK = parsed.clientTime.equals(reqClientTime); + const reqClientTime = request.subarray(20 + 84, 20 + 92) // RequestBase.ClientTime + result.timeStampOK = parsed.clientTime.equals(reqClientTime) - const reqCMID = request.subarray(20 + 64, 20 + 80); // RequestBase.CMID - result.clientMachineIDOK = parsed.cmid.equals(reqCMID); + const reqCMID = request.subarray(20 + 64, 20 + 80) // RequestBase.CMID + result.clientMachineIDOK = parsed.cmid.equals(reqCMID) // ── 哈希验证 (RandomXoredIVs / Hash) ── - const decryptedReqIV = Buffer.from(request.subarray(4, 20)); - const randomXoredIVs = postEpid.subarray(V4_POST_EPID_SIZE, V4_POST_EPID_SIZE + 16); - const receivedHash = postEpid.subarray(V4_POST_EPID_SIZE + 16, V4_POST_EPID_SIZE + 16 + HASH_SIZE); + const decryptedReqIV = Buffer.from(request.subarray(4, 20)) + const randomXoredIVs = postEpid.subarray( + V4_POST_EPID_SIZE, + V4_POST_EPID_SIZE + 16 + ) + const receivedHash = postEpid.subarray( + V4_POST_EPID_SIZE + 16, + V4_POST_EPID_SIZE + 16 + HASH_SIZE + ) // 恢复原始随机字节: random = decryptedReqIV XOR RandomXoredIVs - const randomKey = Buffer.from(decryptedReqIV); - xorBlock(randomXoredIVs, randomKey); - const hashVerify = sha256(randomKey); - result.hashOK = hashVerify.equals(receivedHash); + const randomKey = Buffer.from(decryptedReqIV) + xorBlock(randomXoredIVs, randomKey) + const hashVerify = sha256(randomKey) + result.hashOK = hashVerify.equals(receivedHash) // ── 计算正确的响应大小(不含 PKCS 填充) ── - const sizeofStruct = isV6 ? SIZEOF_RESPONSE_V6 : SIZEOF_RESPONSE_V5; - result.correctResponseSize = sizeofStruct - KMS_PID_MAX_BYTES + pidSize; + const sizeofStruct = isV6 ? SIZEOF_RESPONSE_V6 : SIZEOF_RESPONSE_V5 + result.correctResponseSize = sizeofStruct - KMS_PID_MAX_BYTES + pidSize // ── 版本特定验证 ── if (isV6) { // 提取 HwId - postEpid.copy(hwid, 0, V5_POST_EPID_SIZE, V5_POST_EPID_SIZE + 8); + postEpid.copy(hwid, 0, V5_POST_EPID_SIZE, V5_POST_EPID_SIZE + 8) // XoredIVs 必须等于解密后的请求 IV - const xoredIVs = postEpid.subarray(V5_POST_EPID_SIZE + 8, V5_POST_EPID_SIZE + 24); - result.ivsOK = decryptedReqIV.equals(xoredIVs); + const xoredIVs = postEpid.subarray( + V5_POST_EPID_SIZE + 8, + V5_POST_EPID_SIZE + 24 + ) + result.ivsOK = decryptedReqIV.equals(xoredIVs) // 请求和响应的 IV 应该不同(相同说明是模拟器) - const responseIV = response.subarray(4, 20); - result.ivNotSuspicious = !decryptedReqIV.equals(responseIV); + const responseIV = response.subarray(4, 20) + result.ivNotSuspicious = !decryptedReqIV.equals(responseIV) // 使用 ±1 时间槽容差验证 HMAC - const savedHmac = Buffer.from(postEpid.subarray(V5_POST_EPID_SIZE + 24, V5_POST_EPID_SIZE + 40)); - result.hmacSha256OK = false; + const savedHmac = Buffer.from( + postEpid.subarray(V5_POST_EPID_SIZE + 24, V5_POST_EPID_SIZE + 40) + ) + result.hmacSha256OK = false - const encryptStart = response.subarray(4); - const encryptSize = result.correctResponseSize - 4; + const encryptStart = response.subarray(4) + const encryptSize = result.correctResponseSize - 4 for (let tolerance = -1; tolerance <= 1; tolerance++) { - createV6Hmac(encryptStart, encryptSize, tolerance); - const computed = encryptStart.subarray(encryptSize - HMAC_SIZE, encryptSize); + createV6Hmac(encryptStart, encryptSize, tolerance) + const computed = encryptStart.subarray( + encryptSize - HMAC_SIZE, + encryptSize + ) if (savedHmac.equals(computed)) { - result.hmacSha256OK = true; - break; + result.hmacSha256OK = true + break } } } else { // V5: 请求和响应的 IV 必须匹配 - const responseIV = response.subarray(4, 20); - result.ivsOK = decryptedReqIV.equals(responseIV); - result.hmacSha256OK = true; // V5 没有 HMAC + const responseIV = response.subarray(4, 20) + result.ivsOK = decryptedReqIV.equals(responseIV) + result.hmacSha256OK = true // V5 没有 HMAC } // 将 PKCS 填充加到 correctResponseSize - const encPartSize = result.correctResponseSize - 4; - result.correctResponseSize += (~encPartSize & 0xF) + 1; + const encPartSize = result.correctResponseSize - 4 + result.correctResponseSize += (~encPartSize & 0xf) + 1 - result.mask = computeMask(result); - return { result, response: parsed, hwid }; + result.mask = computeMask(result) + return { result, response: parsed, hwid } } diff --git a/node-vlmcs/src/network.ts b/node-vlmcs/src/network.ts index 7d98799f..e5ab8d91 100644 --- a/node-vlmcs/src/network.ts +++ b/node-vlmcs/src/network.ts @@ -6,49 +6,53 @@ * - src/network.h (网络接口定义) */ -import * as net from 'net'; -import * as dns from 'dns'; -import { parseAddress } from './helpers'; +import * as net from 'net' +import * as dns from 'dns' +import { parseAddress } from './helpers' /** 连接超时时间(毫秒),与原版 SO_RCVTIMEO/SO_SNDTIMEO 设置一致 */ -const CONNECT_TIMEOUT_MS = 10_000; +const CONNECT_TIMEOUT_MS = 10_000 /** * 带超时的 TCP 连接 * 连接成功后暂停 socket,防止在附加数据监听器之前丢失数据 */ -function connectWithTimeout(host: string, port: number, family?: number): Promise { +function connectWithTimeout( + host: string, + port: number, + family?: number +): Promise { return new Promise((resolve, reject) => { - const sock = new net.Socket(); - let settled = false; + const sock = new net.Socket() + let settled = false const timer = setTimeout(() => { if (!settled) { - settled = true; - sock.destroy(); - reject(new Error('Timed out')); + settled = true + sock.destroy() + reject(new Error('Timed out')) } - }, CONNECT_TIMEOUT_MS); + }, CONNECT_TIMEOUT_MS) sock.once('error', (err: Error) => { if (!settled) { - settled = true; - clearTimeout(timer); - sock.destroy(); - reject(new Error(err.message)); + settled = true + clearTimeout(timer) + sock.destroy() + reject(new Error(err.message)) } - }); + }) sock.connect({ host, port, family }, () => { if (!settled) { - settled = true; - clearTimeout(timer); + settled = true + clearTimeout(timer) // 暂停 socket,防止在附加数据监听器之前丢失数据 - sock.pause(); - resolve(sock); + sock.pause() + resolve(sock) } - }); - }); + }) + }) } /** @@ -67,80 +71,83 @@ export async function connectToAddress( addressFamily: number, showHostName: boolean ): Promise { - const { host, port } = parseAddress(addr); - const portNum = parseInt(port, 10); + const { host, port } = parseAddress(addr) + const portNum = parseInt(port, 10) if (isNaN(portNum) || portNum < 1 || portNum > 65535) { - throw new Error(`Invalid port: ${port}`); + throw new Error(`Invalid port: ${port}`) } // 判断是否为 IP 字面量地址 - const isIPv4Literal = net.isIPv4(host); - const isIPv6Literal = net.isIPv6(host); - const isLiteral = isIPv4Literal || isIPv6Literal; + const isIPv4Literal = net.isIPv4(host) + const isIPv6Literal = net.isIPv6(host) + const isLiteral = isIPv4Literal || isIPv6Literal - let family: number | undefined; + let family: number | undefined if (addressFamily === 4) { - family = 4; + family = 4 } else if (addressFamily === 6) { - family = 6; + family = 6 } // 地址族兼容性检查 if (isIPv4Literal && addressFamily === 6) { - throw new Error(`IPv4 address ${host} cannot be used with IPv6-only mode`); + throw new Error(`IPv4 address ${host} cannot be used with IPv6-only mode`) } if (isIPv6Literal && addressFamily === 4) { - throw new Error(`IPv6 address ${host} cannot be used with IPv4-only mode`); + throw new Error(`IPv6 address ${host} cannot be used with IPv4-only mode`) } // 构建要尝试的地址列表 - interface AddrEntry { address: string; family: number } - let targets: AddrEntry[]; + interface AddrEntry { + address: string + family: number + } + let targets: AddrEntry[] if (isLiteral) { // IP 字面量,直接使用 - targets = [{ address: host, family: isIPv4Literal ? 4 : 6 }]; + targets = [{ address: host, family: isIPv4Literal ? 4 : 6 }] } else { // 主机名,通过 DNS 解析(可能返回多个地址) targets = await new Promise((resolve, reject) => { dns.lookup(host, { family: family || 0, all: true }, (err, addresses) => { if (err) { - reject(new Error(`${host}: ${err.message}`)); + reject(new Error(`${host}: ${err.message}`)) } else if ((addresses as dns.LookupAddress[]).length === 0) { - reject(new Error(`${host}: No address associated with hostname`)); + reject(new Error(`${host}: No address associated with hostname`)) } else { - resolve(addresses as dns.LookupAddress[]); + resolve(addresses as dns.LookupAddress[]) } - }); - }); + }) + }) } // 按顺序尝试每个地址(模拟原版 getaddrinfo 遍历行为) for (let i = 0; i < targets.length; i++) { - const connectHost = targets[i].address; - const addrFamily = targets[i].family; + const connectHost = targets[i].address + const addrFamily = targets[i].family // 输出连接信息(匹配原版格式) if (showHostName && !isLiteral) { - process.stdout.write(`Connecting to ${host} (${connectHost}) ... `); + process.stdout.write(`Connecting to ${host} (${connectHost}) ... `) } else { - process.stdout.write(`Connecting to ${connectHost}:${port} ... `); + process.stdout.write(`Connecting to ${connectHost}:${port} ... `) } try { - const sock = await connectWithTimeout(connectHost, portNum, addrFamily); - process.stdout.write('successful\n'); - return sock; + const sock = await connectWithTimeout(connectHost, portNum, addrFamily) + process.stdout.write('successful\n') + return sock } catch (err: any) { - process.stderr.write(`${connectHost}:${port}: ${err.message}\n`); + process.stderr.write(`${connectHost}:${port}: ${err.message}\n`) if (i === targets.length - 1) { - throw new Error('Could not connect to any KMS server'); + throw new Error('Could not connect to any KMS server') } } } - throw new Error('Could not connect to any KMS server'); + throw new Error('Could not connect to any KMS server') } /** @@ -149,14 +156,14 @@ export async function connectToAddress( */ export function sendData(sock: net.Socket, data: Buffer): Promise { return new Promise((resolve, reject) => { - const ok = sock.write(data, (err) => { - if (err) reject(err); - else if (ok) resolve(); - }); + const ok = sock.write(data, err => { + if (err) reject(err) + else if (ok) resolve() + }) if (!ok) { - sock.once('drain', () => resolve()); + sock.once('drain', () => resolve()) } - }); + }) } /** @@ -168,64 +175,68 @@ export function sendData(sock: net.Socket, data: Buffer): Promise { export function recvData(sock: net.Socket, size: number): Promise { return new Promise((resolve, reject) => { if (size === 0) { - resolve(Buffer.alloc(0)); - return; + resolve(Buffer.alloc(0)) + return } - const chunks: Buffer[] = []; - let received = 0; + const chunks: Buffer[] = [] + let received = 0 const cleanup = () => { - sock.removeListener('data', onData); - sock.removeListener('error', onError); - sock.removeListener('close', onClose); - sock.removeListener('end', onEnd); - }; + sock.removeListener('data', onData) + sock.removeListener('error', onError) + sock.removeListener('close', onClose) + sock.removeListener('end', onEnd) + } const onData = (chunk: Buffer) => { - chunks.push(chunk); - received += chunk.length; + chunks.push(chunk) + received += chunk.length if (received >= size) { - cleanup(); - sock.pause(); // 暂停接收,防止数据丢失 - const full = Buffer.concat(chunks); - const result = full.subarray(0, size); + cleanup() + sock.pause() // 暂停接收,防止数据丢失 + const full = Buffer.concat(chunks) + const result = full.subarray(0, size) // 将多余的字节推回 socket 的读取缓冲区 if (full.length > size) { - sock.unshift(full.subarray(size)); + sock.unshift(full.subarray(size)) } - resolve(Buffer.from(result)); + resolve(Buffer.from(result)) } - }; + } const onError = (err: Error) => { - cleanup(); - reject(err); - }; + cleanup() + reject(err) + } const onClose = () => { - cleanup(); - reject(new Error(`Socket closed after receiving ${received} of ${size} bytes`)); - }; + cleanup() + reject( + new Error(`Socket closed after receiving ${received} of ${size} bytes`) + ) + } const onEnd = () => { - cleanup(); - reject(new Error(`Socket ended after receiving ${received} of ${size} bytes`)); - }; + cleanup() + reject( + new Error(`Socket ended after receiving ${received} of ${size} bytes`) + ) + } - sock.on('data', onData); - sock.once('error', onError); - sock.once('close', onClose); - sock.once('end', onEnd); + sock.on('data', onData) + sock.once('error', onError) + sock.once('close', onClose) + sock.once('end', onEnd) // 恢复 socket 以开始接收数据 - sock.resume(); - }); + sock.resume() + }) } /** * 检查 socket 是否已断开连接 */ export function isDisconnected(sock: net.Socket): boolean { - return sock.destroyed || !sock.writable; + return sock.destroyed || !sock.writable } diff --git a/node-vlmcs/src/output.ts b/node-vlmcs/src/output.ts index 33ed5ad9..57009ef0 100644 --- a/node-vlmcs/src/output.ts +++ b/node-vlmcs/src/output.ts @@ -6,9 +6,9 @@ * - src/output.h (输出接口定义) */ -import { KmsData } from './data'; -import { ParsedResponse } from './kms'; -import { ucs2ToUtf8, fileTimeToUnixTime, VERSION } from './types'; +import { KmsData } from './data' +import { ParsedResponse } from './kms' +import { ucs2ToUtf8, fileTimeToUnixTime, VERSION } from './types' // ─── 许可证状态映射 (参考 src/output.c 中的 StatusText) ───────────────────── @@ -19,8 +19,8 @@ const LICENSE_STATUS: Record = { 3: 'OOT grace', 4: 'NonGenuineGrace', 5: 'Notification', - 6: 'extended grace', -}; + 6: 'extended grace' +} /** * 将小端序 GUID Buffer 格式化为标准字符串 @@ -29,23 +29,33 @@ const LICENSE_STATUS: Record = { * 参考: src/output.c 中的 uuid2StringLE() */ export function uuid2StringLE(buf: Buffer, offset = 0): string { - const d1 = buf.readUInt32LE(offset); - const d2 = buf.readUInt16LE(offset + 4); - const d3 = buf.readUInt16LE(offset + 6); - const d4 = buf.subarray(offset + 8, offset + 16); + const d1 = buf.readUInt32LE(offset) + const d2 = buf.readUInt16LE(offset + 4) + const d3 = buf.readUInt16LE(offset + 6) + const d4 = buf.subarray(offset + 8, offset + 16) return ( - d1.toString(16).padStart(8, '0') + '-' + - d2.toString(16).padStart(4, '0') + '-' + - d3.toString(16).padStart(4, '0') + '-' + - d4[0].toString(16).padStart(2, '0') + d4[1].toString(16).padStart(2, '0') + '-' + - Array.from(d4.subarray(2)).map(b => b.toString(16).padStart(2, '0')).join('') - ); + d1.toString(16).padStart(8, '0') + + '-' + + d2.toString(16).padStart(4, '0') + + '-' + + d3.toString(16).padStart(4, '0') + + '-' + + d4[0].toString(16).padStart(2, '0') + + d4[1].toString(16).padStart(2, '0') + + '-' + + Array.from(d4.subarray(2)) + .map(b => b.toString(16).padStart(2, '0')) + .join('') + ) } /** 在产品列表中按 GUID 查找名称 */ -function findNameByGuid(guidStr: string, list: Array<{ guid: string; name: string }>): string { - const found = list.find(item => item.guid === guidStr); - return found ? found.name : 'Unknown'; +function findNameByGuid( + guidStr: string, + list: Array<{ guid: string; name: string }> +): string { + const found = list.find(item => item.guid === guidStr) + return found ? found.name : 'Unknown' } /** @@ -53,10 +63,10 @@ function findNameByGuid(guidStr: string, list: Array<{ guid: string; name: strin * 格式: "YYYY-MM-DD HH:MM:SS" */ function formatTimestamp(ft: Buffer): string { - const unixTime = fileTimeToUnixTime(ft); - const d = new Date(unixTime * 1000); - const pad = (n: number) => n.toString().padStart(2, '0'); - return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}`; + const unixTime = fileTimeToUnixTime(ft) + const d = new Date(unixTime * 1000) + const pad = (n: number) => n.toString().padStart(2, '0') + return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())}:${pad(d.getUTCSeconds())}` } /** @@ -65,41 +75,41 @@ function formatTimestamp(ft: Buffer): string { * 参考: src/output.c 中的 logRequest() */ export function logRequestVerbose(requestBuf: Buffer): void { - const majorVer = requestBuf.readUInt16LE(2); - const minorVer = requestBuf.readUInt16LE(0); - const vmInfo = requestBuf.readUInt32LE(4); - const licenseStatus = requestBuf.readUInt32LE(8); - const bindingExpiration = requestBuf.readUInt32LE(12); - const appIdStr = uuid2StringLE(requestBuf, 16); - const skuIdStr = uuid2StringLE(requestBuf, 32); - const kmsIdStr = uuid2StringLE(requestBuf, 48); - const cmidStr = uuid2StringLE(requestBuf, 64); - const nPolicy = requestBuf.readUInt32LE(80); - const clientTime = requestBuf.subarray(84, 92); - const cmidPrevStr = uuid2StringLE(requestBuf, 92); - const wsName = ucs2ToUtf8(requestBuf.subarray(108, 236), 64); + const majorVer = requestBuf.readUInt16LE(2) + const minorVer = requestBuf.readUInt16LE(0) + const vmInfo = requestBuf.readUInt32LE(4) + const licenseStatus = requestBuf.readUInt32LE(8) + const bindingExpiration = requestBuf.readUInt32LE(12) + const appIdStr = uuid2StringLE(requestBuf, 16) + const skuIdStr = uuid2StringLE(requestBuf, 32) + const kmsIdStr = uuid2StringLE(requestBuf, 48) + const cmidStr = uuid2StringLE(requestBuf, 64) + const nPolicy = requestBuf.readUInt32LE(80) + const clientTime = requestBuf.subarray(84, 92) + const cmidPrevStr = uuid2StringLE(requestBuf, 92) + const wsName = ucs2ToUtf8(requestBuf.subarray(108, 236), 64) // 查找产品名称 - const appName = findNameByGuid(appIdStr, KmsData.appItems); - const skuName = findNameByGuid(skuIdStr, KmsData.skuItems); - const kmsName = findNameByGuid(kmsIdStr, KmsData.kmsItems); - const statusStr = LICENSE_STATUS[licenseStatus] || licenseStatus.toString(); + const appName = findNameByGuid(appIdStr, KmsData.appItems) + const skuName = findNameByGuid(skuIdStr, KmsData.skuItems) + const kmsName = findNameByGuid(kmsIdStr, KmsData.kmsItems) + const statusStr = LICENSE_STATUS[licenseStatus] || licenseStatus.toString() process.stdout.write( `\nRequest Parameters\n==================\n\n` + - `Protocol version : ${majorVer}.${minorVer}\n` + - `Client is a virtual machine : ${vmInfo ? 'Yes' : 'No'}\n` + - `Licensing status : ${licenseStatus} (${statusStr})\n` + - `Remaining time (0 = forever) : ${bindingExpiration} minutes\n` + - `Application ID : ${appIdStr} (${appName})\n` + - `SKU ID (aka Activation ID) : ${skuIdStr} (${skuName})\n` + - `KMS ID (aka KMS counted ID) : ${kmsIdStr} (${kmsName})\n` + - `Client machine ID : ${cmidStr}\n` + - `Previous client machine ID : ${cmidPrevStr}\n` + - `Client request timestamp (UTC) : ${formatTimestamp(clientTime)}\n` + - `Workstation name : ${wsName}\n` + - `N count policy (minimum clients): ${nPolicy}\n` - ); + `Protocol version : ${majorVer}.${minorVer}\n` + + `Client is a virtual machine : ${vmInfo ? 'Yes' : 'No'}\n` + + `Licensing status : ${licenseStatus} (${statusStr})\n` + + `Remaining time (0 = forever) : ${bindingExpiration} minutes\n` + + `Application ID : ${appIdStr} (${appName})\n` + + `SKU ID (aka Activation ID) : ${skuIdStr} (${skuName})\n` + + `KMS ID (aka KMS counted ID) : ${kmsIdStr} (${kmsName})\n` + + `Client machine ID : ${cmidStr}\n` + + `Previous client machine ID : ${cmidPrevStr}\n` + + `Client request timestamp (UTC) : ${formatTimestamp(clientTime)}\n` + + `Workstation name : ${wsName}\n` + + `N count policy (minimum clients): ${nPolicy}\n` + ) } /** @@ -107,42 +117,49 @@ export function logRequestVerbose(requestBuf: Buffer): void { * * 参考: src/output.c 中的 logResponse() */ -export function logResponseVerbose(ePID: string, hwid: Buffer, response: ParsedResponse, effectiveResponseSize: number): void { - const cmidStr = uuid2StringLE(response.cmid); - const timeStr = formatTimestamp(response.clientTime); +export function logResponseVerbose( + ePID: string, + hwid: Buffer, + response: ParsedResponse, + effectiveResponseSize: number +): void { + const cmidStr = uuid2StringLE(response.cmid) + const timeStr = formatTimestamp(response.clientTime) process.stdout.write( `\n\nResponse from KMS server\n========================\n\n` + - `Size of KMS Response : ${effectiveResponseSize} (0x${effectiveResponseSize.toString(16)})\n` + - `KMS ePID : ${ePID}\n` - ); + `Size of KMS Response : ${effectiveResponseSize} (0x${effectiveResponseSize.toString(16)})\n` + + `KMS ePID : ${ePID}\n` + ) // V6 协议才有 HwId if (response.majorVer > 5) { - const hwidHex = Array.from(hwid.subarray(0, 8)).map(b => b.toString(16).padStart(2, '0').toUpperCase()).join(''); - process.stdout.write(`KMS HwId : ${hwidHex}\n`); + const hwidHex = Array.from(hwid.subarray(0, 8)) + .map(b => b.toString(16).padStart(2, '0').toUpperCase()) + .join('') + process.stdout.write(`KMS HwId : ${hwidHex}\n`) } process.stdout.write( `Client machine ID : ${cmidStr}\n` + - `Client request timestamp (UTC) : ${timeStr}\n` + - `KMS host current active clients : ${response.count}\n` + - `Renewal interval policy : ${response.vlRenewalInterval}\n` + - `Activation interval policy : ${response.vlActivationInterval}\n\n` - ); + `Client request timestamp (UTC) : ${timeStr}\n` + + `KMS host current active clients : ${response.count}\n` + + `Renewal interval policy : ${response.vlRenewalInterval}\n` + + `Activation interval policy : ${response.vlActivationInterval}\n\n` + ) } /** 输出运行平台信息 */ export function printPlatform(): void { - process.stdout.write(`Intended platform: Node.js ${process.version}\n`); + process.stdout.write(`Intended platform: Node.js ${process.version}\n`) } /** 输出通用编译标志 */ export function printCommonFlags(): void { - process.stdout.write('Common flags:\n'); + process.stdout.write('Common flags:\n') } /** 输出 vlmcs 客户端特有标志 */ export function printClientFlags(): void { - process.stdout.write('vlmcs flags: DNS_PARSER=OS\n'); + process.stdout.write('vlmcs flags: DNS_PARSER=OS\n') } diff --git a/node-vlmcs/src/rpc.ts b/node-vlmcs/src/rpc.ts index d42e7aa6..e31b1f76 100644 --- a/node-vlmcs/src/rpc.ts +++ b/node-vlmcs/src/rpc.ts @@ -41,25 +41,25 @@ const RPC_HEADER_SIZE = 16 /** NDR32 传输语法 GUID */ const TransferSyntaxNDR32 = Buffer.from([ 0x04, 0x5d, 0x88, 0x8a, 0xeb, 0x1c, 0xc9, 0x11, 0x9f, 0xe8, 0x08, 0x00, 0x2b, - 0x10, 0x48, 0x60, + 0x10, 0x48, 0x60 ]) /** KMS 接口 UUID */ const InterfaceUuid = Buffer.from([ 0x75, 0x21, 0xc8, 0x51, 0x4e, 0x84, 0x50, 0x47, 0xb0, 0xd8, 0xec, 0x25, 0x55, - 0x55, 0xbc, 0x06, + 0x55, 0xbc, 0x06 ]) /** NDR64 传输语法 GUID */ const TransferSyntaxNDR64 = Buffer.from([ 0x33, 0x05, 0x71, 0x71, 0xba, 0xbe, 0x37, 0x49, 0x83, 0x19, 0xb5, 0xdb, 0xef, - 0x9c, 0xcc, 0x36, + 0x9c, 0xcc, 0x36 ]) /** 绑定时间特性协商 GUID (BTFN) */ const BindTimeFeatureNegotiation = Buffer.from([ 0x2c, 0x1c, 0xb7, 0x6c, 0x12, 0x98, 0x40, 0x45, 0x03, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00 ]) // ─── 导出接口 ─────────────────────────────────────────────────────────────── @@ -94,7 +94,7 @@ function writeRpcHeader( packetType: number, packetFlags: number, fragLength: number, - currentCallId: number, + currentCallId: number ): void { buf.writeUInt8(5, 0) // VersionMajor = 5 buf.writeUInt8(0, 1) // VersionMinor = 0 @@ -129,7 +129,7 @@ function parseRpcHeader(buf: Buffer): RpcHeader { dataRepresentation: buf.readUInt32LE(4), fragLength: buf.readUInt16LE(8), authLength: buf.readUInt16LE(10), - callId: buf.readUInt32LE(12), + callId: buf.readUInt32LE(12) } } @@ -173,7 +173,7 @@ function buildBindPacket( packetType: number, packetFlags: number, currentCallId: number, - ctxItems: CtxItem[], + ctxItems: CtxItem[] ): Buffer { const ctxItemSize = 44 // 绑定体: MaxXmitFrag(2) + MaxRecvFrag(2) + AssocGroup(4) + NumCtxItems(4) + 上下文项数组 @@ -219,7 +219,7 @@ interface BindResult { */ function parseBindResponse( body: Buffer, - verbose: boolean, + verbose: boolean ): { results: BindResult[]; maxRecvFrag: number } { let offset = 0 @@ -233,7 +233,7 @@ function parseBindResponse( if (verbose) { console.log( - ` Max Xmit/Recv Frag: ${maxXmitFrag}/${maxRecvFrag}, AssocGroup: 0x${assocGroup.toString(16).padStart(8, '0')}`, + ` Max Xmit/Recv Frag: ${maxXmitFrag}/${maxRecvFrag}, AssocGroup: 0x${assocGroup.toString(16).padStart(8, '0')}` ) console.log(` Secondary Address Length: ${secondaryAddressLength}`) } @@ -268,7 +268,7 @@ function parseBindResponse( ? 'Ack' : `Unknown(0x${ackResult.toString(16)})` console.log( - ` Result[${i}]: ${resultStr} (reason: 0x${ackReason.toString(16)})`, + ` Result[${i}]: ${resultStr} (reason: 0x${ackReason.toString(16)})` ) } @@ -293,12 +293,12 @@ async function rpcBindOrAlterContext( useClientRpcBTFN: boolean, useMultiplexedRpc: boolean, rpcFlags: RpcFlags, - rpcDiag: RpcDiag, + rpcDiag: RpcDiag ): Promise { // AlterContext 只发送 NDR32;Bind 发送 NDR32 + 可选 NDR64 + BTFN const isBind = packetType === RPC_PT_BIND_REQ const ctxItems: CtxItem[] = [ - { transferSyntax: TransferSyntaxNDR32, syntaxVersion: 2 }, + { transferSyntax: TransferSyntaxNDR32, syntaxVersion: 2 } ] let ctxNDR64 = -1 @@ -313,7 +313,7 @@ async function rpcBindOrAlterContext( ctxBTFN = ctxItems.length ctxItems.push({ transferSyntax: BindTimeFeatureNegotiation, - syntaxVersion: 1, + syntaxVersion: 1 }) } @@ -324,7 +324,7 @@ async function rpcBindOrAlterContext( packetType, packetFlags, currentCallId, - ctxItems, + ctxItems ) await sendData(sock, bindPacket) @@ -335,7 +335,7 @@ async function rpcBindOrAlterContext( if (verbose) { console.log( - `Received RPC ${packetTypeName(header.packetType)} (FragLength=${header.fragLength}, CallId=${header.callId})`, + `Received RPC ${packetTypeName(header.packetType)} (FragLength=${header.fragLength}, CallId=${header.callId})` ) } @@ -401,17 +401,17 @@ export async function rpcBindClient( verbose: boolean, useClientRpcNDR64: boolean, useClientRpcBTFN: boolean, - useMultiplexedRpc: boolean, + useMultiplexedRpc: boolean ): Promise<{ status: number; rpcDiag: RpcDiag; rpcFlags: RpcFlags }> { const rpcFlags: RpcFlags = { hasNDR32: false, hasNDR64: false, - hasBTFN: false, + hasBTFN: false } const rpcDiag: RpcDiag = { hasRpcDiag: false, hasBTFN: false, - hasNDR64: false, + hasNDR64: false } // 第一步: 发送 Bind 请求 @@ -423,7 +423,7 @@ export async function rpcBindClient( useClientRpcBTFN, useMultiplexedRpc, rpcFlags, - rpcDiag, + rpcDiag ) if (status) return { status, rpcDiag, rpcFlags } @@ -438,14 +438,14 @@ export async function rpcBindClient( false, useMultiplexedRpc, rpcFlags, - rpcDiag, + rpcDiag ) if (status) return { status, rpcDiag, rpcFlags } } if (!rpcFlags.hasNDR32 && !rpcFlags.hasNDR64) { process.stderr.write( - '\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n', + '\nFatal: Could neither negotiate NDR32 nor NDR64 with the RPC server\n' ) return { status: 1, rpcDiag, rpcFlags } } @@ -473,7 +473,7 @@ export async function rpcSendRequest( kmsRequest: Buffer, rpcFlags: RpcFlags, useClientRpcNDR64: boolean, - firstPacketSent: boolean, + firstPacketSent: boolean ): Promise<{ status: number kmsResponse: Buffer | null @@ -525,7 +525,7 @@ export async function rpcSendRequest( RPC_PT_REQUEST, RPC_PF_FIRST | RPC_PF_LAST, totalSize, - currentCallId, + currentCallId ) requestBody.copy(packet, RPC_HEADER_SIZE) diff --git a/node-vlmcs/src/types.ts b/node-vlmcs/src/types.ts index f06457ec..cf2f7726 100644 --- a/node-vlmcs/src/types.ts +++ b/node-vlmcs/src/types.ts @@ -13,36 +13,36 @@ /** GUID 结构体,对应 src/types.h 中的 GUID 定义 */ export interface GUID { - data1: number; // uint32,小端序 - data2: number; // uint16,小端序 - data3: number; // uint16,小端序 - data4: Buffer; // 8 字节,直接存储 + data1: number // uint32,小端序 + data2: number // uint16,小端序 + data3: number // uint16,小端序 + data4: Buffer // 8 字节,直接存储 } /** PID 缓冲区大小(WCHAR 数量),对应 src/types.h 中的 PID_BUFFER_SIZE */ -export const PID_BUFFER_SIZE = 64; +export const PID_BUFFER_SIZE = 64 /** 工作站名缓冲区大小(WCHAR 数量) */ -export const WORKSTATION_NAME_BUFFER = 64; +export const WORKSTATION_NAME_BUFFER = 64 // ─── FILETIME 常量 ────────────────────────────────────────────────────────── // Windows FILETIME: 从 1601-01-01 起的 100 纳秒间隔数(64 位无符号整数) // Unix 时间戳: 从 1970-01-01 起的秒数 /** FILETIME 纪元 (1601-01-01) 与 Unix 纪元 (1970-01-01) 的差值,单位为 100 纳秒 */ -const FILETIME_UNIX_EPOCH_DIFF = 116444736000000000n; +const FILETIME_UNIX_EPOCH_DIFF = 116444736000000000n /** 每毫秒的 100 纳秒数 */ -const HUNDRED_NS_PER_MS = 10000n; +const HUNDRED_NS_PER_MS = 10000n // ─── GUID 序列化 ──────────────────────────────────────────────────────────── /** 将 GUID 结构序列化为 16 字节小端序 Buffer,用于网络传输 */ export function guidToBuffer(guid: GUID): Buffer { - const buf = Buffer.alloc(16); - buf.writeUInt32LE(guid.data1, 0); - buf.writeUInt16LE(guid.data2, 4); - buf.writeUInt16LE(guid.data3, 6); - guid.data4.copy(buf, 8, 0, 8); - return buf; + const buf = Buffer.alloc(16) + buf.writeUInt32LE(guid.data1, 0) + buf.writeUInt16LE(guid.data2, 4) + buf.writeUInt16LE(guid.data3, 6) + guid.data4.copy(buf, 8, 0, 8) + return buf } /** @@ -54,16 +54,17 @@ export function guidToBuffer(guid: GUID): Buffer { * 参考: src/helpers.c 中的 string2UuidLE() */ export function stringToGuidLE(str: string): GUID | null { - const re = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i; - const m = str.match(re); - if (!m) return null; + const re = + /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i + const m = str.match(re) + if (!m) return null - const data1 = parseInt(m[1], 16) >>> 0; - const data2 = parseInt(m[2], 16); - const data3 = parseInt(m[3], 16); - const data4 = Buffer.from(m[4] + m[5], 'hex'); + const data1 = parseInt(m[1], 16) >>> 0 + const data2 = parseInt(m[2], 16) + const data3 = parseInt(m[3], 16) + const data4 = Buffer.from(m[4] + m[5], 'hex') - return { data1, data2, data3, data4 }; + return { data1, data2, data3, data4 } } // ─── FILETIME 转换 ────────────────────────────────────────────────────────── @@ -73,11 +74,11 @@ export function stringToGuidLE(str: string): GUID | null { * 参考: src/helpers.c 中的 getFileTime() */ export function unixTimeToFileTime(): Buffer { - const nowMs = BigInt(Date.now()); - const ft = nowMs * HUNDRED_NS_PER_MS + FILETIME_UNIX_EPOCH_DIFF; - const buf = Buffer.alloc(8); - buf.writeBigUInt64LE(ft); - return buf; + const nowMs = BigInt(Date.now()) + const ft = nowMs * HUNDRED_NS_PER_MS + FILETIME_UNIX_EPOCH_DIFF + const buf = Buffer.alloc(8) + buf.writeBigUInt64LE(ft) + return buf } /** @@ -85,9 +86,9 @@ export function unixTimeToFileTime(): Buffer { * 参考: src/output.c 中的时间格式化逻辑 */ export function fileTimeToUnixTime(ft: Buffer): number { - const val = ft.readBigUInt64LE(0); - const unixMs = (val - FILETIME_UNIX_EPOCH_DIFF) / HUNDRED_NS_PER_MS; - return Number(unixMs) / 1000; + const val = ft.readBigUInt64LE(0) + const unixMs = (val - FILETIME_UNIX_EPOCH_DIFF) / HUNDRED_NS_PER_MS + return Number(unixMs) / 1000 } // ─── UCS-2 编码转换 ───────────────────────────────────────────────────────── @@ -98,11 +99,11 @@ export function fileTimeToUnixTime(ft: Buffer): number { * 超出部分截断,不足部分填零 */ export function utf8ToUcs2(str: string, maxChars: number): Buffer { - const buf = Buffer.alloc(maxChars * 2); - const truncated = str.slice(0, maxChars); - const encoded = Buffer.from(truncated, 'utf16le'); - encoded.copy(buf, 0, 0, Math.min(encoded.length, maxChars * 2)); - return buf; + const buf = Buffer.alloc(maxChars * 2) + const truncated = str.slice(0, maxChars) + const encoded = Buffer.from(truncated, 'utf16le') + encoded.copy(buf, 0, 0, Math.min(encoded.length, maxChars * 2)) + return buf } /** @@ -110,22 +111,22 @@ export function utf8ToUcs2(str: string, maxChars: number): Buffer { * 参考: src/output.c 中 ePID 的解码逻辑 */ export function ucs2ToUtf8(buf: Buffer, maxChars: number): string { - const limit = Math.min(buf.length, maxChars * 2); + const limit = Math.min(buf.length, maxChars * 2) // 查找空终止符(偶数边界上的两个零字节) - let end = limit; + let end = limit for (let i = 0; i < limit; i += 2) { if (buf[i] === 0 && buf[i + 1] === 0) { - end = i; - break; + end = i + break } } - return buf.subarray(0, end).toString('utf16le'); + return buf.subarray(0, end).toString('utf16le') } // ─── 版本信息 ─────────────────────────────────────────────────────────────── /** 版本标识字符串,对应原版的 VERSION 宏 */ -export const VERSION = 'private build'; +export const VERSION = 'private build' // ─── 响应验证结果 ─────────────────────────────────────────────────────────── @@ -134,17 +135,17 @@ export const VERSION = 'private build'; * 每个字段表示一项验证检查是否通过 */ export interface ResponseResult { - mask: number; // 所有检查结果的位掩码 - hashOK: boolean; // 哈希验证通过 - timeStampOK: boolean; // 时间戳匹配 - clientMachineIDOK: boolean; // 客户端机器 ID 匹配 - versionOK: boolean; // 协议版本一致 - ivsOK: boolean; // IV(初始化向量)匹配 - decryptSuccess: boolean; // 解密成功 - hmacSha256OK: boolean; // HMAC-SHA256 验证通过(仅 V6) - pidLengthOK: boolean; // PID 长度有效 - rpcOK: boolean; // RPC 返回码为零 - ivNotSuspicious: boolean; // IV 非可疑(V6 中请求和响应 IV 应不同) - effectiveResponseSize: number; // 实际响应大小 - correctResponseSize: number; // 预期响应大小 + mask: number // 所有检查结果的位掩码 + hashOK: boolean // 哈希验证通过 + timeStampOK: boolean // 时间戳匹配 + clientMachineIDOK: boolean // 客户端机器 ID 匹配 + versionOK: boolean // 协议版本一致 + ivsOK: boolean // IV(初始化向量)匹配 + decryptSuccess: boolean // 解密成功 + hmacSha256OK: boolean // HMAC-SHA256 验证通过(仅 V6) + pidLengthOK: boolean // PID 长度有效 + rpcOK: boolean // RPC 返回码为零 + ivNotSuspicious: boolean // IV 非可疑(V6 中请求和响应 IV 应不同) + effectiveResponseSize: number // 实际响应大小 + correctResponseSize: number // 预期响应大小 } diff --git a/nuxt.config.ts b/nuxt.config.ts index ee61c9a2..6724d586 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -3,7 +3,7 @@ const getMonitorCron = () => { const raw = parseInt( process.env.NUXT_MONITOR_INTERVAL || process.env.MONITOR_INTERVAL || '30', - 60, + 60 ) const seconds = isNaN(raw) || raw <= 0 ? 10 : raw if (seconds < 60) { @@ -17,15 +17,15 @@ export default defineNuxtConfig({ compatibilityDate: '2024-11-01', devtools: { enabled: true }, future: { - compatibilityVersion: 4, + compatibilityVersion: 4 }, nitro: { experimental: { - tasks: true, + tasks: true }, scheduledTasks: { - [getMonitorCron()]: ['monitor'], - }, + [getMonitorCron()]: ['monitor'] + } }, app: { head: { @@ -33,15 +33,15 @@ export default defineNuxtConfig({ { defer: '', src: 'https://umami.ikxin.com/script.js', - 'data-website-id': '6c719cb2-4a72-46e6-a4fa-2ee357a38467', - }, - ], - }, + 'data-website-id': '6c719cb2-4a72-46e6-a4fa-2ee357a38467' + } + ] + } }, vite: { optimizeDeps: { - include: ['@vue/devtools-core', '@vue/devtools-kit'], - }, + include: ['@vue/devtools-core', '@vue/devtools-kit'] + } }, runtimeConfig: { monitorList: '', @@ -49,14 +49,14 @@ export default defineNuxtConfig({ public: { apiUrl: '', i18n: { - baseUrl: 'https://kms.ikxin.com', - }, - }, + baseUrl: 'https://kms.ikxin.com' + } + } }, routeRules: { '/api/*': { - cors: true, - }, + cors: true + } }, css: ['~/assets/css/main.css'], modules: [ @@ -66,10 +66,10 @@ export default defineNuxtConfig({ '@nuxtjs/i18n', '@nuxtjs/color-mode', '@vueuse/nuxt', - 'nuxt-echarts', + 'nuxt-echarts' ], colorMode: { - classSuffix: '-mode', + classSuffix: '-mode' }, i18n: { defaultLocale: 'zh-cn', @@ -81,27 +81,27 @@ export default defineNuxtConfig({ language: 'zh-CN', file: 'zh-cn.json', name: '简体中文', - icon: 'cn', + icon: 'cn' }, { code: 'en', language: 'en-US', file: 'en.json', name: 'English', - icon: 'us', - }, - ], + icon: 'us' + } + ] }, icon: { customCollections: [ { prefix: 'icons', - dir: './app/assets/icons', - }, - ], + dir: './app/assets/icons' + } + ] }, echarts: { charts: ['BarChart'], - components: ['TooltipComponent', 'GridComponent'], - }, + components: ['TooltipComponent', 'GridComponent'] + } }) diff --git a/package.json b/package.json index 32b7a787..392b65b9 100644 --- a/package.json +++ b/package.json @@ -9,13 +9,15 @@ "dev": "nuxt dev --host 0.0.0.0", "generate": "nuxt generate", "preview": "nuxt preview", + "format": "oxfmt", + "format:check": "oxfmt --check", "postinstall": "pnpm -C node-vlmcs build && nuxt prepare" }, "dependencies": { "@iconify-json/flag": "^1.2.11", "@nuxt/icon": "^2.2.1", "@nuxtjs/color-mode": "^4.0.0", - "@nuxtjs/i18n": "^10.2.3", + "@nuxtjs/i18n": "^10.2.4", "@nuxtjs/tailwindcss": "^6.14.0", "@vueuse/nuxt": "14.2.1", "arco-design-nuxt-module": "^0.2.1", @@ -23,24 +25,7 @@ "node-vlmcs": "workspace:*", "nuxt": "^4.4.2", "nuxt-echarts": "^1.0.1", - "prettier": "^3.8.1", - "prettier-plugin-tailwindcss": "^0.7.2", + "oxfmt": "^0.41.0", "vue": "^3.5.30" - }, - "prettier": { - "arrowParens": "avoid", - "semi": false, - "singleQuote": true, - "plugins": [ - "prettier-plugin-tailwindcss" - ], - "overrides": [ - { - "files": "shared/utils/gvlks.ts", - "options": { - "printWidth": 200 - } - } - ] } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d11a32ea..9de093a7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,38 +18,32 @@ importers: specifier: ^4.0.0 version: 4.0.0(magicast@0.5.2) '@nuxtjs/i18n': - specifier: ^10.2.3 - version: 10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(rollup@4.60.0)(vue@3.5.30(typescript@5.9.3)) + specifier: ^10.2.4 + version: 10.2.4(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(rollup@4.60.0)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) '@nuxtjs/tailwindcss': specifier: ^6.14.0 version: 6.14.0(magicast@0.5.2)(tsx@4.19.2)(yaml@2.8.3) '@vueuse/nuxt': specifier: 14.2.1 - version: 14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.30(typescript@5.9.3)) + version: 14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.30(typescript@5.9.3)) arco-design-nuxt-module: specifier: ^0.2.1 version: 0.2.1(@arco-design/web-vue@2.56.3(vue@3.5.30(typescript@5.9.3)))(magicast@0.5.2) echarts: specifier: ^6.0.0 version: 6.0.0 - motion-v: - specifier: ^2.2.0 - version: 2.2.0(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) node-vlmcs: specifier: workspace:* version: link:node-vlmcs nuxt: specifier: ^4.4.2 - version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) nuxt-echarts: specifier: ^1.0.1 version: 1.0.1(echarts@6.0.0)(magicast@0.5.2)(vue-echarts@8.0.1(echarts@6.0.0)(vue@3.5.30(typescript@5.9.3))) - prettier: - specifier: ^3.8.1 - version: 3.8.1 - prettier-plugin-tailwindcss: - specifier: ^0.7.2 - version: 0.7.2(prettier@3.8.1) + oxfmt: + specifier: ^0.41.0 + version: 0.41.0 vue: specifier: ^3.5.30 version: 3.5.30(typescript@5.9.3) @@ -717,32 +711,32 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.19.2': - resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} + '@eslint/config-array@0.21.2': + resolution: {integrity: sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.13.0': - resolution: {integrity: sha512-yfkgDw1KR66rkT5A8ci4irzDysN7FRpq3ttJolR88OqQikAWqwA8j5VZyas+vjyBNFIJ7MfybJ9plMILI2UrCw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.9.1': - resolution: {integrity: sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@3.3.5': resolution: {integrity: sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.17.0': - resolution: {integrity: sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==} + '@eslint/js@9.39.4': + resolution: {integrity: sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.8': - resolution: {integrity: sha512-ZAoA40rNMPwSm+AeHpCq8STiNAwzWLJuP8Xv4CHIc9wv/PSuExjMrmjfYNj682vW0OOiZ1HKxzvjQr9XZIisQA==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@3.2.0': @@ -834,6 +828,10 @@ packages: resolution: {integrity: sha512-8i3uRdAxCGzuHwfmHcVjeLQBtysQB2aXl/ojoagDut5/gY5lvWCQ2+cnl2TiqE/fXj/D8EhWG/SLKA7qz4a3QA==} engines: {node: '>= 18'} + '@intlify/utils@0.14.1': + resolution: {integrity: sha512-/NVDhX6sG87h0PXIwUCTW9DeHbKeqlni6qVV8xzMULQRHE9azIETldBlTKaBji7z6ostyDIH4s6SWI3AAI4uFg==} + engines: {node: '>= 20'} + '@intlify/vue-i18n-extensions@8.0.0': resolution: {integrity: sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==} engines: {node: '>= 18'} @@ -1024,8 +1022,8 @@ packages: '@nuxtjs/color-mode@4.0.0': resolution: {integrity: sha512-xyaVR/TPLdMuRa2VOgH6b75jvmFEsn9QKL6ISldaAw38ooFJfWY1ts2F3ye43wcT/goCbcuvPuskF2f8yUZhlw==} - '@nuxtjs/i18n@10.2.3': - resolution: {integrity: sha512-nRAQJbWjbiBvW6XRsG3Q6olYw2EKz7V1J6cDCHLCPbF1EyNhrAH/9aCNQaR5PYcoXPeRLpF86DIPBEnamghyHw==} + '@nuxtjs/i18n@10.2.4': + resolution: {integrity: sha512-T5nN7hT/tbExant+CeXtKXs9GbjWsEWnymCHJyU3Ujxfcw1WQsZZP6tyEtFRhkwjBwy8m4mj7GtU2qUCggUkkg==} engines: {node: '>=20.11.1'} '@nuxtjs/tailwindcss@6.14.0': @@ -1158,23 +1156,35 @@ packages: cpu: [x64] os: [win32] + '@oxc-parser/binding-android-arm-eabi@0.112.0': + resolution: {integrity: sha512-retxBzJ39Da7Lh/eZTn9+HJgTeDUxZIpuI0urOsmcFsBKXAth3lc1jIvwseQ9qbAI/VrsoFOXiGIzgclARbAHg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + '@oxc-parser/binding-android-arm-eabi@0.117.0': resolution: {integrity: sha512-XarGPJpaobgKjfm7xRfCGWWszuPbm/OeP91NdMhxtcLZ/qLTmWF0P0z0gqmr0Uysi1F1v1BNtcST11THMrcEOw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] + '@oxc-parser/binding-android-arm64@0.112.0': + resolution: {integrity: sha512-pRkbBRbuIIsufUWpOJ+JHWfJFNupkidy4sbjfcm37e6xwYrn9LSKMLubPHvNaL1Zf92ZRhGiwaYkEcmaFg2VcA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-parser/binding-android-arm64@0.117.0': resolution: {integrity: sha512-EPTs2EBijGmyhPso4rXAL0NSpECXER9IaVKFZEv83YcA6h4uhKW47kmYt+OZcSp130zhHx+lTWILDQ/LDkCRNA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-parser/binding-android-arm64@0.95.0': - resolution: {integrity: sha512-dZyxhhvJigwWL1wgnLlqyEiSeuqO0WdDH9H+if0dPcBM4fKa5fjVkaUcJT1jBMcBTnkjxMwTXYZy5TK60N0fjg==} + '@oxc-parser/binding-darwin-arm64@0.112.0': + resolution: {integrity: sha512-fh6/KQL/cbH5DukT3VkdCqnULLuvVnszVKySD5IgSE0WZb32YZo/cPsPdEv052kk6w3N4agu+NTiMnZjcvhUIg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [android] + os: [darwin] '@oxc-parser/binding-darwin-arm64@0.117.0': resolution: {integrity: sha512-3bAEpyih6r/Kb+Xzn1em1qBMClOS7NsVWgF86k95jpysR5ix/HlKFKSy7cax6PcS96HeHR4kjlME20n/XK1zNg==} @@ -1182,10 +1192,10 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-arm64@0.95.0': - resolution: {integrity: sha512-zun9+V33kyCtNec9oUSWwb0qi3fB8pXwum1yGFECPEr55g/CrWju6/Jv4hwwNBeW2tK9Ch/PRstEtYmOLMhHpg==} + '@oxc-parser/binding-darwin-x64@0.112.0': + resolution: {integrity: sha512-vUBOOY1E30vlu/DoTGDoT1UbLlwu5Yv9tqeBabAwRzwNDz8Skho16VKhsBDUiyqddtpsR3//v6vNk38w4c+6IA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + cpu: [x64] os: [darwin] '@oxc-parser/binding-darwin-x64@0.117.0': @@ -1194,11 +1204,11 @@ packages: cpu: [x64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.95.0': - resolution: {integrity: sha512-9djMQ/t6Ns/UXtziwUe562uVJMbhtuLtCj+Xav+HMVT/rhV9gWO8PQOG7AwDLUBjJanItsrfqrGtqhNxtZ701w==} + '@oxc-parser/binding-freebsd-x64@0.112.0': + resolution: {integrity: sha512-hnEtO/9AVnYWzrgnp6L+oPs/6UqlFeteUL6n7magkd2tttgmx1C01hyNNh6nTpZfLzEVJSNJ0S+4NTsK2q2CxA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [darwin] + os: [freebsd] '@oxc-parser/binding-freebsd-x64@0.117.0': resolution: {integrity: sha512-xH76lqSdjCSY0KUMPwLXlvQ3YEm3FFVEQmgiOCGNf+stZ6E4Mo3nC102Bo8yKd7aW0foIPAFLYsHgj7vVI/axw==} @@ -1206,11 +1216,11 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-parser/binding-freebsd-x64@0.95.0': - resolution: {integrity: sha512-GK6k0PgCVkkeRZtHgcosCYbXIRySpJpuPw/OInfLGFh8f3x9gp2l8Fbcfx+YO+ZOHFBCd2NNedGqw8wMgouxfA==} + '@oxc-parser/binding-linux-arm-gnueabihf@0.112.0': + resolution: {integrity: sha512-WxJrUz3pcIc2hp4lvJbvt/sTL33oX9NPvkD3vDDybE6tc0V++rS+hNOJxwXdD2FDIFPkHs/IEn5asEZFVH+VKw==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] + cpu: [arm] + os: [linux] '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0': resolution: {integrity: sha512-9Hdm1imzrn4RdMYnQKKcy+7p7QsSPIrgVIZmpGSJT02nYDuBWLdG1pdYMPFoEo46yiXry3tS3RoHIpNbT1IiyQ==} @@ -1218,8 +1228,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-gnueabihf@0.95.0': - resolution: {integrity: sha512-+g/lFITtyHHEk69cunOHuiT5cX+mpUTcbGYNe8suguZ7FqgNwai+PnGv0ctCvtgxBPVfckfUK8c3RvFKo+vi/w==} + '@oxc-parser/binding-linux-arm-musleabihf@0.112.0': + resolution: {integrity: sha512-jj8A8WWySaJQqM9XKAIG8U2Q3qxhFQKrXPWv98d1oC35at+L1h+C+V4M3l8BAKhpHKCu3dYlloaAbHd5q1Hw6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -1230,11 +1240,12 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.95.0': - resolution: {integrity: sha512-SXNasDtPw8ycNV7VEvFxb4LETmykvWKUhHR7K3us818coXYpDj54P8WEx8hJobP/9skuuiFuKHmtYLdjX8wntA==} + '@oxc-parser/binding-linux-arm64-gnu@0.112.0': + resolution: {integrity: sha512-G2F8H6FcAExVK5vvhpSh61tqWx5QoaXXUnSsj5FyuDiFT/K7AMMVSQVqnZREDc+YxhrjB0vnKjCcuobXK63kIw==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] + cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-parser/binding-linux-arm64-gnu@0.117.0': resolution: {integrity: sha512-jBxD7DtlHQ36ivjjZdH0noQJgWNouenzpLmXNKnYaCsBfo3jY95m5iyjYQEiWkvkhJ3TJUAs7tQ1/kEpY7x/Kg==} @@ -1243,12 +1254,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-gnu@0.95.0': - resolution: {integrity: sha512-0LzebARTU0ROfD6pDK4h1pFn+09meErCZ0MA2TaW08G72+GNneEsksPufOuI+9AxVSRa+jKE3fu0wavvhZgSkg==} + '@oxc-parser/binding-linux-arm64-musl@0.112.0': + resolution: {integrity: sha512-3R0iqjM3xYOZCnwgcxOQXH7hrz64/USDIuLbNTM1kZqQzRqaR4w7SwoWKU934zABo8d0op2oSwOp+CV3hZnM7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-parser/binding-linux-arm64-musl@0.117.0': resolution: {integrity: sha512-QagKTDF4lrz8bCXbUi39Uq5xs7C7itAseKm51f33U+Dyar9eJY/zGKqfME9mKLOiahX7Fc1J3xMWVS0AdDXLPg==} @@ -1257,12 +1268,12 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-arm64-musl@0.95.0': - resolution: {integrity: sha512-Pvi1lGe/G+mJZ3hUojMP/aAHAzHA25AEtVr8/iuz7UV72t/15NOgJYr9kELMUMNjPqpr3vKUgXTFmTtAxp11Qw==} + '@oxc-parser/binding-linux-ppc64-gnu@0.112.0': + resolution: {integrity: sha512-lAQf8PQxfgy7h0bmcfSVE3hg3qMueshPYULFsCrHM+8KefGZ9W+ZMvRyU33gLrB4w1O3Fz1orR0hmKMCRxXNrQ==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + cpu: [ppc64] os: [linux] - libc: [musl] + libc: [glibc] '@oxc-parser/binding-linux-ppc64-gnu@0.117.0': resolution: {integrity: sha512-RPddpcE/0xxWaommWy0c5i/JdrXcXAkxBS2GOrAUh5LKmyCh03hpJedOAWszG4ADsKQwoUQQ1/tZVGRhZIWtKA==} @@ -1271,6 +1282,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.112.0': + resolution: {integrity: sha512-2QlvQBUhHuAE3ezD4X3CAEKMXdfgInggQ5Bj/7gb5NcYP3GyfLTj7c+mMu+BRwfC9B3AXBNyqHWbqEuuUvZyRQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-riscv64-gnu@0.117.0': resolution: {integrity: sha512-ur/WVZF9FSOiZGxyP+nfxZzuv6r5OJDYoVxJnUR7fM/hhXLh4V/be6rjbzm9KLCDBRwYCEKJtt+XXNccwd06IA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1278,12 +1296,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': - resolution: {integrity: sha512-pUEVHIOVNDfhk4sTlLhn6mrNENhE4/dAwemxIfqpcSyBlYG0xYZND1F3jjR2yWY6DakXZ6VSuDbtiv1LPNlOLw==} + '@oxc-parser/binding-linux-riscv64-musl@0.112.0': + resolution: {integrity: sha512-v06iu0osHszgqJ1dLQRb6leWFU1sjG/UQk4MoVBtE6ZPewgfTkby6G9II1SpEAf2onnAuQceVYxQH9iuU3NJqw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-parser/binding-linux-riscv64-musl@0.117.0': resolution: {integrity: sha512-ujGcAx8xAMvhy7X5sBFi3GXML1EtyORuJZ5z2T6UV3U416WgDX/4OCi3GnoteeenvxIf6JgP45B+YTHpt71vpA==} @@ -1292,6 +1310,13 @@ packages: os: [linux] libc: [musl] + '@oxc-parser/binding-linux-s390x-gnu@0.112.0': + resolution: {integrity: sha512-+5HhNHtxsdcd7+ljXFnn9FOoCNXJX3UPgIfIE6vdwS1HqdGNH6eAcVobuqGOp54l8pvcxDQA6F4cPswCgLrQfQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-parser/binding-linux-s390x-gnu@0.117.0': resolution: {integrity: sha512-hbsfKjUwRjcMZZvvmpZSc+qS0bHcHRu8aV/I3Ikn9BzOA0ZAgUE7ctPtce5zCU7bM8dnTLi4sJ1Pi9YHdx6Urw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1299,10 +1324,10 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-s390x-gnu@0.95.0': - resolution: {integrity: sha512-5+olaepHTE3J/+w7g0tr3nocvv5BKilAJnzj4L8tWBCLEZbL6olJcGVoldUO+3cgg1SO1xJywP5BuLhT0mDUDw==} + '@oxc-parser/binding-linux-x64-gnu@0.112.0': + resolution: {integrity: sha512-jKwO7ZLNkjxwg7FoCLw+fJszooL9yXRZsDN0AQ1AQUTWq1l8GH/2e44k68N3fcP19jl8O8jGpqLAZcQTYk6skA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] + cpu: [x64] os: [linux] libc: [glibc] @@ -1313,12 +1338,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.95.0': - resolution: {integrity: sha512-8huzHlK/N98wrnYKxIcYsK8ZGBWomQchu/Mzi6m+CtbhjWOv9DmK0jQ2fUWImtluQVpTwS0uZT06d3g7XIkJrA==} + '@oxc-parser/binding-linux-x64-musl@0.112.0': + resolution: {integrity: sha512-TYqnuKV/p3eOc+N61E0961nA7DC+gaCeJ3+V2LcjJdTwFMdikqWL6uVk1jlrpUCBrozHDATVUKDZYH7r4FQYjQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-parser/binding-linux-x64-musl@0.117.0': resolution: {integrity: sha512-gRvK6HPzF5ITRL68fqb2WYYs/hGviPIbkV84HWCgiJX+LkaOpp+HIHQl3zVZdyKHwopXToTbXbtx/oFjDjl8pg==} @@ -1327,12 +1352,11 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-x64-musl@0.95.0': - resolution: {integrity: sha512-bWnrLfGDcx/fab0+UQnFbVFbiykof/btImbYf+cI2pU/1Egb2x+OKSmM5Qt0nEUiIpM5fgJmYXxTopybSZOKYA==} + '@oxc-parser/binding-openharmony-arm64@0.112.0': + resolution: {integrity: sha512-ZhrVmWFifVEFQX4XPwLoVFDHw9tAWH9p9vHsHFH+5uCKdfVR+jje4WxVo6YrokWCboGckoOzHq5KKMOcPZfkRg==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] + cpu: [arm64] + os: [openharmony] '@oxc-parser/binding-openharmony-arm64@0.117.0': resolution: {integrity: sha512-QPJvFbnnDZZY7xc+xpbIBWLThcGBakwaYA9vKV8b3+oS5MGfAZUoTFJcix5+Zg2Ri46sOfrUim6Y6jsKNcssAQ==} @@ -1340,26 +1364,32 @@ packages: cpu: [arm64] os: [openharmony] - '@oxc-parser/binding-wasm32-wasi@0.117.0': - resolution: {integrity: sha512-+XRSNA0xt3pk/6CUHM7pykVe7M8SdifJk8LX1+fIp/zefvR3HBieZCbwG5un8gogNgh7srLycoh/cQA9uozv5g==} + '@oxc-parser/binding-wasm32-wasi@0.112.0': + resolution: {integrity: sha512-Gr8X2PUU3hX1g3F5oLWIZB8DhzDmjr5TfOrmn5tlBOo9l8ojPGdKjnIBfObM7X15928vza8QRKW25RTR7jfivg==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-wasm32-wasi@0.95.0': - resolution: {integrity: sha512-0JLyqkZu1HnQIZ4e5LBGOtzqua1QwFEUOoMSycdoerXqayd4LK2b7WMfAx8eCIf+jGm1Uj6f3R00nlsx8g1faQ==} + '@oxc-parser/binding-wasm32-wasi@0.117.0': + resolution: {integrity: sha512-+XRSNA0xt3pk/6CUHM7pykVe7M8SdifJk8LX1+fIp/zefvR3HBieZCbwG5un8gogNgh7srLycoh/cQA9uozv5g==} engines: {node: '>=14.0.0'} cpu: [wasm32] + '@oxc-parser/binding-win32-arm64-msvc@0.112.0': + resolution: {integrity: sha512-t5CDLbU70Ea88bGRhvU/dLJTc/Wcrtf2Jp534E8P3cgjAvHDjdKsfDDqBZrhybJ8Jv9v9vW5ngE40EK51BluDA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + '@oxc-parser/binding-win32-arm64-msvc@0.117.0': resolution: {integrity: sha512-GpxeGS+Vo030DsrXeRPc7OSJOQIyAHkM3mzwBcnQjg/79XnOIDDMXJ5X6/aNdkVt/+Pv35pqKzGA4TQau97x8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-arm64-msvc@0.95.0': - resolution: {integrity: sha512-RWvaA6s1SYlBj9CxwHfNn0CRlkPdv9fEUAXfZkGQPdP5e1ppIaO2KYE0sUov/zzp9hPTMMsTMHl4dcIbb+pHCQ==} + '@oxc-parser/binding-win32-ia32-msvc@0.112.0': + resolution: {integrity: sha512-rZH0JynCCwnhe2HfRoyNOl/Kfd9pudoWxgpC5OZhj7j77pMK0UOAa35hYDfrtSOUk2HLzrikV5dPUOY2DpSBSA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + cpu: [ia32] os: [win32] '@oxc-parser/binding-win32-ia32-msvc@0.117.0': @@ -1368,23 +1398,29 @@ packages: cpu: [ia32] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.117.0': - resolution: {integrity: sha512-ysRJAjIbB4e5y+t9PZs7TwbgOV/GVT//s30AORLCT/pedYwpYzHq6ApXK7is9fvyfZtgT3anNir8+esurmyaDw==} + '@oxc-parser/binding-win32-x64-msvc@0.112.0': + resolution: {integrity: sha512-oGHluohzmVFAuQrkEnl1OXAxMz2aYmimxUqIgKXpBgbr7PvFv0doELB273sX+5V3fKeggohKg1A2Qq21W9Z9cQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.95.0': - resolution: {integrity: sha512-BQpgl7rDjFvCIHudmUR0dCwc4ylBYZl4CPVinlD3NhkMif4WD5dADckoo5ES/KOpFyvwcbKZX+grP63cjHi26g==} + '@oxc-parser/binding-win32-x64-msvc@0.117.0': + resolution: {integrity: sha512-ysRJAjIbB4e5y+t9PZs7TwbgOV/GVT//s30AORLCT/pedYwpYzHq6ApXK7is9fvyfZtgT3anNir8+esurmyaDw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] + '@oxc-project/types@0.112.0': + resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} + '@oxc-project/types@0.117.0': resolution: {integrity: sha512-C/kPXBphID44fXdsa2xSOCuzX8fKZiFxPsvucJ6Yfkr6CJlMA+kNLPNKyLoI+l9XlDsNxBrz6h7IIjKU8pB69w==} - '@oxc-project/types@0.95.0': - resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} + '@oxc-transform/binding-android-arm-eabi@0.112.0': + resolution: {integrity: sha512-r4LuBaPnOAi0eUOBNi880Fm2tO2omH7N1FRrL6+nyz/AjQ+QPPLtoyZJva0O+sKi1buyN/7IzM5p9m+5ANSDbg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] '@oxc-transform/binding-android-arm-eabi@0.117.0': resolution: {integrity: sha512-17giX7h5VR9Eodru4OoSCFdgwLFIaUxeEn8JWe0vMZrAuRbT9NiDTy5dXdbGQBoO8aXPkbGS38FGlvbi31aujw==} @@ -1392,17 +1428,23 @@ packages: cpu: [arm] os: [android] + '@oxc-transform/binding-android-arm64@0.112.0': + resolution: {integrity: sha512-ve46vQcQrY8eGe8990VSlS9gkD+AogJqbtfOkeua+5sQGQTDgeIRRxOm7ktCo19uZc2bEBwXRJITgosd+NRVmQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + '@oxc-transform/binding-android-arm64@0.117.0': resolution: {integrity: sha512-1LrDd1CPochtLx04pAafdah6QtOQQj0/Evttevi+0u8rCI5FKucIG7pqBHkIQi/y7pycFYIj+GebhET80maeUg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxc-transform/binding-android-arm64@0.95.0': - resolution: {integrity: sha512-eW+BCgRWOsMrDiz7FEV7BjAmaF9lGIc2ueGdRUYjRUMq4f5FSGS7gMBTYDxajdoIB3L5Gnksh1CWkIlgg95UVA==} + '@oxc-transform/binding-darwin-arm64@0.112.0': + resolution: {integrity: sha512-ddbmLU3Tr+i7MOynfwAXxUXud3SjJKlv7XNjaq08qiI8Av/QvhXVGc2bMhXkWQSMSBUeTDoiughKjK+Zsb6y/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [android] + os: [darwin] '@oxc-transform/binding-darwin-arm64@0.117.0': resolution: {integrity: sha512-K1Xo52xJOvFfHSkz2ax9X5Qsku23RCfTIPbHZWdUCAQ1TQooI+sFcewSubhVUJ4DVK12/tYT//XXboumin+FHA==} @@ -1410,10 +1452,10 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-transform/binding-darwin-arm64@0.95.0': - resolution: {integrity: sha512-OUUaYZVss8tyDZZ7TGr2vnH3+i3Ouwsx0frQRGkiePNatXxaJJ3NS5+Kwgi9hh3WryXaQz2hWji4AM2RHYE7Cg==} + '@oxc-transform/binding-darwin-x64@0.112.0': + resolution: {integrity: sha512-TKvmNw96jQZPqYb4pRrzLFDailNB3YS14KNn+x2hwRbqc6CqY96S9PYwyOpVpYdxfoRjYO9WgX9SoS+62a1DPA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + cpu: [x64] os: [darwin] '@oxc-transform/binding-darwin-x64@0.117.0': @@ -1422,11 +1464,11 @@ packages: cpu: [x64] os: [darwin] - '@oxc-transform/binding-darwin-x64@0.95.0': - resolution: {integrity: sha512-49UPEgIlgWUndwcP3LH6dvmOewZ92DxCMpFMo11JhUlmNJxA3sjVImEBRB56/tJ+XF+xnya9kB1oCW4yRY+mRw==} + '@oxc-transform/binding-freebsd-x64@0.112.0': + resolution: {integrity: sha512-YPMkSCDaelO8HHYRMYjm+Q+IfkfIbdtQzwPuasItYkq8UUkNeHNPheNh2JkvQa3c+io3E9ePOgHQ2yihpk7o/Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] - os: [darwin] + os: [freebsd] '@oxc-transform/binding-freebsd-x64@0.117.0': resolution: {integrity: sha512-QDRyw0atg9BMnwOwnJeW6REzWPLEjiWtsCc2Sj612F1hCdvP+n0L3o8sHinEWM+BiOkOYtUxHA69WjUslc3G+g==} @@ -1434,11 +1476,11 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-transform/binding-freebsd-x64@0.95.0': - resolution: {integrity: sha512-lNKrHKaDEm8pbKlVbn0rv2L97O0lbA0Tsrxx4GF/HhmdW+NgwGU1pMzZ4tB2QcylbqgKxOB+v9luebHyh1jfgA==} + '@oxc-transform/binding-linux-arm-gnueabihf@0.112.0': + resolution: {integrity: sha512-nA7kzQGNEpuTRknst/IJ3l8hqmDmEda3aun6jkXgp7gKxESjuHeaNH04mKISxvJ7fIacvP2g/wtTSnm4u5jL8Q==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] + cpu: [arm] + os: [linux] '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0': resolution: {integrity: sha512-UvpvOjyQVgiIJahIpMT0qAsLJT8O1ibHTBgXGOsZkQgw1xmjARPQ07dpRcucPPn6cqCF3wrxfbqtr2vFHaMkdA==} @@ -1446,8 +1488,8 @@ packages: cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-gnueabihf@0.95.0': - resolution: {integrity: sha512-+VWcLeeizI8IjU+V+o8AmzPuIMiTrGr0vrmXU3CEsV05MrywCuJU+f6ilPs3JBKno9VIwqvRpHB/z39sQabHWg==} + '@oxc-transform/binding-linux-arm-musleabihf@0.112.0': + resolution: {integrity: sha512-w8GuLmckKlGc3YujaZKhtbFxziCcosvM2l9GnQjCb/yENWLGDiyQOy0BTAgPGdJwpYTiOeJblEXSuXYvlE1Ong==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -1458,11 +1500,12 @@ packages: cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-musleabihf@0.95.0': - resolution: {integrity: sha512-a59xPw84t6VwlvNEGcmuw3feGcKcWOC7uB8oePJ/BVSAV1yayLoB3k6JASwLTZ7N/PNPNUhcw1jDxowgAfBJfg==} + '@oxc-transform/binding-linux-arm64-gnu@0.112.0': + resolution: {integrity: sha512-9LwwGnJ8+WT0rXcrI8M0RJtDNt91eMqcDPPEvJxhRFHIMcHTy5D5xT+fOl3Us0yMqKo3HUWkbfUYqAp4GoZ3Jw==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] + cpu: [arm64] os: [linux] + libc: [glibc] '@oxc-transform/binding-linux-arm64-gnu@0.117.0': resolution: {integrity: sha512-mXbDfvDN0RZVg7v4LohNzU0kK3fMAZgkUKTkpFVgxEvzibEG5VpSznkypUwHI4a8U8pz+K6mGaLetX3Xt+CvvA==} @@ -1471,12 +1514,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-arm64-gnu@0.95.0': - resolution: {integrity: sha512-NLdrFuEHlmbiC1M1WESFV4luUcB/84GXi+cbnRXhgMjIW/CThRVJ989eTJy59QivkVlLcJSKTiKiKCt0O6TTlQ==} + '@oxc-transform/binding-linux-arm64-musl@0.112.0': + resolution: {integrity: sha512-Lg6VOuSd3oXv7J0eGywgqh/086h+qQzIBOD+47pYKMTTJcbDe+f3h/RgGoMKJE5HhiwT5sH1aGEJfIfaYUiVSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-transform/binding-linux-arm64-musl@0.117.0': resolution: {integrity: sha512-ykxpPQp0eAcSmhy0Y3qKvdanHY4d8THPonDfmCoktUXb6r0X6qnjpJB3V+taN1wevW55bOEZd97kxtjTKjqhmg==} @@ -1485,12 +1528,12 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-arm64-musl@0.95.0': - resolution: {integrity: sha512-GL0ffCPW8JlFI0/jeSgCY665yDdojHxA0pbYG+k8oEHOWCYZUZK9AXL+r0oerNEWYJ8CRB+L5Yq87ZtU/YUitw==} + '@oxc-transform/binding-linux-ppc64-gnu@0.112.0': + resolution: {integrity: sha512-PXzmj82o1moA4IGphYImTRgc2youTi4VRfyFX3CHwLjxPcQ5JtcsgbDt4QUdOzXZ+zC07s5jf2ZzhRapEOlj2w==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] + cpu: [ppc64] os: [linux] - libc: [musl] + libc: [glibc] '@oxc-transform/binding-linux-ppc64-gnu@0.117.0': resolution: {integrity: sha512-Rvspti4Kr7eq6zSrURK5WjscfWQPvmy/KjJZV45neRKW8RLonE3r9+NgrwSLGoHvQ3F24fbqlkplox1RtlhH5A==} @@ -1499,6 +1542,13 @@ packages: os: [linux] libc: [glibc] + '@oxc-transform/binding-linux-riscv64-gnu@0.112.0': + resolution: {integrity: sha512-vhJsMsVH/6xwa3bt1LGts33FXUkGjaEGDwsRyp4lIfOjSfQVWMtCmWMFNaA0dW9FVWdD2Gt2fSFBSZ+azDxlpg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@oxc-transform/binding-linux-riscv64-gnu@0.117.0': resolution: {integrity: sha512-Dr2ZW9ZZ4l1eQ5JUEUY3smBh4JFPCPuybWaDZTLn3ADZjyd8ZtNXEjeMT8rQbbhbgSL9hEgbwaqraole3FNThQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1506,12 +1556,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': - resolution: {integrity: sha512-tbH7LaClSmN3YFVo1UjMSe7D6gkb5f+CMIbj9i873UUZomVRmAjC4ygioObfzM+sj/tX0WoTXx5L1YOfQkHL6Q==} + '@oxc-transform/binding-linux-riscv64-musl@0.112.0': + resolution: {integrity: sha512-cXWFb7z+2IjFUEcXtRwluq9oEG5qnyFCjiu3SWrgYNcWwPdHusv3I/7K5/CTbbi4StoZ5txbi7/iSfDHNyWuRw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-transform/binding-linux-riscv64-musl@0.117.0': resolution: {integrity: sha512-oD1Bnes1bIC3LVBSrWEoSUBj6fvatESPwAVWfJVGVQlqWuOs/ZBn1e4Nmbipo3KGPHK7DJY75r/j7CQCxhrOFQ==} @@ -1520,6 +1570,13 @@ packages: os: [linux] libc: [musl] + '@oxc-transform/binding-linux-s390x-gnu@0.112.0': + resolution: {integrity: sha512-eEFu4SRqJTJ20/88KRWmp+jpHKAw0Y1DsnSgpEeXyBIIcsOaLIUMU/TfYWUmqRbvbMV9rmOmI3kp5xWYUq6kSQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@oxc-transform/binding-linux-s390x-gnu@0.117.0': resolution: {integrity: sha512-qT//IAPLvse844t99Kff5j055qEbXfwzWgvCMb0FyjisnB8foy25iHZxZIocNBe6qwrCYWUP1M8rNrB/WyfS1Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1527,10 +1584,10 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-s390x-gnu@0.95.0': - resolution: {integrity: sha512-8jMqiURWa0iTiPMg7BWaln89VdhhWzNlPyKM90NaFVVhBIKCr2UEhrQWdpBw/E9C8uWf/4VabBEhfPMK+0yS4w==} + '@oxc-transform/binding-linux-x64-gnu@0.112.0': + resolution: {integrity: sha512-ST1MDT+TlOyZ1c5btrGinRSUW2Jf4Pa+0gdKwsyjDSOC3dxy2ZNkN3mosTf4ywc3J+mxfYKqtjs7zSwHz03ILA==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] + cpu: [x64] os: [linux] libc: [glibc] @@ -1541,12 +1598,12 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-x64-gnu@0.95.0': - resolution: {integrity: sha512-D5ULJ2uWipsTgfvHIvqmnGkCtB3Fyt2ZN7APRjVO+wLr+HtmnaWddKsLdrRWX/m/6nQ2xQdoQekdJrokYK9LtQ==} + '@oxc-transform/binding-linux-x64-musl@0.112.0': + resolution: {integrity: sha512-ISQoA3pD4cyTGpf9sXXeerH6pL2L6EIpdy6oAy2ttkswyVFDyQNVOVIGIdLZDgbpmqGljxZnWqt/J/N68pQaig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - libc: [glibc] + libc: [musl] '@oxc-transform/binding-linux-x64-musl@0.117.0': resolution: {integrity: sha512-3wqWbTSaIFZvDr1aqmTul4cg8PRWYh6VC52E8bLI7ytgS/BwJLW+sDUU2YaGIds4sAf/1yKeJRmudRCDPW9INg==} @@ -1555,12 +1612,11 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-x64-musl@0.95.0': - resolution: {integrity: sha512-DmCGU+FzRezES5wVAGVimZGzYIjMOapXbWpxuz8M8p3nMrfdBEQ5/tpwBp2vRlIohhABy4vhHJByl4c64ENCGQ==} + '@oxc-transform/binding-openharmony-arm64@0.112.0': + resolution: {integrity: sha512-UOGVrGIv7yLJovyEXEyUTADuLq98vd/cbMHFLJweRXD+11I8Tn4jASi4WzdsN8C3BVYGRHrXH2NlSBmhz33a4g==} engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] + cpu: [arm64] + os: [openharmony] '@oxc-transform/binding-openharmony-arm64@0.117.0': resolution: {integrity: sha512-Ebxx6NPqhzlrjvx4+PdSqbOq+li0f7X59XtJljDghkbJsbnkHvhLmPR09ifHt5X32UlZN63ekjwcg/nbmHLLlA==} @@ -1568,42 +1624,292 @@ packages: cpu: [arm64] os: [openharmony] + '@oxc-transform/binding-wasm32-wasi@0.112.0': + resolution: {integrity: sha512-XIX7Gpq9koAvzBVHDlVFHM79r5uOVK6kTEsdsN4qaajpjkgtv4tdsAOKIYK6l7fUbsbE6xS+6w1+yRFrDeC1kg==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + '@oxc-transform/binding-wasm32-wasi@0.117.0': resolution: {integrity: sha512-Nn8mmcBiQ0XKHLTb05QBlH+CDkn7jf5YDVv9FtKhy4zJT0NEU9y3dXVbfcurOpsVrG9me4ktzDQNCaAoJjUQyw==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-transform/binding-wasm32-wasi@0.95.0': - resolution: {integrity: sha512-tSo1EU4Whd1gXyae7cwSDouhppkuz6Jkd5LY8Uch9VKsHVSRhDLDW19Mq6VSwtyPxDPTJnJ2jYJWm+n8SYXiXQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] + '@oxc-transform/binding-win32-arm64-msvc@0.112.0': + resolution: {integrity: sha512-EgXef9kOne9BNsbYBbuRqxk2hteT0xsAGcx/VbtCBMJYNj8fANFhT271DUSOgfa4DAgrQQmsyt/Kr1aV9mpU9w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-arm64-msvc@0.117.0': + resolution: {integrity: sha512-15cbsF8diXWGnHrTsVgVeabETiT/KdMAfRAcot99xsaVecJs3pITNNjC6Qj+/TPNpehbgIFjlhhxOVSbQsTBgg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-ia32-msvc@0.112.0': + resolution: {integrity: sha512-6QaB0qjNaou2YR+blncHdw7j0e26IOwOIjLbhVGDeuf9+4rjJeiqRXJ2hOtCcS4zblnao/MjdgQuZ3fM0nl+Kw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-transform/binding-win32-ia32-msvc@0.117.0': + resolution: {integrity: sha512-I6DkhCuFX6p9rckdWiLuZfBWrrYUC7sNX+zLaCfa5zvrPNwo1/29KkefvqXVxu3AWT/6oZAbtc0A8/mqhETJPQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.112.0': + resolution: {integrity: sha512-FRKYlY959QeqRPx9kXs0HjU2xuXPT1cdF+vvA200D9uAX/KLcC34MwRqUKTYml4kCc2Vf/P2pBR9cQuBm3zECQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.117.0': + resolution: {integrity: sha512-V7YzavQnYcRJBeJkp0qpb3FKrlm5I57XJetCYB4jsjStuboQmnFMZ/XQH55Szlf/kVyeU9ddQwv72gJJ5BrGjQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxfmt/binding-android-arm-eabi@0.41.0': + resolution: {integrity: sha512-REfrqeMKGkfMP+m/ScX4f5jJBSmVNYcpoDF8vP8f8eYPDuPGZmzp56NIUsYmx3h7f6NzC6cE3gqh8GDWrJHCKw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxfmt/binding-android-arm64@0.41.0': + resolution: {integrity: sha512-s0b1dxNgb2KomspFV2LfogC2XtSJB42POXF4bMCLJyvQmAGos4ZtjGPfQreToQEaY0FQFjz3030ggI36rF1q5g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxfmt/binding-darwin-arm64@0.41.0': + resolution: {integrity: sha512-EGXGualADbv/ZmamE7/2DbsrYmjoPlAmHEpTL4vapLF4EfVD6fr8/uQDFnPJkUBjiSWFJZtFNsGeN1B6V3owmA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxfmt/binding-darwin-x64@0.41.0': + resolution: {integrity: sha512-WxySJEvdQQYMmyvISH3qDpTvoS0ebnIP63IMxLLWowJyPp/AAH0hdWtlo+iGNK5y3eVfa5jZguwNaQkDKWpGSw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxfmt/binding-freebsd-x64@0.41.0': + resolution: {integrity: sha512-Y2kzMkv3U3oyuYaR4wTfGjOTYTXiFC/hXmG0yVASKkbh02BJkvD98Ij8bIevr45hNZ0DmZEgqiXF+9buD4yMYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxfmt/binding-linux-arm-gnueabihf@0.41.0': + resolution: {integrity: sha512-ptazDjdUyhket01IjPTT6ULS1KFuBfTUU97osTP96X5y/0oso+AgAaJzuH81oP0+XXyrWIHbRzozSAuQm4p48g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm-musleabihf@0.41.0': + resolution: {integrity: sha512-UkoL2OKxFD+56bPEBcdGn+4juTW4HRv/T6w1dIDLnvKKWr6DbarB/mtHXlADKlFiJubJz8pRkttOR7qjYR6lTA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxfmt/binding-linux-arm64-gnu@0.41.0': + resolution: {integrity: sha512-gofu0PuumSOHYczD8p62CPY4UF6ee+rSLZJdUXkpwxg6pILiwSDBIouPskjF/5nF3A7QZTz2O9KFNkNxxFN9tA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-arm64-musl@0.41.0': + resolution: {integrity: sha512-VfVZxL0+6RU86T8F8vKiDBa+iHsr8PAjQmKGBzSCAX70b6x+UOMFl+2dNihmKmUwqkCazCPfYjt6SuAPOeQJ3g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-ppc64-gnu@0.41.0': + resolution: {integrity: sha512-bwzokz2eGvdfJbc0i+zXMJ4BBjQPqg13jyWpEEZDOrBCQ91r8KeY2Mi2kUeuMTZNFXju+jcAbAbpyJxRGla0eg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-gnu@0.41.0': + resolution: {integrity: sha512-POLM//PCH9uqDeNDwWL3b3DkMmI3oI2cU6hwc2lnztD1o7dzrQs3R9nq555BZ6wI7t2lyhT9CS+CRaz5X0XqLA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-riscv64-musl@0.41.0': + resolution: {integrity: sha512-NNK7PzhFqLUwx/G12Xtm6scGv7UITvyGdAR5Y+TlqsG+essnuRWR4jRNODWRjzLZod0T3SayRbnkSIWMBov33w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-linux-s390x-gnu@0.41.0': + resolution: {integrity: sha512-qVf/zDC5cN9eKe4qI/O/m445er1IRl6swsSl7jHkqmOSVfknwCe5JXitYjZca+V/cNJSU/xPlC5EFMabMMFDpw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-gnu@0.41.0': + resolution: {integrity: sha512-ojxYWu7vUb6ysYqVCPHuAPVZHAI40gfZ0PDtZAMwVmh2f0V8ExpPIKoAKr7/8sNbAXJBBpZhs2coypIo2jJX4w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxfmt/binding-linux-x64-musl@0.41.0': + resolution: {integrity: sha512-O2exZLBxoCMIv2vlvcbkdedazJPTdG0VSup+0QUCfYQtx751zCZNboX2ZUOiQ/gDTdhtXvSiot0h6GEGkOyalA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@oxfmt/binding-openharmony-arm64@0.41.0': + resolution: {integrity: sha512-N+31/VoL+z+NNBt8viy3I4NaIdPbiYeOnB884LKqvXldaE2dRztdPv3q5ipfZYv0RwFp7JfqS4I27K/DSHCakg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@oxfmt/binding-win32-arm64-msvc@0.41.0': + resolution: {integrity: sha512-Z7NAtu/RN8kjCQ1y5oDD0nTAeRswh3GJ93qwcW51srmidP7XPBmZbLlwERu1W5veCevQJtPS9xmkpcDTYsGIwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxfmt/binding-win32-ia32-msvc@0.41.0': + resolution: {integrity: sha512-uNxxP3l4bJ6VyzIeRqCmBU2Q0SkCFgIhvx9/9dJ9V8t/v+jP1IBsuaLwCXGR8JPHtkj4tFp+RHtUmU2ZYAUpMA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@oxfmt/binding-win32-x64-msvc@0.41.0': + resolution: {integrity: sha512-49ZSpbZ1noozyPapE8SUOSm3IN0Ze4b5nkO+4+7fq6oEYQQJFhE0saj5k/Gg4oewVPdjn0L3ZFeWk2Vehjcw7A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxlint/binding-android-arm-eabi@1.56.0': + resolution: {integrity: sha512-IyfYPthZyiSKwAv/dLjeO18SaK8MxLI9Yss2JrRDyweQAkuL3LhEy7pwIwI7uA3KQc1Vdn20kdmj3q0oUIQL6A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [android] + + '@oxlint/binding-android-arm64@1.56.0': + resolution: {integrity: sha512-Ga5zYrzH6vc/VFxhn6MmyUnYEfy9vRpwTIks99mY3j6Nz30yYpIkWryI0QKPCgvGUtDSXVLEaMum5nA+WrNOSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxlint/binding-darwin-arm64@1.56.0': + resolution: {integrity: sha512-ogmbdJysnw/D4bDcpf1sPLpFThZ48lYp4aKYm10Z/6Nh1SON6NtnNhTNOlhEY296tDFItsZUz+2tgcSYqh8Eyw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxlint/binding-darwin-x64@1.56.0': + resolution: {integrity: sha512-x8QE1h+RAtQ2g+3KPsP6Fk/tdz6zJQUv5c7fTrJxXV3GHOo+Ry5p/PsogU4U+iUZg0rj6hS+E4xi+mnwwlDCWQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxlint/binding-freebsd-x64@1.56.0': + resolution: {integrity: sha512-6G+WMZvwJpMvY7my+/SHEjb7BTk/PFbePqLpmVmUJRIsJMy/UlyYqjpuh0RCgYYkPLcnXm1rUM04kbTk8yS1Yg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxlint/binding-linux-arm-gnueabihf@1.56.0': + resolution: {integrity: sha512-YYHBsk/sl7fYwQOok+6W5lBPeUEvisznV/HZD2IfZmF3Bns6cPC3Z0vCtSEOaAWTjYWN3jVsdu55jMxKlsdlhg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm-musleabihf@1.56.0': + resolution: {integrity: sha512-+AZK8rOUr78y8WT6XkDb04IbMRqauNV+vgT6f8ZLOH8wnpQ9i7Nol0XLxAu+Cq7Sb+J9wC0j6Km5hG8rj47/yQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxlint/binding-linux-arm64-gnu@1.56.0': + resolution: {integrity: sha512-urse2SnugwJRojUkGSSeH2LPMaje5Q50yQtvtL9HFckiyeqXzoFwOAZqD5TR29R2lq7UHidfFDM9EGcchcbb8A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-arm64-musl@1.56.0': + resolution: {integrity: sha512-rkTZkBfJ4TYLjansjSzL6mgZOdN5IvUnSq3oNJSLwBcNvy3dlgQtpHPrRxrCEbbcp7oQ6If0tkNaqfOsphYZ9g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-ppc64-gnu@1.56.0': + resolution: {integrity: sha512-uqL1kMH3u69/e1CH2EJhP3CP28jw2ExLsku4o8RVAZ7fySo9zOyI2fy9pVlTAp4voBLVgzndXi3SgtdyCTa2aA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-gnu@1.56.0': + resolution: {integrity: sha512-j0CcMBOgV6KsRaBdsebIeiy7hCjEvq2KdEsiULf2LZqAq0v1M1lWjelhCV57LxsqaIGChXFuFJ0RiFrSRHPhSg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-riscv64-musl@1.56.0': + resolution: {integrity: sha512-7VDOiL8cDG3DQ/CY3yKjbV1c4YPvc4vH8qW09Vv+5ukq3l/Kcyr6XGCd5NvxUmxqDb2vjMpM+eW/4JrEEsUetA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + libc: [musl] + + '@oxlint/binding-linux-s390x-gnu@1.56.0': + resolution: {integrity: sha512-JGRpX0M+ikD3WpwJ7vKcHKV6Kg0dT52BW2Eu2BupXotYeqGXBrbY+QPkAyKO6MNgKozyTNaRh3r7g+VWgyAQYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-gnu@1.56.0': + resolution: {integrity: sha512-dNaICPvtmuxFP/VbqdofrLqdS3bM/AKJN3LMJD52si44ea7Be1cBk6NpfIahaysG9Uo+L98QKddU9CD5L8UHnQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@oxlint/binding-linux-x64-musl@1.56.0': + resolution: {integrity: sha512-pF1vOtM+GuXmbklM1hV8WMsn6tCNPvkUzklj/Ej98JhlanbmA2RB1BILgOpwSuCTRTIYx2MXssmEyQQ90QF5aA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] - '@oxc-transform/binding-win32-arm64-msvc@0.117.0': - resolution: {integrity: sha512-15cbsF8diXWGnHrTsVgVeabETiT/KdMAfRAcot99xsaVecJs3pITNNjC6Qj+/TPNpehbgIFjlhhxOVSbQsTBgg==} + '@oxlint/binding-openharmony-arm64@1.56.0': + resolution: {integrity: sha512-bp8NQ4RE6fDIFLa4bdBiOA+TAvkNkg+rslR+AvvjlLTYXLy9/uKAYLQudaQouWihLD/hgkrXIKKzXi5IXOewwg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] - os: [win32] + os: [openharmony] - '@oxc-transform/binding-win32-arm64-msvc@0.95.0': - resolution: {integrity: sha512-6eaxlgj+J5n8zgJTSugqdPLBtKGRqvxYLcvHN8b+U9hVhF/2HG/JCOrcSYV/XgWGNPQiaRVzpR3hGhmFro9QTw==} + '@oxlint/binding-win32-arm64-msvc@1.56.0': + resolution: {integrity: sha512-PxT4OJDfMOQBzo3OlzFb9gkoSD+n8qSBxyVq2wQSZIHFQYGEqIRTo9M0ZStvZm5fdhMqaVYpOnJvH2hUMEDk/g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxc-transform/binding-win32-ia32-msvc@0.117.0': - resolution: {integrity: sha512-I6DkhCuFX6p9rckdWiLuZfBWrrYUC7sNX+zLaCfa5zvrPNwo1/29KkefvqXVxu3AWT/6oZAbtc0A8/mqhETJPQ==} + '@oxlint/binding-win32-ia32-msvc@1.56.0': + resolution: {integrity: sha512-PTRy6sIEPqy2x8PTP1baBNReN/BNEFmde0L+mYeHmjXE1Vlcc9+I5nsqENsB2yAm5wLkzPoTNCMY/7AnabT4/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxc-transform/binding-win32-x64-msvc@0.117.0': - resolution: {integrity: sha512-V7YzavQnYcRJBeJkp0qpb3FKrlm5I57XJetCYB4jsjStuboQmnFMZ/XQH55Szlf/kVyeU9ddQwv72gJJ5BrGjQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - - '@oxc-transform/binding-win32-x64-msvc@0.95.0': - resolution: {integrity: sha512-Y8JY79A7fTuBjEXZFu+mHbHzgsV3uJDUuUKeGffpOwI1ayOGCKeBJTiMhksYkiir1xS+DkGLEz73+xse9Is9rw==} + '@oxlint/binding-win32-x64-msvc@1.56.0': + resolution: {integrity: sha512-ZHa0clocjLmIDr+1LwoWtxRcoYniAvERotvwKUYKhH41NVfl0Y4LNbyQkwMZzwDvKklKGvGZ5+DAG58/Ik47tQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -1718,8 +2024,8 @@ packages: '@poppinss/exception@1.2.3': resolution: {integrity: sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==} - '@rolldown/pluginutils@1.0.0-rc.10': - resolution: {integrity: sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==} + '@rolldown/pluginutils@1.0.0-rc.11': + resolution: {integrity: sha512-xQO9vbwBecJRv9EUcQ/y0dzSTJgA7Q6UVN7xp6B81+tBGSLVAK03yJ9NkJaUA7JFD91kbjxRSC/mDnmvXzbHoQ==} '@rolldown/pluginutils@1.0.0-rc.2': resolution: {integrity: sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==} @@ -1975,34 +2281,34 @@ packages: '@types/web-bluetooth@0.0.21': resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} - '@typescript-eslint/project-service@8.57.1': - resolution: {integrity: sha512-vx1F37BRO1OftsYlmG9xay1TqnjNVlqALymwWVuYTdo18XuKxtBpCj1QlzNIEHlvlB27osvXFWptYiEWsVdYsg==} + '@typescript-eslint/project-service@8.57.2': + resolution: {integrity: sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.57.1': - resolution: {integrity: sha512-hs/QcpCwlwT2L5S+3fT6gp0PabyGk4Q0Rv2doJXA0435/OpnSR3VRgvrp8Xdoc3UAYSg9cyUjTeFXZEPg/3OKg==} + '@typescript-eslint/scope-manager@8.57.2': + resolution: {integrity: sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.57.1': - resolution: {integrity: sha512-0lgOZB8cl19fHO4eI46YUx2EceQqhgkPSuCGLlGi79L2jwYY1cxeYc1Nae8Aw1xjgW3PKVDLlr3YJ6Bxx8HkWg==} + '@typescript-eslint/tsconfig-utils@8.57.2': + resolution: {integrity: sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.57.1': - resolution: {integrity: sha512-S29BOBPJSFUiblEl6RzPPjJt6w25A6XsBqRVDt53tA/tlL8q7ceQNZHTjPeONt/3S7KRI4quk+yP9jK2WjBiPQ==} + '@typescript-eslint/types@8.57.2': + resolution: {integrity: sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.57.1': - resolution: {integrity: sha512-ybe2hS9G6pXpqGtPli9Gx9quNV0TWLOmh58ADlmZe9DguLq0tiAKVjirSbtM1szG6+QH6rVXyU6GTLQbWnMY+g==} + '@typescript-eslint/typescript-estree@8.57.2': + resolution: {integrity: sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.57.1': - resolution: {integrity: sha512-YWnmJkXbofiz9KbnbbwuA2rpGkFPLbAIetcCNO6mJ8gdhdZ/v7WDXsoGFAJuM6ikUFKTlSQnjWnVO4ux+UzS6A==} + '@typescript-eslint/visitor-keys@8.57.2': + resolution: {integrity: sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@unhead/vue@2.1.12': @@ -2029,12 +2335,6 @@ packages: vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 vue: ^3.2.25 - '@volar/language-core@2.4.28': - resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==} - - '@volar/source-map@2.4.28': - resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==} - '@vue-macros/common@3.1.2': resolution: {integrity: sha512-h9t4ArDdniO9ekYHAD95t9AZcAbb19lEGK+26iAjUODOIJKmObDNBSe4+6ELQAA3vtYiFPPBtHh7+cQCKi3Dng==} engines: {node: '>=20.19.0'} @@ -2075,22 +2375,19 @@ packages: '@vue/devtools-api@6.6.4': resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} - '@vue/devtools-api@8.1.0': - resolution: {integrity: sha512-O44X57jjkLKbLEc4OgL/6fEPOOanRJU8kYpCE8qfKlV96RQZcdzrcLI5mxMuVRUeXhHKIHGhCpHacyCk0HyO4w==} + '@vue/devtools-api@8.1.1': + resolution: {integrity: sha512-bsDMJ07b3GN1puVwJb/fyFnj/U2imyswK5UQVLZwVl7O05jDrt6BHxeG5XffmOOdasOj/bOmIjxJvGPxU7pcqw==} - '@vue/devtools-core@8.1.0': - resolution: {integrity: sha512-LvD1VgDpoHmYL00IgKRLKktF6SsPAb0yaV8wB8q2jRwsAWvqhS8+vsMLEGKNs7uoKyymXhT92dhxgf/wir6YGQ==} + '@vue/devtools-core@8.1.1': + resolution: {integrity: sha512-bCCsSABp1/ot4j8xJEycM6Mtt2wbuucfByr6hMgjbYhrtlscOJypZKvy8f1FyWLYrLTchB5Qz216Lm92wfbq0A==} peerDependencies: vue: ^3.0.0 - '@vue/devtools-kit@8.1.0': - resolution: {integrity: sha512-/NZlS4WtGIB54DA/z10gzk+n/V7zaqSzYZOVlg2CfdnpIKdB61bd7JDIMxf/zrtX41zod8E2/bbEBoW/d7x70Q==} - - '@vue/devtools-shared@8.1.0': - resolution: {integrity: sha512-h8uCb4Qs8UT8VdTT5yjY6tOJ//qH7EpxToixR0xqejR55t5OdISIg7AJ7eBkhBs8iu1qG5gY3QQNN1DF1EelAA==} + '@vue/devtools-kit@8.1.1': + resolution: {integrity: sha512-gVBaBv++i+adg4JpH71k9ppl4soyR7Y2McEqO5YNgv0BI1kMZ7BDX5gnwkZ5COYgiCyhejZG+yGNrBAjj6Coqg==} - '@vue/language-core@3.2.6': - resolution: {integrity: sha512-xYYYX3/aVup576tP/23sEUpgiEnujrENaoNRbaozC1/MA9I6EGFQRJb4xrt/MmUCAGlxTKL2RmT8JLTPqagCkg==} + '@vue/devtools-shared@8.1.1': + resolution: {integrity: sha512-+h4ttmJYl/txpxHKaoZcaKpC+pvckgLzIDiSQlaQ7kKthKh8KuwoLW2D8hPJEnqKzXOvu15UHEoGyngAXCz0EQ==} '@vue/reactivity@3.5.30': resolution: {integrity: sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==} @@ -2182,9 +2479,6 @@ packages: ajv@6.14.0: resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} - alien-signals@3.1.2: - resolution: {integrity: sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==} - ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2724,8 +3018,8 @@ packages: didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - diff@8.0.3: - resolution: {integrity: sha512-qejHi7bcSD4hQAZE0tNAawRK1ZtafHDmMTMkrrIGgSLl7hTnQHmKCeB45xAcbfTqK2zowkM3j3bHt/4b/ARbYQ==} + diff@8.0.4: + resolution: {integrity: sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw==} engines: {node: '>=0.3.1'} dlv@1.1.3: @@ -2876,8 +3170,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@9.17.0: - resolution: {integrity: sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==} + eslint@9.39.4: + resolution: {integrity: sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -3016,20 +3310,6 @@ packages: fraction.js@5.3.4: resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==} - framer-motion@12.38.0: - resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} - peerDependencies: - '@emotion/is-prop-valid': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - '@emotion/is-prop-valid': - optional: true - react: - optional: true - react-dom: - optional: true - fresh@0.5.2: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} @@ -3165,9 +3445,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - hey-listen@1.0.8: - resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} - hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -3601,18 +3878,6 @@ packages: mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} - motion-dom@12.38.0: - resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} - - motion-utils@12.36.0: - resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} - - motion-v@2.2.0: - resolution: {integrity: sha512-8rrUBt9UMwy45MfLMwHer9J7xBY/rL31S+0U3ZUAouqjH3AOVHvS0NGuXwF4mfWfvb22rfZEv59ZsBc2f1epxQ==} - peerDependencies: - '@vueuse/core': '>=10.0.0' - vue: '>=3.0.0' - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -3805,32 +4070,42 @@ packages: resolution: {integrity: sha512-JHsv/b+bmBJkAzkHXgTN7RThloVxLHPT0ojHfjqxVeHuQB7LPpLUbJ2qfwz37sto9stZ9+AVwUP4b3gtR7p/Tw==} engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.112.0: + resolution: {integrity: sha512-7rQ3QdJwobMQLMZwQaPuPYMEF2fDRZwf51lZ//V+bA37nejjKW5ifMHbbCwvA889Y4RLhT+/wLJpPRhAoBaZYw==} + engines: {node: ^20.19.0 || >=22.12.0} + oxc-parser@0.117.0: resolution: {integrity: sha512-l3cbgK5wUvWDVNWM/JFU77qDdGZK1wudnLsFcrRyNo/bL1CyU8pC25vDhMHikVY29lbK2InTWsX42RxVSutUdQ==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-parser@0.95.0: - resolution: {integrity: sha512-Te8fE/SmiiKWIrwBwxz5Dod87uYvsbcZ9JAL5ylPg1DevyKgTkxCXnPEaewk1Su2qpfNmry5RHoN+NywWFCG+A==} + oxc-transform@0.112.0: + resolution: {integrity: sha512-cIRRvZgrHfsAHrkt8LWdAX4+Do8R0MzQSfeo9yzErzHeYiuyNiP4PCTPbOy/wBXL4MYzt3ebrBa5jt3akQkKAg==} engines: {node: ^20.19.0 || >=22.12.0} oxc-transform@0.117.0: resolution: {integrity: sha512-u1Stl2uhDh9bFuOGjGXQIqx46IRUNMyHQkq59LayXNGS2flNv7RpZpRSWs5S5deuNP6jJZ12gtMBze+m4dOhmw==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-transform@0.95.0: - resolution: {integrity: sha512-SmS5aThb5K0SoUZgzGbikNBjrGHfOY4X5TEqBlaZb1uy5YgXbUSbpakpZJ13yW36LNqy8Im5+y+sIk5dlzpZ/w==} - engines: {node: ^20.19.0 || >=22.12.0} - - oxc-walker@0.5.2: - resolution: {integrity: sha512-XYoZqWwApSKUmSDEFeOKdy3Cdh95cOcSU8f7yskFWE4Rl3cfL5uwyY+EV7Brk9mdNLy+t5SseJajd6g7KncvlA==} - peerDependencies: - oxc-parser: '>=0.72.0' - oxc-walker@0.7.0: resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} peerDependencies: oxc-parser: '>=0.98.0' + oxfmt@0.41.0: + resolution: {integrity: sha512-sKLdJZdQ3bw6x9qKiT7+eID4MNEXlDHf5ZacfIircrq6Qwjk0L6t2/JQlZZrVHTXJawK3KaMuBoJnEJPcqCEdg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + oxlint@1.56.0: + resolution: {integrity: sha512-Q+5Mj5PVaH/R6/fhMMFzw4dT+KPB+kQW4kaL8FOIq7tfhlnEVp6+3lcWqFruuTNlUo9srZUW3qH7Id4pskeR6g==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + oxlint-tsgolint: '>=0.15.0' + peerDependenciesMeta: + oxlint-tsgolint: + optional: true + p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} @@ -3873,9 +4148,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3922,12 +4194,12 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + picomatch@2.3.2: + resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} pify@2.3.0: @@ -4175,66 +4447,6 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-tailwindcss@0.7.2: - resolution: {integrity: sha512-LkphyK3Fw+q2HdMOoiEHWf93fNtYJwfamoKPl7UwtjFQdei/iIBoX11G6j706FzN3ymX9mPVi97qIY8328vdnA==} - engines: {node: '>=20.19'} - peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-hermes': '*' - '@prettier/plugin-oxc': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig': '*' - prettier: ^3.0 - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-marko: '*' - prettier-plugin-multiline-arrays: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-sort-imports: '*' - prettier-plugin-svelte: '*' - peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': - optional: true - '@prettier/plugin-hermes': - optional: true - '@prettier/plugin-oxc': - optional: true - '@prettier/plugin-pug': - optional: true - '@shopify/prettier-plugin-liquid': - optional: true - '@trivago/prettier-plugin-sort-imports': - optional: true - '@zackad/prettier-plugin-twig': - optional: true - prettier-plugin-astro: - optional: true - prettier-plugin-css-order: - optional: true - prettier-plugin-jsdoc: - optional: true - prettier-plugin-marko: - optional: true - prettier-plugin-multiline-arrays: - optional: true - prettier-plugin-organize-attributes: - optional: true - prettier-plugin-organize-imports: - optional: true - prettier-plugin-sort-imports: - optional: true - prettier-plugin-svelte: - optional: true - - prettier@3.8.1: - resolution: {integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==} - engines: {node: '>=14'} - hasBin: true - pretty-bytes@7.1.0: resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} engines: {node: '>=20'} @@ -4496,8 +4708,8 @@ packages: resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==} engines: {node: '>= 12'} - srvx@0.11.12: - resolution: {integrity: sha512-AQfrGqntqVPXgP03pvBDN1KyevHC+KmYVqb8vVf4N+aomQqdhaZxjvoVp+AOm4u6x+GgNQY3MVzAUIn+TqwkOA==} + srvx@0.11.13: + resolution: {integrity: sha512-oknN6qduuMPafxKtHucUeG32Q963pjriA5g3/Bl05cwEsUe5VVbIU4qR9LrALHbipSCyBe+VmfDGGydqazDRkw==} engines: {node: '>=20.16.0'} hasBin: true @@ -4612,8 +4824,8 @@ packages: tar-stream@3.1.8: resolution: {integrity: sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==} - tar@7.5.12: - resolution: {integrity: sha512-9TsuLcdhOn4XztcQqhNyq1KOwOOED/3k58JAvtULiYqbO8B/0IBAAIE1hj0Svmm58k27TmcigyDI0deMlgG3uw==} + tar@7.5.13: + resolution: {integrity: sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==} engines: {node: '>=18'} teex@1.0.1: @@ -4649,6 +4861,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinypool@2.1.0: + resolution: {integrity: sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==} + engines: {node: ^20.0.0 || >=22.0.0} + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -4761,16 +4977,6 @@ packages: resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==} engines: {node: '>=20.19.0'} - unplugin-vue-router@0.16.2: - resolution: {integrity: sha512-lE6ZjnHaXfS2vFI/PSEwdKcdOo5RwAbCKUnPBIN9YwLgSWas3x+qivzQvJa/uxhKzJldE6WK43aDKjGj9Rij9w==} - deprecated: 'Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html' - peerDependencies: - '@vue/compiler-sfc': ^3.5.17 - vue-router: ^4.6.0 - peerDependenciesMeta: - vue-router: - optional: true - unplugin@2.3.11: resolution: {integrity: sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==} engines: {node: '>=18.12.0'} @@ -5010,11 +5216,6 @@ packages: peerDependencies: vue: ^3.0.0 - vue-router@4.6.4: - resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} - peerDependencies: - vue: ^3.5.0 - vue-router@5.0.4: resolution: {integrity: sha512-lCqDLCI2+fKVRl2OzXuzdSWmxXFLQRxQbmHugnRpTMyYiT+hNaycV0faqG5FBHDXoYrZ6MQcX87BvbY8mQ20Bg==} peerDependencies: @@ -5638,14 +5839,14 @@ snapshots: '@esbuild/win32-x64@0.27.4': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@9.17.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.4(jiti@2.6.1))': dependencies: - eslint: 9.17.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} - '@eslint/config-array@0.19.2': + '@eslint/config-array@0.21.2': dependencies: '@eslint/object-schema': 2.1.7 debug: 4.4.3 @@ -5653,11 +5854,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.13.0': + '@eslint/config-helpers@0.4.2': dependencies: - '@types/json-schema': 7.0.15 + '@eslint/core': 0.17.0 - '@eslint/core@0.9.1': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -5675,13 +5876,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.17.0': {} + '@eslint/js@9.39.4': {} '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.2.8': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.13.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@fastify/busboy@3.2.0': @@ -5761,15 +5962,15 @@ snapshots: '@intlify/shared@11.3.0': {} - '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.30)(eslint@9.17.0(jiti@2.6.1))(rollup@4.60.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': + '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.30)(eslint@9.39.4(jiti@2.6.1))(rollup@4.60.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.17.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@intlify/bundle-utils': 11.0.7(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3))) '@intlify/shared': 11.3.0 '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) '@rollup/pluginutils': 5.3.0(rollup@4.60.0) - '@typescript-eslint/scope-manager': 8.57.1 - '@typescript-eslint/typescript-estree': 8.57.1(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.57.2 + '@typescript-eslint/typescript-estree': 8.57.2(typescript@5.9.3) debug: 4.4.3 fast-glob: 3.3.3 pathe: 2.0.3 @@ -5787,6 +5988,8 @@ snapshots: '@intlify/utils@0.13.0': {} + '@intlify/utils@0.14.1': {} + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': dependencies: '@babel/parser': 7.29.2 @@ -5861,7 +6064,7 @@ snapshots: node-fetch: 2.7.0 nopt: 8.1.0 semver: 7.7.4 - tar: 7.5.12 + tar: 7.5.13 transitivePeerDependencies: - encoding - supports-color @@ -5942,7 +6145,7 @@ snapshots: pkg-types: 2.3.0 scule: 1.3.0 semver: 7.7.4 - srvx: 0.11.12 + srvx: 0.11.13 std-env: 3.10.0 tinyclip: 0.1.12 tinyexec: 1.0.4 @@ -5970,7 +6173,7 @@ snapshots: dependencies: '@clack/prompts': 1.1.0 consola: 3.4.2 - diff: 8.0.3 + diff: 8.0.4 execa: 8.0.1 magicast: 0.5.2 pathe: 2.0.3 @@ -5982,8 +6185,8 @@ snapshots: '@nuxt/devtools-kit': 3.2.4(magicast@0.5.2)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)) '@nuxt/devtools-wizard': 3.2.4 '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@vue/devtools-core': 8.1.0(vue@3.5.30(typescript@5.9.3)) - '@vue/devtools-kit': 8.1.0 + '@vue/devtools-core': 8.1.1(vue@3.5.30(typescript@5.9.3)) + '@vue/devtools-kit': 8.1.1 birpc: 4.0.0 consola: 3.4.2 destr: 2.0.5 @@ -6031,7 +6234,7 @@ snapshots: mlly: 1.8.2 ohash: 2.0.11 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 3.10.0 tinyglobby: 0.2.15 transitivePeerDependencies: @@ -6090,7 +6293,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(typescript@5.9.3)': + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(typescript@5.9.3)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 @@ -6109,7 +6312,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.2(@netlify/blobs@9.1.2) - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -6176,7 +6379,7 @@ snapshots: rc9: 3.0.0 std-env: 3.10.0 - '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.15.19)(eslint@9.17.0(jiti@2.6.1))(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))(yaml@2.8.3)': + '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.15.19)(eslint@9.39.4(jiti@2.6.1))(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))(yaml@2.8.3)': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-replace': 6.0.3(rollup@4.60.0) @@ -6194,7 +6397,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 mocked-exports: 0.1.1 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) nypm: 0.6.5 pathe: 2.0.3 pkg-types: 2.3.0 @@ -6205,7 +6408,7 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3) vite-node: 5.3.0(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3) - vite-plugin-checker: 0.12.0(eslint@9.17.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)) + vite-plugin-checker: 0.12.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)) vue: 3.5.30(typescript@5.9.3) vue-bundle-renderer: 2.2.0 optionalDependencies: @@ -6246,13 +6449,13 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxtjs/i18n@10.2.3(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(rollup@4.60.0)(vue@3.5.30(typescript@5.9.3))': + '@nuxtjs/i18n@10.2.4(@netlify/blobs@9.1.2)(@vue/compiler-dom@3.5.30)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(rollup@4.60.0)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))': dependencies: '@intlify/core': 11.3.0 '@intlify/h3': 0.7.4 '@intlify/shared': 11.3.0 - '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.30)(eslint@9.17.0(jiti@2.6.1))(rollup@4.60.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) - '@intlify/utils': 0.13.0 + '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.30)(eslint@9.39.4(jiti@2.6.1))(rollup@4.60.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + '@intlify/utils': 0.14.1 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.60.0) '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-yaml': 4.1.2(rollup@4.60.0) @@ -6265,17 +6468,16 @@ snapshots: mlly: 1.8.2 nuxt-define: 1.0.0 ohash: 2.0.11 - oxc-parser: 0.95.0 - oxc-transform: 0.95.0 - oxc-walker: 0.5.2(oxc-parser@0.95.0) + oxc-parser: 0.112.0 + oxc-transform: 0.112.0 + oxc-walker: 0.7.0(oxc-parser@0.112.0) pathe: 2.0.3 - typescript: 5.9.3 ufo: 1.6.3 unplugin: 2.3.11 - unplugin-vue-router: 0.16.2(@vue/compiler-sfc@3.5.30)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + unrouting: 0.1.7 unstorage: 1.17.4(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.10.1) vue-i18n: 11.3.0(vue@3.5.30(typescript@5.9.3)) - vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) + vue-router: 5.0.4(@vue/compiler-sfc@3.5.30)(vue@3.5.30(typescript@5.9.3)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -6286,6 +6488,7 @@ snapshots: - '@capacitor/preferences' - '@deno/kv' - '@netlify/blobs' + - '@pinia/colada' - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' @@ -6299,8 +6502,10 @@ snapshots: - ioredis - magicast - petite-vue-i18n + - pinia - rollup - supports-color + - typescript - uploadthing - vue @@ -6390,226 +6595,370 @@ snapshots: '@oxc-minify/binding-win32-x64-msvc@0.117.0': optional: true + '@oxc-parser/binding-android-arm-eabi@0.112.0': + optional: true + '@oxc-parser/binding-android-arm-eabi@0.117.0': optional: true + '@oxc-parser/binding-android-arm64@0.112.0': + optional: true + '@oxc-parser/binding-android-arm64@0.117.0': optional: true - '@oxc-parser/binding-android-arm64@0.95.0': + '@oxc-parser/binding-darwin-arm64@0.112.0': optional: true '@oxc-parser/binding-darwin-arm64@0.117.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.95.0': + '@oxc-parser/binding-darwin-x64@0.112.0': optional: true '@oxc-parser/binding-darwin-x64@0.117.0': optional: true - '@oxc-parser/binding-darwin-x64@0.95.0': + '@oxc-parser/binding-freebsd-x64@0.112.0': optional: true '@oxc-parser/binding-freebsd-x64@0.117.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.95.0': + '@oxc-parser/binding-linux-arm-gnueabihf@0.112.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.95.0': + '@oxc-parser/binding-linux-arm-musleabihf@0.112.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.117.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.95.0': + '@oxc-parser/binding-linux-arm64-gnu@0.112.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.95.0': + '@oxc-parser/binding-linux-arm64-musl@0.112.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.117.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.95.0': + '@oxc-parser/binding-linux-ppc64-gnu@0.112.0': optional: true '@oxc-parser/binding-linux-ppc64-gnu@0.117.0': optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.112.0': + optional: true + '@oxc-parser/binding-linux-riscv64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': + '@oxc-parser/binding-linux-riscv64-musl@0.112.0': optional: true '@oxc-parser/binding-linux-riscv64-musl@0.117.0': optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.112.0': + optional: true + '@oxc-parser/binding-linux-s390x-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.95.0': + '@oxc-parser/binding-linux-x64-gnu@0.112.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.95.0': + '@oxc-parser/binding-linux-x64-musl@0.112.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.117.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.95.0': + '@oxc-parser/binding-openharmony-arm64@0.112.0': optional: true '@oxc-parser/binding-openharmony-arm64@0.117.0': optional: true - '@oxc-parser/binding-wasm32-wasi@0.117.0': + '@oxc-parser/binding-wasm32-wasi@0.112.0': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxc-parser/binding-wasm32-wasi@0.95.0': + '@oxc-parser/binding-wasm32-wasi@0.117.0': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.112.0': + optional: true + '@oxc-parser/binding-win32-arm64-msvc@0.117.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.95.0': + '@oxc-parser/binding-win32-ia32-msvc@0.112.0': optional: true '@oxc-parser/binding-win32-ia32-msvc@0.117.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.117.0': + '@oxc-parser/binding-win32-x64-msvc@0.112.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.95.0': + '@oxc-parser/binding-win32-x64-msvc@0.117.0': optional: true + '@oxc-project/types@0.112.0': {} + '@oxc-project/types@0.117.0': {} - '@oxc-project/types@0.95.0': {} + '@oxc-transform/binding-android-arm-eabi@0.112.0': + optional: true '@oxc-transform/binding-android-arm-eabi@0.117.0': optional: true + '@oxc-transform/binding-android-arm64@0.112.0': + optional: true + '@oxc-transform/binding-android-arm64@0.117.0': optional: true - '@oxc-transform/binding-android-arm64@0.95.0': + '@oxc-transform/binding-darwin-arm64@0.112.0': optional: true '@oxc-transform/binding-darwin-arm64@0.117.0': optional: true - '@oxc-transform/binding-darwin-arm64@0.95.0': + '@oxc-transform/binding-darwin-x64@0.112.0': optional: true '@oxc-transform/binding-darwin-x64@0.117.0': optional: true - '@oxc-transform/binding-darwin-x64@0.95.0': + '@oxc-transform/binding-freebsd-x64@0.112.0': optional: true '@oxc-transform/binding-freebsd-x64@0.117.0': optional: true - '@oxc-transform/binding-freebsd-x64@0.95.0': + '@oxc-transform/binding-linux-arm-gnueabihf@0.112.0': optional: true '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0': optional: true - '@oxc-transform/binding-linux-arm-gnueabihf@0.95.0': + '@oxc-transform/binding-linux-arm-musleabihf@0.112.0': optional: true '@oxc-transform/binding-linux-arm-musleabihf@0.117.0': optional: true - '@oxc-transform/binding-linux-arm-musleabihf@0.95.0': + '@oxc-transform/binding-linux-arm64-gnu@0.112.0': optional: true '@oxc-transform/binding-linux-arm64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-arm64-gnu@0.95.0': + '@oxc-transform/binding-linux-arm64-musl@0.112.0': optional: true '@oxc-transform/binding-linux-arm64-musl@0.117.0': optional: true - '@oxc-transform/binding-linux-arm64-musl@0.95.0': + '@oxc-transform/binding-linux-ppc64-gnu@0.112.0': optional: true '@oxc-transform/binding-linux-ppc64-gnu@0.117.0': optional: true + '@oxc-transform/binding-linux-riscv64-gnu@0.112.0': + optional: true + '@oxc-transform/binding-linux-riscv64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': + '@oxc-transform/binding-linux-riscv64-musl@0.112.0': optional: true '@oxc-transform/binding-linux-riscv64-musl@0.117.0': optional: true + '@oxc-transform/binding-linux-s390x-gnu@0.112.0': + optional: true + '@oxc-transform/binding-linux-s390x-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-s390x-gnu@0.95.0': + '@oxc-transform/binding-linux-x64-gnu@0.112.0': optional: true '@oxc-transform/binding-linux-x64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-x64-gnu@0.95.0': + '@oxc-transform/binding-linux-x64-musl@0.112.0': optional: true '@oxc-transform/binding-linux-x64-musl@0.117.0': optional: true - '@oxc-transform/binding-linux-x64-musl@0.95.0': + '@oxc-transform/binding-openharmony-arm64@0.112.0': optional: true '@oxc-transform/binding-openharmony-arm64@0.117.0': optional: true - '@oxc-transform/binding-wasm32-wasi@0.117.0': + '@oxc-transform/binding-wasm32-wasi@0.112.0': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxc-transform/binding-wasm32-wasi@0.95.0': + '@oxc-transform/binding-wasm32-wasi@0.117.0': dependencies: '@napi-rs/wasm-runtime': 1.1.1 optional: true + '@oxc-transform/binding-win32-arm64-msvc@0.112.0': + optional: true + '@oxc-transform/binding-win32-arm64-msvc@0.117.0': optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.95.0': + '@oxc-transform/binding-win32-ia32-msvc@0.112.0': optional: true '@oxc-transform/binding-win32-ia32-msvc@0.117.0': optional: true + '@oxc-transform/binding-win32-x64-msvc@0.112.0': + optional: true + '@oxc-transform/binding-win32-x64-msvc@0.117.0': optional: true - '@oxc-transform/binding-win32-x64-msvc@0.95.0': + '@oxfmt/binding-android-arm-eabi@0.41.0': + optional: true + + '@oxfmt/binding-android-arm64@0.41.0': + optional: true + + '@oxfmt/binding-darwin-arm64@0.41.0': + optional: true + + '@oxfmt/binding-darwin-x64@0.41.0': + optional: true + + '@oxfmt/binding-freebsd-x64@0.41.0': + optional: true + + '@oxfmt/binding-linux-arm-gnueabihf@0.41.0': + optional: true + + '@oxfmt/binding-linux-arm-musleabihf@0.41.0': + optional: true + + '@oxfmt/binding-linux-arm64-gnu@0.41.0': + optional: true + + '@oxfmt/binding-linux-arm64-musl@0.41.0': + optional: true + + '@oxfmt/binding-linux-ppc64-gnu@0.41.0': + optional: true + + '@oxfmt/binding-linux-riscv64-gnu@0.41.0': + optional: true + + '@oxfmt/binding-linux-riscv64-musl@0.41.0': + optional: true + + '@oxfmt/binding-linux-s390x-gnu@0.41.0': + optional: true + + '@oxfmt/binding-linux-x64-gnu@0.41.0': + optional: true + + '@oxfmt/binding-linux-x64-musl@0.41.0': + optional: true + + '@oxfmt/binding-openharmony-arm64@0.41.0': + optional: true + + '@oxfmt/binding-win32-arm64-msvc@0.41.0': + optional: true + + '@oxfmt/binding-win32-ia32-msvc@0.41.0': + optional: true + + '@oxfmt/binding-win32-x64-msvc@0.41.0': + optional: true + + '@oxlint/binding-android-arm-eabi@1.56.0': + optional: true + + '@oxlint/binding-android-arm64@1.56.0': + optional: true + + '@oxlint/binding-darwin-arm64@1.56.0': + optional: true + + '@oxlint/binding-darwin-x64@1.56.0': + optional: true + + '@oxlint/binding-freebsd-x64@1.56.0': + optional: true + + '@oxlint/binding-linux-arm-gnueabihf@1.56.0': + optional: true + + '@oxlint/binding-linux-arm-musleabihf@1.56.0': + optional: true + + '@oxlint/binding-linux-arm64-gnu@1.56.0': + optional: true + + '@oxlint/binding-linux-arm64-musl@1.56.0': + optional: true + + '@oxlint/binding-linux-ppc64-gnu@1.56.0': + optional: true + + '@oxlint/binding-linux-riscv64-gnu@1.56.0': + optional: true + + '@oxlint/binding-linux-riscv64-musl@1.56.0': + optional: true + + '@oxlint/binding-linux-s390x-gnu@1.56.0': + optional: true + + '@oxlint/binding-linux-x64-gnu@1.56.0': + optional: true + + '@oxlint/binding-linux-x64-musl@1.56.0': + optional: true + + '@oxlint/binding-openharmony-arm64@1.56.0': + optional: true + + '@oxlint/binding-win32-arm64-msvc@1.56.0': + optional: true + + '@oxlint/binding-win32-ia32-msvc@1.56.0': + optional: true + + '@oxlint/binding-win32-x64-msvc@1.56.0': optional: true '@parcel/watcher-android-arm64@2.5.6': @@ -6645,7 +6994,7 @@ snapshots: '@parcel/watcher-wasm@2.5.6': dependencies: is-glob: 4.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 '@parcel/watcher-win32-arm64@2.5.6': optional: true @@ -6661,7 +7010,7 @@ snapshots: detect-libc: 2.1.2 is-glob: 4.0.3 node-addon-api: 7.1.1 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: '@parcel/watcher-android-arm64': 2.5.6 '@parcel/watcher-darwin-arm64': 2.5.6 @@ -6694,7 +7043,7 @@ snapshots: '@poppinss/exception@1.2.3': {} - '@rolldown/pluginutils@1.0.0-rc.10': {} + '@rolldown/pluginutils@1.0.0-rc.11': {} '@rolldown/pluginutils@1.0.0-rc.2': {} @@ -6707,10 +7056,10 @@ snapshots: '@rollup/pluginutils': 5.3.0(rollup@4.60.0) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.5.0(picomatch@4.0.3) + fdir: 6.5.0(picomatch@4.0.4) is-reference: 1.2.1 magic-string: 0.30.21 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: rollup: 4.60.0 @@ -6765,7 +7114,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 - picomatch: 4.0.3 + picomatch: 4.0.4 optionalDependencies: rollup: 4.60.0 @@ -6872,32 +7221,32 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/project-service@8.57.1(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.57.1': + '@typescript-eslint/scope-manager@8.57.2': dependencies: - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 - '@typescript-eslint/tsconfig-utils@8.57.1(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.2(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/types@8.57.1': {} + '@typescript-eslint/types@8.57.2': {} - '@typescript-eslint/typescript-estree@8.57.1(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.2(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.57.1(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.1(typescript@5.9.3) - '@typescript-eslint/types': 8.57.1 - '@typescript-eslint/visitor-keys': 8.57.1 + '@typescript-eslint/project-service': 8.57.2(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.2(typescript@5.9.3) + '@typescript-eslint/types': 8.57.2 + '@typescript-eslint/visitor-keys': 8.57.2 debug: 4.4.3 minimatch: 10.2.4 semver: 7.7.4 @@ -6907,9 +7256,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.57.1': + '@typescript-eslint/visitor-keys@8.57.2': dependencies: - '@typescript-eslint/types': 8.57.1 + '@typescript-eslint/types': 8.57.2 eslint-visitor-keys: 5.0.1 '@unhead/vue@2.1.12(vue@3.5.30(typescript@5.9.3))': @@ -6930,7 +7279,7 @@ snapshots: glob: 13.0.6 graceful-fs: 4.2.11 node-gyp-build: 4.8.4 - picomatch: 4.0.3 + picomatch: 4.0.4 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -6942,7 +7291,7 @@ snapshots: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@babel/plugin-transform-typescript': 7.28.6(@babel/core@7.29.0) - '@rolldown/pluginutils': 1.0.0-rc.10 + '@rolldown/pluginutils': 1.0.0-rc.11 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) vite: 7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3) vue: 3.5.30(typescript@5.9.3) @@ -6955,12 +7304,6 @@ snapshots: vite: 7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3) vue: 3.5.30(typescript@5.9.3) - '@volar/language-core@2.4.28': - dependencies: - '@volar/source-map': 2.4.28 - - '@volar/source-map@2.4.28': {} - '@vue-macros/common@3.1.2(vue@3.5.30(typescript@5.9.3))': dependencies: '@vue/compiler-sfc': 3.5.30 @@ -7032,34 +7375,24 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-api@8.1.0': + '@vue/devtools-api@8.1.1': dependencies: - '@vue/devtools-kit': 8.1.0 + '@vue/devtools-kit': 8.1.1 - '@vue/devtools-core@8.1.0(vue@3.5.30(typescript@5.9.3))': + '@vue/devtools-core@8.1.1(vue@3.5.30(typescript@5.9.3))': dependencies: - '@vue/devtools-kit': 8.1.0 - '@vue/devtools-shared': 8.1.0 + '@vue/devtools-kit': 8.1.1 + '@vue/devtools-shared': 8.1.1 vue: 3.5.30(typescript@5.9.3) - '@vue/devtools-kit@8.1.0': + '@vue/devtools-kit@8.1.1': dependencies: - '@vue/devtools-shared': 8.1.0 + '@vue/devtools-shared': 8.1.1 birpc: 2.9.0 hookable: 5.5.3 perfect-debounce: 2.1.0 - '@vue/devtools-shared@8.1.0': {} - - '@vue/language-core@3.2.6': - dependencies: - '@volar/language-core': 2.4.28 - '@vue/compiler-dom': 3.5.30 - '@vue/shared': 3.5.30 - alien-signals: 3.1.2 - muggle-string: 0.4.1 - path-browserify: 1.0.1 - picomatch: 4.0.3 + '@vue/devtools-shared@8.1.1': {} '@vue/reactivity@3.5.30': dependencies: @@ -7094,13 +7427,13 @@ snapshots: '@vueuse/metadata@14.2.1': {} - '@vueuse/nuxt@14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.30(typescript@5.9.3))': + '@vueuse/nuxt@14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(vue@3.5.30(typescript@5.9.3))': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) '@vueuse/metadata': 14.2.1 local-pkg: 1.1.2 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3) vue: 3.5.30(typescript@5.9.3) transitivePeerDependencies: - magicast @@ -7172,8 +7505,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - alien-signals@3.1.2: {} - ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -7191,7 +7522,7 @@ snapshots: anymatch@3.1.3: dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.2 archiver-utils@5.0.2: dependencies: @@ -7680,7 +8011,7 @@ snapshots: didyoumean@1.2.2: {} - diff@8.0.3: {} + diff@8.0.4: {} dlv@1.1.3: {} @@ -7876,20 +8207,20 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@9.17.0(jiti@2.6.1): + eslint@9.39.4(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@9.17.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.4(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 - '@eslint/config-array': 0.19.2 - '@eslint/core': 0.9.1 + '@eslint/config-array': 0.21.2 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.5 - '@eslint/js': 9.17.0 - '@eslint/plugin-kit': 0.2.8 + '@eslint/js': 9.39.4 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 ajv: 6.14.0 chalk: 4.1.2 cross-spawn: 7.0.6 @@ -7997,9 +8328,9 @@ snapshots: dependencies: reusify: 1.1.0 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 fetch-blob@3.2.0: dependencies: @@ -8048,12 +8379,6 @@ snapshots: fraction.js@5.3.4: {} - framer-motion@12.38.0: - dependencies: - motion-dom: 12.38.0 - motion-utils: 12.36.0 - tslib: 2.8.1 - fresh@0.5.2: {} fresh@2.0.0: {} @@ -8201,8 +8526,6 @@ snapshots: dependencies: function-bind: 1.1.2 - hey-listen@1.0.8: {} - hookable@5.5.3: {} hookable@6.1.0: {} @@ -8607,7 +8930,7 @@ snapshots: micromatch@4.0.8: dependencies: braces: 3.0.3 - picomatch: 2.3.1 + picomatch: 2.3.2 mime-db@1.52.0: {} @@ -8656,25 +8979,6 @@ snapshots: mocked-exports@0.1.1: {} - motion-dom@12.38.0: - dependencies: - motion-utils: 12.36.0 - - motion-utils@12.36.0: {} - - motion-v@2.2.0(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): - dependencies: - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - framer-motion: 12.38.0 - hey-listen: 1.0.8 - motion-dom: 12.38.0 - motion-utils: 12.36.0 - vue: 3.5.30(typescript@5.9.3) - transitivePeerDependencies: - - '@emotion/is-prop-valid' - - react - - react-dom - mrmime@2.0.1: {} ms@2.1.3: {} @@ -8865,16 +9169,16 @@ snapshots: transitivePeerDependencies: - magicast - nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3): + nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3): dependencies: '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@5.9.3) '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2) '@nuxt/devtools': 3.2.4(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(vue@3.5.30(typescript@5.9.3)) '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(typescript@5.9.3) + '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(@netlify/blobs@9.1.2)(db0@0.3.4)(ioredis@5.10.1)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(typescript@5.9.3) '@nuxt/schema': 4.4.2 '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2)) - '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.15.19)(eslint@9.17.0(jiti@2.6.1))(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.17.0(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(optionator@0.9.4)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))(yaml@2.8.3) + '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@22.15.19)(eslint@9.39.4(jiti@2.6.1))(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@netlify/blobs@9.1.2)(@parcel/watcher@2.5.6)(@types/node@22.15.19)(@vue/compiler-sfc@3.5.30)(cac@6.7.14)(db0@0.3.4)(eslint@9.39.4(jiti@2.6.1))(ioredis@5.10.1)(magicast@0.5.2)(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3))(yaml@2.8.3))(optionator@0.9.4)(oxlint@1.56.0)(rollup-plugin-visualizer@7.0.1(rollup@4.60.0))(rollup@4.60.0)(terser@5.46.1)(tsx@4.19.2)(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))(yaml@2.8.3) '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) '@vue/shared': 3.5.30 c12: 3.3.3(magicast@0.5.2) @@ -8906,7 +9210,7 @@ snapshots: oxc-walker: 0.7.0(oxc-parser@0.117.0) pathe: 2.0.3 perfect-debounce: 2.1.0 - picomatch: 4.0.3 + picomatch: 4.0.4 pkg-types: 2.3.0 rou3: 0.8.1 scule: 1.3.0 @@ -9089,6 +9393,31 @@ snapshots: '@oxc-minify/binding-win32-ia32-msvc': 0.117.0 '@oxc-minify/binding-win32-x64-msvc': 0.117.0 + oxc-parser@0.112.0: + dependencies: + '@oxc-project/types': 0.112.0 + optionalDependencies: + '@oxc-parser/binding-android-arm-eabi': 0.112.0 + '@oxc-parser/binding-android-arm64': 0.112.0 + '@oxc-parser/binding-darwin-arm64': 0.112.0 + '@oxc-parser/binding-darwin-x64': 0.112.0 + '@oxc-parser/binding-freebsd-x64': 0.112.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.112.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.112.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.112.0 + '@oxc-parser/binding-linux-arm64-musl': 0.112.0 + '@oxc-parser/binding-linux-ppc64-gnu': 0.112.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.112.0 + '@oxc-parser/binding-linux-riscv64-musl': 0.112.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.112.0 + '@oxc-parser/binding-linux-x64-gnu': 0.112.0 + '@oxc-parser/binding-linux-x64-musl': 0.112.0 + '@oxc-parser/binding-openharmony-arm64': 0.112.0 + '@oxc-parser/binding-wasm32-wasi': 0.112.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.112.0 + '@oxc-parser/binding-win32-ia32-msvc': 0.112.0 + '@oxc-parser/binding-win32-x64-msvc': 0.112.0 + oxc-parser@0.117.0: dependencies: '@oxc-project/types': 0.117.0 @@ -9114,25 +9443,28 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.117.0 '@oxc-parser/binding-win32-x64-msvc': 0.117.0 - oxc-parser@0.95.0: - dependencies: - '@oxc-project/types': 0.95.0 + oxc-transform@0.112.0: optionalDependencies: - '@oxc-parser/binding-android-arm64': 0.95.0 - '@oxc-parser/binding-darwin-arm64': 0.95.0 - '@oxc-parser/binding-darwin-x64': 0.95.0 - '@oxc-parser/binding-freebsd-x64': 0.95.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.95.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.95.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.95.0 - '@oxc-parser/binding-linux-arm64-musl': 0.95.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.95.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.95.0 - '@oxc-parser/binding-linux-x64-gnu': 0.95.0 - '@oxc-parser/binding-linux-x64-musl': 0.95.0 - '@oxc-parser/binding-wasm32-wasi': 0.95.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.95.0 - '@oxc-parser/binding-win32-x64-msvc': 0.95.0 + '@oxc-transform/binding-android-arm-eabi': 0.112.0 + '@oxc-transform/binding-android-arm64': 0.112.0 + '@oxc-transform/binding-darwin-arm64': 0.112.0 + '@oxc-transform/binding-darwin-x64': 0.112.0 + '@oxc-transform/binding-freebsd-x64': 0.112.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.112.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.112.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.112.0 + '@oxc-transform/binding-linux-arm64-musl': 0.112.0 + '@oxc-transform/binding-linux-ppc64-gnu': 0.112.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.112.0 + '@oxc-transform/binding-linux-riscv64-musl': 0.112.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.112.0 + '@oxc-transform/binding-linux-x64-gnu': 0.112.0 + '@oxc-transform/binding-linux-x64-musl': 0.112.0 + '@oxc-transform/binding-openharmony-arm64': 0.112.0 + '@oxc-transform/binding-wasm32-wasi': 0.112.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.112.0 + '@oxc-transform/binding-win32-ia32-msvc': 0.112.0 + '@oxc-transform/binding-win32-x64-msvc': 0.112.0 oxc-transform@0.117.0: optionalDependencies: @@ -9157,34 +9489,63 @@ snapshots: '@oxc-transform/binding-win32-ia32-msvc': 0.117.0 '@oxc-transform/binding-win32-x64-msvc': 0.117.0 - oxc-transform@0.95.0: - optionalDependencies: - '@oxc-transform/binding-android-arm64': 0.95.0 - '@oxc-transform/binding-darwin-arm64': 0.95.0 - '@oxc-transform/binding-darwin-x64': 0.95.0 - '@oxc-transform/binding-freebsd-x64': 0.95.0 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.95.0 - '@oxc-transform/binding-linux-arm-musleabihf': 0.95.0 - '@oxc-transform/binding-linux-arm64-gnu': 0.95.0 - '@oxc-transform/binding-linux-arm64-musl': 0.95.0 - '@oxc-transform/binding-linux-riscv64-gnu': 0.95.0 - '@oxc-transform/binding-linux-s390x-gnu': 0.95.0 - '@oxc-transform/binding-linux-x64-gnu': 0.95.0 - '@oxc-transform/binding-linux-x64-musl': 0.95.0 - '@oxc-transform/binding-wasm32-wasi': 0.95.0 - '@oxc-transform/binding-win32-arm64-msvc': 0.95.0 - '@oxc-transform/binding-win32-x64-msvc': 0.95.0 - - oxc-walker@0.5.2(oxc-parser@0.95.0): + oxc-walker@0.7.0(oxc-parser@0.112.0): dependencies: magic-regexp: 0.10.0 - oxc-parser: 0.95.0 + oxc-parser: 0.112.0 oxc-walker@0.7.0(oxc-parser@0.117.0): dependencies: magic-regexp: 0.10.0 oxc-parser: 0.117.0 + oxfmt@0.41.0: + dependencies: + tinypool: 2.1.0 + optionalDependencies: + '@oxfmt/binding-android-arm-eabi': 0.41.0 + '@oxfmt/binding-android-arm64': 0.41.0 + '@oxfmt/binding-darwin-arm64': 0.41.0 + '@oxfmt/binding-darwin-x64': 0.41.0 + '@oxfmt/binding-freebsd-x64': 0.41.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.41.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.41.0 + '@oxfmt/binding-linux-arm64-gnu': 0.41.0 + '@oxfmt/binding-linux-arm64-musl': 0.41.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.41.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.41.0 + '@oxfmt/binding-linux-riscv64-musl': 0.41.0 + '@oxfmt/binding-linux-s390x-gnu': 0.41.0 + '@oxfmt/binding-linux-x64-gnu': 0.41.0 + '@oxfmt/binding-linux-x64-musl': 0.41.0 + '@oxfmt/binding-openharmony-arm64': 0.41.0 + '@oxfmt/binding-win32-arm64-msvc': 0.41.0 + '@oxfmt/binding-win32-ia32-msvc': 0.41.0 + '@oxfmt/binding-win32-x64-msvc': 0.41.0 + + oxlint@1.56.0: + optionalDependencies: + '@oxlint/binding-android-arm-eabi': 1.56.0 + '@oxlint/binding-android-arm64': 1.56.0 + '@oxlint/binding-darwin-arm64': 1.56.0 + '@oxlint/binding-darwin-x64': 1.56.0 + '@oxlint/binding-freebsd-x64': 1.56.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.56.0 + '@oxlint/binding-linux-arm-musleabihf': 1.56.0 + '@oxlint/binding-linux-arm64-gnu': 1.56.0 + '@oxlint/binding-linux-arm64-musl': 1.56.0 + '@oxlint/binding-linux-ppc64-gnu': 1.56.0 + '@oxlint/binding-linux-riscv64-gnu': 1.56.0 + '@oxlint/binding-linux-riscv64-musl': 1.56.0 + '@oxlint/binding-linux-s390x-gnu': 1.56.0 + '@oxlint/binding-linux-x64-gnu': 1.56.0 + '@oxlint/binding-linux-x64-musl': 1.56.0 + '@oxlint/binding-openharmony-arm64': 1.56.0 + '@oxlint/binding-win32-arm64-msvc': 1.56.0 + '@oxlint/binding-win32-ia32-msvc': 1.56.0 + '@oxlint/binding-win32-x64-msvc': 1.56.0 + optional: true + p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 @@ -9224,8 +9585,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-exists@5.0.0: @@ -9259,9 +9618,9 @@ snapshots: picocolors@1.1.1: {} - picomatch@2.3.1: {} + picomatch@2.3.2: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} pify@2.3.0: {} @@ -9490,12 +9849,6 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-tailwindcss@0.7.2(prettier@3.8.1): - dependencies: - prettier: 3.8.1 - - prettier@3.8.1: {} - pretty-bytes@7.1.0: {} process-nextick-args@2.0.1: {} @@ -9555,7 +9908,7 @@ snapshots: readdirp@3.6.0: dependencies: - picomatch: 2.3.1 + picomatch: 2.3.2 readdirp@4.1.2: {} @@ -9602,7 +9955,7 @@ snapshots: rollup-plugin-visualizer@7.0.1(rollup@4.60.0): dependencies: open: 11.0.0 - picomatch: 4.0.3 + picomatch: 4.0.4 source-map: 0.7.6 yargs: 18.0.0 optionalDependencies: @@ -9783,7 +10136,7 @@ snapshots: source-map@0.7.6: {} - srvx@0.11.12: {} + srvx@0.11.13: {} standard-as-callback@2.1.0: {} @@ -9939,7 +10292,7 @@ snapshots: - bare-buffer - react-native-b4a - tar@7.5.12: + tar@7.5.13: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -9983,8 +10336,10 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinypool@2.1.0: {} to-regex-range@5.0.1: dependencies: @@ -10006,7 +10361,8 @@ snapshots: tslib@2.3.0: {} - tslib@2.8.1: {} + tslib@2.8.1: + optional: true tsscmp@1.0.6: {} @@ -10077,7 +10433,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.2 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 pkg-types: 2.3.0 scule: 1.3.0 strip-literal: 3.1.0 @@ -10090,44 +10446,19 @@ snapshots: unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 - picomatch: 4.0.3 - - unplugin-vue-router@0.16.2(@vue/compiler-sfc@3.5.30)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): - dependencies: - '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3)) - '@vue/compiler-sfc': 3.5.30 - '@vue/language-core': 3.2.6 - ast-walker-scope: 0.8.3 - chokidar: 4.0.3 - json5: 2.2.3 - local-pkg: 1.1.2 - magic-string: 0.30.21 - mlly: 1.8.2 - muggle-string: 0.4.1 - pathe: 2.0.3 - picomatch: 4.0.3 - scule: 1.3.0 - tinyglobby: 0.2.15 - unplugin: 2.3.11 - unplugin-utils: 0.3.1 - yaml: 2.8.3 - optionalDependencies: - vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) - transitivePeerDependencies: - - vue + picomatch: 4.0.4 unplugin@2.3.11: dependencies: '@jridgewell/remapping': 2.3.5 acorn: 8.16.0 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 unplugin@3.0.0: dependencies: '@jridgewell/remapping': 2.3.5 - picomatch: 4.0.3 + picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 unrouting@0.1.7: @@ -10225,20 +10556,21 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.12.0(eslint@9.17.0(jiti@2.6.1))(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)): + vite-plugin-checker@0.12.0(eslint@9.39.4(jiti@2.6.1))(optionator@0.9.4)(oxlint@1.56.0)(typescript@5.9.3)(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)): dependencies: '@babel/code-frame': 7.29.0 chokidar: 4.0.3 npm-run-path: 6.0.0 picocolors: 1.1.1 - picomatch: 4.0.3 + picomatch: 4.0.4 tiny-invariant: 1.3.3 tinyglobby: 0.2.15 vite: 7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3) vscode-uri: 3.1.0 optionalDependencies: - eslint: 9.17.0(jiti@2.6.1) + eslint: 9.39.4(jiti@2.6.1) optionator: 0.9.4 + oxlint: 1.56.0 typescript: 5.9.3 vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3)): @@ -10271,8 +10603,8 @@ snapshots: vite@7.3.1(@types/node@22.15.19)(jiti@2.6.1)(terser@5.46.1)(tsx@4.19.2)(yaml@2.8.3): dependencies: esbuild: 0.27.4 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.8 rollup: 4.60.0 tinyglobby: 0.2.15 @@ -10305,16 +10637,11 @@ snapshots: '@vue/devtools-api': 6.6.4 vue: 3.5.30(typescript@5.9.3) - vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)): - dependencies: - '@vue/devtools-api': 6.6.4 - vue: 3.5.30(typescript@5.9.3) - vue-router@5.0.4(@vue/compiler-sfc@3.5.30)(vue@3.5.30(typescript@5.9.3)): dependencies: '@babel/generator': 7.29.1 '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3)) - '@vue/devtools-api': 8.1.0 + '@vue/devtools-api': 8.1.1 ast-walker-scope: 0.8.3 chokidar: 5.0.0 json5: 2.2.3 @@ -10323,7 +10650,7 @@ snapshots: mlly: 1.8.2 muggle-string: 0.4.1 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 scule: 1.3.0 tinyglobby: 0.2.15 unplugin: 3.0.0 diff --git a/server/api/check.ts b/server/api/check.ts index edd9986d..47a914ca 100644 --- a/server/api/check.ts +++ b/server/api/check.ts @@ -3,7 +3,7 @@ export default defineEventHandler(async event => { host, port = 1688, protocol = 6, - edition = 1, + edition = 1 } = getQuery(event) const result = await runVlmcs({ @@ -11,7 +11,7 @@ export default defineEventHandler(async event => { port, protocol, edition, - verbose: true, + verbose: true }) return result diff --git a/server/api/monitor.ts b/server/api/monitor.ts index 02596b2c..567cc6e9 100644 --- a/server/api/monitor.ts +++ b/server/api/monitor.ts @@ -21,9 +21,9 @@ export default defineEventHandler(async () => { success, fail, delay: delay ? Number(delay.toFixed(2)) : 0, - data, + data } - }), + }) ) // Sort by success rate and delay diff --git a/server/tasks/monitor.ts b/server/tasks/monitor.ts index d00a8752..219e53aa 100644 --- a/server/tasks/monitor.ts +++ b/server/tasks/monitor.ts @@ -1,7 +1,7 @@ export default defineTask({ meta: { name: 'monitor', - description: 'Run KMS server monitoring.', + description: 'Run KMS server monitoring.' }, async run() { const results = await Promise.all( @@ -21,13 +21,13 @@ export default defineTask({ monitorData.push({ status, time: Date.now(), - delay, + delay }) await storage.setItem(`${host}.json`, monitorData) return { host, status } - }), + }) ) const count = results.filter(item => { @@ -39,9 +39,9 @@ export default defineTask({ console.log( new Date().toISOString(), - `Monitor task completed, successful: ${count}`, + `Monitor task completed, successful: ${count}` ) return { result: 'Done' } - }, + } }) diff --git a/server/utils/kms.ts b/server/utils/kms.ts index 0ed6dcf9..28207939 100644 --- a/server/utils/kms.ts +++ b/server/utils/kms.ts @@ -26,7 +26,7 @@ const defaultMonitorList = [ 'kms.wxlost.com', 'kms.zhi.fun', 'win.kms.pub', - 'windows.kms.app', + 'windows.kms.app' ] export const getMonitorList = (() => { @@ -45,13 +45,13 @@ export const runVlmcs = ({ port = 1688, protocol = 6, edition = 26, - verbose = false, + verbose = false }: RunVlmcsParams) => { return runNodeVlmcs({ host, port: Number(port), protocol: Number(protocol), edition: Number(edition), - verbose, + verbose }) as Promise } diff --git a/server/utils/storage.ts b/server/utils/storage.ts index adbca20a..f6f7a240 100644 --- a/server/utils/storage.ts +++ b/server/utils/storage.ts @@ -1 +1 @@ -export const storage = useStorage("data"); +export const storage = useStorage('data') diff --git a/shared/types/monitor.ts b/shared/types/monitor.ts index 8e53373c..99db44ac 100644 --- a/shared/types/monitor.ts +++ b/shared/types/monitor.ts @@ -1,14 +1,14 @@ export interface MonitorData { - time: number; - status: boolean; - delay: number; + time: number + status: boolean + delay: number } export interface MonitorInfo { - host: string; - delay: number; - fail: number; - success: number; - total: number; - data: MonitorData[]; + host: string + delay: number + fail: number + success: number + total: number + data: MonitorData[] } diff --git a/shared/utils/gvlks.ts b/shared/utils/gvlks.ts index 70600440..fda91211 100644 --- a/shared/utils/gvlks.ts +++ b/shared/utils/gvlks.ts @@ -17,8 +17,8 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['NPPR9-FWDCX-D2C8J-H872K-2YT43', 'Windows 11 Enterprise', 'Windows 11 企业版', 'Windows 11 企業版'], ['DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4', 'Windows 11 Enterprise N', 'Windows 11 企业版 N', 'Windows 11 企業版 N'], ['YYVX9-NTFWV-6MDM3-9PT4T-4M68B', 'Windows 11 Enterprise G', 'Windows 11 企业版 G', 'Windows 11 企業版 G'], - ['44RPN-FTY23-9VTTB-MP9BX-T84FV', 'Windows 11 Enterprise G N', 'Windows 11 企业版 G N', 'Windows 11 企業版 G N'], - ], + ['44RPN-FTY23-9VTTB-MP9BX-T84FV', 'Windows 11 Enterprise G N', 'Windows 11 企业版 G N', 'Windows 11 企業版 G N'] + ] }, { version: 'Windows 10', @@ -34,50 +34,50 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['NPPR9-FWDCX-D2C8J-H872K-2YT43', 'Windows 10 Enterprise', 'Windows 10 企业版', 'Windows 10 企業版'], ['DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4', 'Windows 10 Enterprise N', 'Windows 10 企业版 N', 'Windows 10 企業版 N'], ['YYVX9-NTFWV-6MDM3-9PT4T-4M68B', 'Windows 10 Enterprise G', 'Windows 10 企业版 G', 'Windows 10 企業版 G'], - ['44RPN-FTY23-9VTTB-MP9BX-T84FV', 'Windows 10 Enterprise G N', 'Windows 10 企业版 G N', 'Windows 10 企業版 G N'], - ], + ['44RPN-FTY23-9VTTB-MP9BX-T84FV', 'Windows 10 Enterprise G N', 'Windows 10 企业版 G N', 'Windows 10 企業版 G N'] + ] }, { version: 'Windows 11 LTSC 2024', edition: [ ['M7XTQ-FN8P6-TTKYV-9D4CC-J462D', 'Windows 11 Enterprise LTSC 2024', 'Windows 11 企业版 LTSC 2024', 'Windows 11 企業版 LTSC 2024'], - ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 11 Enterprise N LTSC 2024', 'Windows 11 企业版 N LTSC 2024', 'Windows 11 企業版 N LTSC 2024'], - ], + ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 11 Enterprise N LTSC 2024', 'Windows 11 企业版 N LTSC 2024', 'Windows 11 企業版 N LTSC 2024'] + ] }, { version: 'Windows 10 LTSC 2021', edition: [ ['M7XTQ-FN8P6-TTKYV-9D4CC-J462D', 'Windows 10 Enterprise LTSC 2021', 'Windows 10 企业版 LTSC 2021', 'Windows 10 企業版 LTSC 2021'], - ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 10 Enterprise N LTSC 2021', 'Windows 10 企业版 N LTSC 2021', 'Windows 10 企業版 N LTSC 2021'], - ], + ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 10 Enterprise N LTSC 2021', 'Windows 10 企业版 N LTSC 2021', 'Windows 10 企業版 N LTSC 2021'] + ] }, { version: 'Windows 10 LTSC 2019', edition: [ ['M7XTQ-FN8P6-TTKYV-9D4CC-J462D', 'Windows 10 Enterprise LTSC 2019', 'Windows 10 企业版 LTSC 2019', 'Windows 10 企業版 LTSC 2019'], - ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 10 Enterprise N LTSC 2019', 'Windows 10 企业版 N LTSC 2019', 'Windows 10 企業版 N LTSC 2019'], - ], + ['92NFX-8DJQP-P6BBQ-THF9C-7CG2H', 'Windows 10 Enterprise N LTSC 2019', 'Windows 10 企业版 N LTSC 2019', 'Windows 10 企業版 N LTSC 2019'] + ] }, { version: 'Windows IoT LTSC', edition: [ ['KBN8V-HFGQ4-MGXVD-347P6-PDQGT', 'Windows IoT Enterprise LTSC 2024', 'Windows IoT 企业版 LTSC 2024', 'Windows IoT 企業版 LTSC 2024'], - ['KBN8V-HFGQ4-MGXVD-347P6-PDQGT', 'Windows IoT Enterprise LTSC 2021', 'Windows IoT 企业版 LTSC 2021', 'Windows IoT 企業版 LTSC 2021'], - ], + ['KBN8V-HFGQ4-MGXVD-347P6-PDQGT', 'Windows IoT Enterprise LTSC 2021', 'Windows IoT 企业版 LTSC 2021', 'Windows IoT 企業版 LTSC 2021'] + ] }, { version: 'Windows 10 LTSB 2016', edition: [ ['DCPHK-NFMTC-H88MJ-PFHPY-QJ4BJ', 'Windows 10 Enterprise LTSB 2016', 'Windows 10 企业版 LTSB 2016', 'Windows 10 企業版 LTSB 2016'], - ['QFFDN-GRT3P-VKWWX-X7T3R-8B639', 'Windows 10 Enterprise N LTSB 2016', 'Windows 10 企业版 N LTSB 2016', 'Windows 10 企業版 N LTSB 2016'], - ], + ['QFFDN-GRT3P-VKWWX-X7T3R-8B639', 'Windows 10 Enterprise N LTSB 2016', 'Windows 10 企业版 N LTSB 2016', 'Windows 10 企業版 N LTSB 2016'] + ] }, { version: 'Windows 10 LTSB 2015', edition: [ ['WNMTR-4C88C-JK8YV-HQ7T2-76DF9', 'Windows 10 Enterprise 2015 LTSB', 'Windows 10 企业版 2015 LTSB', 'Windows 10 企業版 2015 LTSB'], - ['2F77B-TNFGY-69QQF-B8YKP-D69TJ', 'Windows 10 Enterprise 2015 LTSB N', 'Windows 10 企业版 2015 LTSB N', 'Windows 10 企業版 2015 LTSB N'], - ], + ['2F77B-TNFGY-69QQF-B8YKP-D69TJ', 'Windows 10 Enterprise 2015 LTSB N', 'Windows 10 企业版 2015 LTSB N', 'Windows 10 企業版 2015 LTSB N'] + ] }, { version: 'Windows 8.1', @@ -85,8 +85,8 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['GCRJD-8NW9H-F2CDX-CCM8D-9D6T9', 'Windows 8.1 Pro', 'Windows 8.1 专业版', 'Windows 8.1 專業版'], ['HMCNV-VVBFX-7HMBH-CTY9B-B4FXY', 'Windows 8.1 Pro N', 'Windows 8.1 专业版 N', 'Windows 8.1 專業版 N'], ['MHF9N-XY6XB-WVXMC-BTDCT-MKKG7', 'Windows 8.1 Enterprise', 'Windows 8.1 企业版', 'Windows 8.1 企業版'], - ['TT4HM-HN7YT-62K67-RGRQJ-JFFXW', 'Windows 8.1 Enterprise N', 'Windows 8.1 企业版 N', 'Windows 8.1 企業版 N'], - ], + ['TT4HM-HN7YT-62K67-RGRQJ-JFFXW', 'Windows 8.1 Enterprise N', 'Windows 8.1 企业版 N', 'Windows 8.1 企業版 N'] + ] }, { version: 'Windows 8', @@ -94,8 +94,8 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['NG4HW-VH26C-733KW-K6F98-J8CK4', 'Windows 8 Pro', 'Windows 8 专业版', 'Windows 8 專業版'], ['XCVCF-2NXM9-723PB-MHCB7-2RYQQ', 'Windows 8 Pro N', 'Windows 8 专业版 N', 'Windows 8 專業版 N'], ['32JNW-9KQ84-P47T8-D8GGY-CWCK7', 'Windows 8 Enterprise', 'Windows 8 企业版', 'Windows 8 企業版'], - ['JMNMF-RHW7P-DMY6X-RF3DR-X2BQT', 'Windows 8 Enterprise N', 'Windows 8 企业版 N', 'Windows 8 企業版 N'], - ], + ['JMNMF-RHW7P-DMY6X-RF3DR-X2BQT', 'Windows 8 Enterprise N', 'Windows 8 企业版 N', 'Windows 8 企業版 N'] + ] }, { version: 'Windows 7', @@ -105,8 +105,8 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['W82YF-2Q76Y-63HXB-FGJG9-GF7QX', 'Windows 7 Professional E', 'Windows 7 专业版 E', 'Windows 7 專業版 E'], ['33PXH-7Y6KF-2VJC9-XBBR8-HVTHH', 'Windows 7 Enterprise', 'Windows 7 企业版', 'Windows 7 企業版'], ['YDRBP-3D83W-TY26F-D46B2-XCKRJ', 'Windows 7 Enterprise N', 'Windows 7 企业版 N', 'Windows 7 企業版 N'], - ['C29WB-22CC8-VJ326-GHFJW-H9DH4', 'Windows 7 Enterprise E', 'Windows 7 企业版 E', 'Windows 7 企業版 E'], - ], + ['C29WB-22CC8-VJ326-GHFJW-H9DH4', 'Windows 7 Enterprise E', 'Windows 7 企业版 E', 'Windows 7 企業版 E'] + ] }, { version: 'Windows Vista', @@ -114,9 +114,9 @@ export const WINDOWS_GVLKS: GvlksData[] = [ ['YFKBB-PQJJV-G996G-VWGXY-2V3X8', 'Windows Vista Business', 'Windows Vista 商用版', 'Windows Vista 商用版'], ['HMBQG-8H2RH-C77VX-27R82-VMQBT', 'Windows Vista Business N', 'Windows Vista 商用版 N', 'Windows Vista 商用版 N'], ['VKK3X-68KWM-X2YGT-QR4M6-4BWMV', 'Windows Vista Enterprise', 'Windows Vista 企业版', 'Windows Vista 企業版'], - ['VTC42-BM838-43QHV-84HX6-XJXKV', 'Windows Vista Enterprise N', 'Windows Vista 企业版 N', 'Windows Vista 企業版 N'], - ], - }, + ['VTC42-BM838-43QHV-84HX6-XJXKV', 'Windows Vista Enterprise N', 'Windows Vista 企业版 N', 'Windows Vista 企業版 N'] + ] + } ] /** @@ -129,61 +129,61 @@ export const WINDOWS_SERVER_GVLKS: GvlksData[] = [ edition: [ ['TVRH6-WHNXV-R9WG3-9XRFY-MY832', 'Windows Server 2025 Standard', 'Windows Server 2025 标准版', 'Windows Server 2025 標準版'], ['D764K-2NDRG-47T6Q-P8T8W-YP6DF', 'Windows Server 2025 Datacenter', 'Windows Server 2025 数据中心版', 'Windows Server 2025 數據中心版'], - ['XGN3F-F394H-FD2MY-PP6FD-8MCRC', 'Windows Server 2025 Datacenter: Azure Edition', 'Windows Server 2025 Azure 数据中心版', 'Windows Server 2025 Azure 數據中心版'], - ], + ['XGN3F-F394H-FD2MY-PP6FD-8MCRC', 'Windows Server 2025 Datacenter: Azure Edition', 'Windows Server 2025 Azure 数据中心版', 'Windows Server 2025 Azure 數據中心版'] + ] }, { version: 'Windows Server 2022', edition: [ ['VDYBN-27WPP-V4HQT-9VMD4-VMK7H', 'Windows Server 2022 Standard', 'Windows Server 2022 标准版', 'Windows Server 2022 標準版'], ['WX4NM-KYWYW-QJJR4-XV3QB-6VM33', 'Windows Server 2022 Datacenter', 'Windows Server 2022 数据中心版', 'Windows Server 2022 數據中心版'], - ['NTBV8-9K7Q8-V27C6-M2BTV-KHMXV', 'Windows Server 2022 Datacenter: Azure Edition', 'Windows Server 2022 Azure 数据中心版', 'Windows Server 2022 Azure 數據中心版'], - ], + ['NTBV8-9K7Q8-V27C6-M2BTV-KHMXV', 'Windows Server 2022 Datacenter: Azure Edition', 'Windows Server 2022 Azure 数据中心版', 'Windows Server 2022 Azure 數據中心版'] + ] }, { version: 'Windows Server 2019', edition: [ ['N69G4-B89J2-4G8F4-WWYCC-J464C', 'Windows Server 2019 Standard', 'Windows Server 2019 标准版', 'Windows Server 2019 標準版'], ['WMDGN-G9PQG-XVVXX-R3X43-63DFG', 'Windows Server 2019 Datacenter', 'Windows Server 2019 数据中心版', 'Windows Server 2019 數據中心版'], - ['WVDHN-86M7X-466P6-VHXV7-YY726', 'Windows Server 2019 Essentials', 'Windows Server 2019 基础版', 'Windows Server 2019 基礎版'], - ], + ['WVDHN-86M7X-466P6-VHXV7-YY726', 'Windows Server 2019 Essentials', 'Windows Server 2019 基础版', 'Windows Server 2019 基礎版'] + ] }, { version: 'Windows Server 2016', edition: [ ['WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY', 'Windows Server 2016 Standard', 'Windows Server 2016 标准版', 'Windows Server 2016 標準版'], ['CB7KF-BWN84-R7R2Y-793K2-8XDDG', 'Windows Server 2016 Datacenter', 'Windows Server 2016 数据中心版', 'Windows Server 2016 數據中心版'], - ['JCKRF-N37P4-C2D82-9YXRT-4M63B', 'Windows Server 2016 Essentials', 'Windows Server 2016 基础版', 'Windows Server 2016 基礎版'], - ], + ['JCKRF-N37P4-C2D82-9YXRT-4M63B', 'Windows Server 2016 Essentials', 'Windows Server 2016 基础版', 'Windows Server 2016 基礎版'] + ] }, { version: 'Windows Server 20H2, 2004, 1909, 1903, 1809', edition: [ ['N2KJX-J94YW-TQVFB-DG9YT-724CC', 'Windows Server Standard', 'Windows Server 标准版', 'Windows Server 標準版'], - ['6NMRW-2C8FM-D24W7-TQWMY-CWH2D', 'Windows Server Datacenter', 'Windows Server 数据中心版', 'Windows Server 數據中心版'], - ], + ['6NMRW-2C8FM-D24W7-TQWMY-CWH2D', 'Windows Server Datacenter', 'Windows Server 数据中心版', 'Windows Server 數據中心版'] + ] }, { version: 'Windows Server 1803', edition: [ ['PTXN8-JFHJM-4WC78-MPCBR-9W4KR', 'Windows Server 1803 Standard', 'Windows Server 1803 标准版', 'Windows Server 1803 標準版'], - ['2HXDN-KRXHB-GPYC7-YCKFJ-7FVDG', 'Windows Server 1803 Datacenter', 'Windows Server 1803 数据中心版', 'Windows Server 1803 數據中心版'], - ], + ['2HXDN-KRXHB-GPYC7-YCKFJ-7FVDG', 'Windows Server 1803 Datacenter', 'Windows Server 1803 数据中心版', 'Windows Server 1803 數據中心版'] + ] }, { version: 'Windows Server 1709', edition: [ ['DPCNP-XQFKJ-BJF7R-FRC8D-GF6G4', 'Windows Server 1709 Standard', 'Windows Server 1709 标准版', 'Windows Server 1709 標準版'], - ['6Y6KB-N82V8-D8CQV-23MJW-BWTG6', 'Windows Server 1709 Datacenter', 'Windows Server 1709 数据中心版', 'Windows Server 1709 數據中心版'], - ], + ['6Y6KB-N82V8-D8CQV-23MJW-BWTG6', 'Windows Server 1709 Datacenter', 'Windows Server 1709 数据中心版', 'Windows Server 1709 數據中心版'] + ] }, { version: 'Windows Server 2012 R2', edition: [ ['D2N9P-3P6X9-2R39C-7RTCD-MDVJX', 'Windows Server 2012 R2 Standard', 'Windows Server 2012 R2 标准版', 'Windows Server 2012 R2 標準版'], ['W3GGN-FT8W3-Y4M27-J84CP-Q3VJ9', 'Windows Server 2012 R2 Datacenter', 'Windows Server 2012 R2 数据中心版', 'Windows Server 2012 R2 數據中心版'], - ['KNC87-3J2TX-XB4WP-VCPJV-M4FWM', 'Windows Server 2012 R2 Essentials', 'Windows Server 2012 R2 基础版', 'Windows Server 2012 R2 基礎版'], - ], + ['KNC87-3J2TX-XB4WP-VCPJV-M4FWM', 'Windows Server 2012 R2 Essentials', 'Windows Server 2012 R2 基础版', 'Windows Server 2012 R2 基礎版'] + ] }, { version: 'Windows Server 2012', @@ -196,8 +196,8 @@ export const WINDOWS_SERVER_GVLKS: GvlksData[] = [ ['HM7DN-YVMH3-46JC3-XYTG7-CYQJJ', 'Windows Server 2012 MultiPoint Standard', 'Windows Server 2012 MultiPoint 标准版', 'Windows Server 2012 MultiPoint 標準版'], ['XNH6W-2V9GX-RGJ4K-Y8X6F-QGJ2G', 'Windows Server 2012 MultiPoint Premium', 'Windows Server 2012 MultiPoint 高级版', 'Windows Server 2012 MultiPoint 高級版'], ['48HP8-DN98B-MYWDG-T2DCC-8W83P', 'Windows Server 2012 Datacenter', 'Windows Server 2012 数据中心版', 'Windows Server 2012 數據中心版'], - ['HTDQM-NBMMG-KGYDT-2DTKT-J2MPV', 'Windows Server 2012 Essentials', 'Windows Server 2012 基础版', 'Windows Server 2012 基礎版'], - ], + ['HTDQM-NBMMG-KGYDT-2DTKT-J2MPV', 'Windows Server 2012 Essentials', 'Windows Server 2012 基础版', 'Windows Server 2012 基礎版'] + ] }, { version: 'Windows Server 2008 R2', @@ -207,8 +207,8 @@ export const WINDOWS_SERVER_GVLKS: GvlksData[] = [ ['YC6KT-GKW9T-YTKYR-T4X34-R7VHC', 'Windows Server 2008 R2 Standard', 'Windows Server 2008 R2 标准版', 'Windows Server 2008 R2 標準版'], ['489J6-VHDMP-X63PK-3K798-CPX3Y', 'Windows Server 2008 R2 Enterprise', 'Windows Server 2008 R2 企业版', 'Windows Server 2008 R2 企業版'], ['74YFP-3QFB3-KQT8W-PMXWJ-7M648', 'Windows Server 2008 R2 Datacenter', 'Windows Server 2008 R2 数据中心版', 'Windows Server 2008 R2 數據中心版'], - ['GT63C-RJFQ3-4GMB6-BRFB9-CB83V', 'Windows Server 2008 R2 for Itanium-based Systems', '面向基于 Itanium 系统的 Windows Server 2008 R2', '面向基於 Itanium 系統的 Windows Server 2008 R2'], - ], + ['GT63C-RJFQ3-4GMB6-BRFB9-CB83V', 'Windows Server 2008 R2 for Itanium-based Systems', '面向基于 Itanium 系统的 Windows Server 2008 R2', '面向基於 Itanium 系統的 Windows Server 2008 R2'] + ] }, { version: 'Windows Server 2008', @@ -221,9 +221,9 @@ export const WINDOWS_SERVER_GVLKS: GvlksData[] = [ ['RCTX3-KWVHP-BR6TB-RB6DM-6X7HP', 'Windows Server 2008 HPC', 'Windows Server 2008 HPC', 'Windows Server 2008 HPC'], ['7M67G-PC374-GR742-YH8V4-TCBY3', 'Windows Server 2008 Datacenter', 'Windows Server 2008 数据中心版', 'Windows Server 2008 數據中心版'], ['22XQ2-VRXRG-P8D42-K34TD-G3QQC', 'Windows Server 2008 Datacenter without Hyper-V', '不带 Hyper-V 的 Windows Server 2008 数据中心版', '不帶 Hyper-V 的 Windows Server 2008 數據中心版'], - ['4DWFP-JF3DJ-B7DTH-78FJB-PDRHK', 'Windows Server 2008 for Itanium-Based Systems', '面向基于 Itanium 系统的 Windows Server 2008', '面向基於 Itanium 系統的 Windows Server 2008'], - ], - }, + ['4DWFP-JF3DJ-B7DTH-78FJB-PDRHK', 'Windows Server 2008 for Itanium-Based Systems', '面向基于 Itanium 系统的 Windows Server 2008', '面向基於 Itanium 系統的 Windows Server 2008'] + ] + } ] /** @@ -245,8 +245,8 @@ export const OFFICE_GVLKS: GvlksData[] = [ ['D2F8D-N3Q3B-J28PV-X27HD-RJWB9', 'Outlook LTSC 2024', 'Outlook LTSC 2024', 'Outlook LTSC 2024'], ['CW94N-K6GJH-9CTXY-MG2VC-FYCWP', 'PowerPoint LTSC 2024', 'PowerPoint LTSC 2024', 'PowerPoint LTSC 2024'], ['4NKHF-9HBQF-Q3B6C-7YV34-F64P3', 'Skype for Business LTSC 2024', 'Skype for Business LTSC 2024', 'Skype for Business LTSC 2024'], - ['MQ84N-7VYDM-FXV7C-6K7CC-VFW9J', 'Word LTSC 2024', 'Word LTSC 2024', 'Word LTSC 2024'], - ], + ['MQ84N-7VYDM-FXV7C-6K7CC-VFW9J', 'Word LTSC 2024', 'Word LTSC 2024', 'Word LTSC 2024'] + ] }, { version: 'Office 2021 LTSC', @@ -263,8 +263,8 @@ export const OFFICE_GVLKS: GvlksData[] = [ ['TY7XF-NFRBR-KJ44C-G83KF-GX27K', 'PowerPoint LTSC 2021', 'PowerPoint LTSC 2021', 'PowerPoint LTSC 2021'], ['2MW9D-N4BXM-9VBPG-Q7W6M-KFBGQ', 'Publisher LTSC 2021', 'Publisher LTSC 2021', 'Publisher LTSC 2021'], ['HWCXN-K3WBT-WJBKY-R8BD9-XK29P', 'Skype for Business LTSC 2021', 'Skype for Business LTSC 2021', 'Skype for Business LTSC 2021'], - ['TN8H9-M34D3-Y64V9-TR72V-X79KV', 'Word LTSC 2021', 'Word LTSC 2021'], - ], + ['TN8H9-M34D3-Y64V9-TR72V-X79KV', 'Word LTSC 2021', 'Word LTSC 2021'] + ] }, { version: 'Office 2019', @@ -281,8 +281,8 @@ export const OFFICE_GVLKS: GvlksData[] = [ ['RRNCX-C64HY-W2MM7-MCH9G-TJHMQ', 'PowerPoint 2019', 'PowerPoint 2019', 'PowerPoint 2019'], ['G2KWX-3NW6P-PY93R-JXK2T-C9Y9V', 'Publisher 2019', 'Publisher 2019', 'Publisher 2019'], ['NCJ33-JHBBY-HTK98-MYCV8-HMKHJ', 'Skype for Business 2019', 'Skype for Business 2019', 'Skype for Business 2019'], - ['PBX3G-NWMT6-Q7XBW-PYJGG-WXD33', 'Word 2019', 'Word 2019', 'Word 2019'], - ], + ['PBX3G-NWMT6-Q7XBW-PYJGG-WXD33', 'Word 2019', 'Word 2019', 'Word 2019'] + ] }, { version: 'Office 2016', @@ -300,7 +300,7 @@ export const OFFICE_GVLKS: GvlksData[] = [ ['J7MQP-HNJ4Y-WJ7YM-PFYGF-BY6C6', 'PowerPoint 2016', 'PowerPoint 2016', 'PowerPoint 2016'], ['F47MM-N3XJP-TQXJ9-BP99D-8K837', 'Publisher 2016', 'Publisher 2016', 'Publisher 2016'], ['869NQ-FJ69K-466HW-QYCP2-DDBV6', 'Skype for Business 2016', 'Skype for Business 2016', 'Skype for Business 2016'], - ['WXY84-JN2Q9-RBCCQ-3Q3J3-3PFJ6', 'Word 2016', 'Word 2016', 'Word 2016'], - ], - }, + ['WXY84-JN2Q9-RBCCQ-3Q3J3-3PFJ6', 'Word 2016', 'Word 2016', 'Word 2016'] + ] + } ] diff --git a/tailwind.config.ts b/tailwind.config.ts index 9738bc25..078c8983 100644 --- a/tailwind.config.ts +++ b/tailwind.config.ts @@ -2,6 +2,6 @@ import type { Config } from 'tailwindcss' export default >{ theme: { - extend: {}, - }, + extend: {} + } } From 1b7dd27edb10f2efd367146df7a3ebc493ad723f Mon Sep 17 00:00:00 2001 From: notte <54543761+ikxin@users.noreply.github.com> Date: Tue, 24 Mar 2026 09:57:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E7=9B=91?= =?UTF-8?q?=E6=8E=A7=E9=A1=B5=E9=9D=A2=E5=B9=B3=E5=9D=87=E5=BB=B6=E8=BF=9F?= =?UTF-8?q?=E5=92=8C=E6=88=90=E5=8A=9F=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/app.vue | 13 +++++++ app/pages/monitor.vue | 75 ++++++++++++++++++++++++++++++++--------- i18n/locales/en.json | 7 +--- i18n/locales/zh-cn.json | 7 +--- server/api/monitor.ts | 10 +++--- server/utils/kms.ts | 1 - 6 files changed, 79 insertions(+), 34 deletions(-) diff --git a/app/app.vue b/app/app.vue index b1f9ce1d..49bb58fd 100644 --- a/app/app.vue +++ b/app/app.vue @@ -1,5 +1,18 @@