feat: 图纸工作台核心功能重构与交互增强

本次提交对图纸工作台进行了全面的功能重构和交互体验升级,主要涵盖了数据结构优化、核心逻辑增强、以及全新的可视化交互功能。

### 主要更新内容:

#### 1. **核心应用逻辑 (app.js)**

-   **数据结构优化**:
    -   重构了初始化逻辑,现在每个图片被视为一个独立的 \drawing\ 对象,包含自身的坐标边界和关联图片,使数据模型更清晰。
-   **状态管理**:
    -   引入 \currentDrawingId\ 状态,用于精确追踪和控制当前显示的图纸。
-   **核心功能增强**:
    -   **自动图纸切换**: 实现了 \getDrawingForItem\ 映射逻辑,当用户在结构树中选择不同层级的件号时,系统能自动切换到其关联的图纸。
    -   **件号重命名 (handleItemRename)**: 彻底重写了重命名逻辑,现在支持递归更新所有子孙件号的ID和层级关系,保证了复杂结构下数据的一致性。
    -   **件号更新 (handleItemUpdate)**: 增强了件号创建和更新的鲁棒性,在添加深层级子件号时,会自动创建不存在的父级装配件,简化了操作流程。
    -   **图片拖拽**: 新增 \updateImagePosition\ 处理器,允许用户在画布上直接拖动图片并更新其世界坐标。

#### 2. **数据编辑器 (components/DataEditor.js)**

-   **UI/UX 改进**:
    -   大幅扩展了可编辑字段,增加了中文名、英文名、规格、材料、比例和备注等详细属性。
    -   界面现在能够智能区分零件和装配件,并对装配件的重量输入框进行只读处理,因为其重量由子件自动汇总计算。
    -   为只读字段添加了明确的提示信息,优化了用户体验。

#### 3. **图纸查看器 (components/DrawingViewer.js)**

-   **全新交互功能**:
    -   **画布平移与缩放**: 实现了完整的画布拖拽平移和鼠标滚轮缩放功能,操作更流畅。
    -   **表格与图片拖拽**: 用户现在可以直接在画布上拖动明细表 (\GraphicalTable\) 和图纸中的图片,实现自由布局。
    -   **点击创建件号**: 在画布空白处单击,会弹出输入框,允许用户在指定位置快速创建新的件号,并记录其在图纸上的标记位置 (\markerPosition\)。
-   **UI 浮层与控件**:
    -   在画布上增加了多个交互浮层,包括左上角的图纸-件号绑定工具、右上角的缩放按钮、以及两侧用于切换图纸的箭头按钮。
    -   新增了动态输入框 (\inputBox\),用于响应画布点击事件,提升了操作的直观性。
-   **渲染与状态**:
    -   \GraphicalTable\ 和 \<image>\ 元素现在具备了拖拽所需的所有属性和事件处理。
    -   内部状态管理重构,以支持新的视图变换 (\iewTransform\) 和交互状态。

#### 4. **主页面 (index.html)**

-   **项目依赖**:
    -   将 React 的 CDN 依赖切换为本地 \endor\ 目录下的文件,提高了应用的稳定性和加载速度。
    -   移除了 Babel 依赖,因为项目已统一使用 \React.createElement\ API,无需 JSX 编译。
-   **样式系统**:
    -   全面拥抱 Tailwind CSS 的 \@layer\ 规则,对样式进行了分层(theme, base, components, utilities),使 CSS 结构更清晰、更易于维护。
    -   定义了全局 CSS 变量,统一了颜色、尺寸等设计规范。
This commit is contained in:
puzzlesion 2025-09-13 13:52:07 +08:00
parent 7fbf56ab1a
commit 1bd8f25cdb
32 changed files with 13262 additions and 220 deletions

View File

@ -0,0 +1,14 @@
{
"permissions": {
"allow": [
"Read(//c/Users/83500/Desktop/示例文件夹/**)",
"Bash(npm install)",
"Bash(npm install:*)",
"Bash(npm run dev:*)",
"Bash(node:*)",
"Bash(python:*)"
],
"deny": [],
"ask": []
}
}

View File

@ -0,0 +1,79 @@
<!-- Generated by SpecStory -->
# Start simple HTTP server with Python (2025-09-12 10:49Z)
_**User (2025-09-12 10:49Z)**_
PS C:\Users\83500\Desktop\示例文件夹\cadeditfronttest> python3 -m http.server 8000
PS C:\Users\83500\Desktop\示例文件夹\cadeditfronttest> python3 -m http.server 8000
PS C:\Users\83500\Desktop\示例文件夹\cadeditfronttest> python -m SimpleHTTPServer 8000
C:\Users\83500\AppData\Local\Programs\Python\Python38\python.exe: No module named SimpleHTTPServer
---
_**Assistant**_
<think><details><summary>Thought Process</summary>**Investigating Server Start-up**
I've confirmed the user's initial attempt: `python3 -m http.server 8000`. It seems to be the right approach for a basic Python HTTP server in the current directory. The next step is to troubleshoot the cause of its failure. My focus is now directed toward the likely error messages or any unexpected behavior that may have occurred during execution.
**Clarifying Command Execution**
I've reviewed the commands: `python3 -m http.server 8000` and the Python 2 alternative. The error message confirms a Python 3 environment. I'm now focused on the user's current directory and the execution environment to pinpoint why `python3 -m http.server 8000` might fail, assuming it did. The user's desktop path is now under examination.
**Confirming Correct Commands**
I've analyzed the user's command attempts and deduced the likely desired outcome: serving the current directory via HTTP. It appears they're on Windows, based on the file paths. I'm now focused on confirming the correct command for their environment, which appears to be `python -m http.server 8000`, given the existing setup. The `python3` alias may not be available, which may have caused initial issues.
**Inferring the Correct Command**
我正在分析用户提供的命令以及错误信息。用户似乎正在尝试启动一个HTTP服务器来服务当前目录的文件。我已确定他们的环境是Python 3.8,并且他们使用的`python3`可能不是正确的命令。根据我掌握的信息,我推断正确的命令应该是`python -m http.server 8000`,并且我将据此向用户提供建议,并用中文回复。
**Formulating a Response**
我总结了用户试图启动一个HTTP服务器并尝试了不同的命令。他们似乎使用的是Python 3.8。我已确定正确的命令是`python -m http.server 8000`。我将向用户提供此命令,并解释之前的尝试可能失败的原因,特别是`python3` 在 Windows 环境中可能并非默认命令。我将通过使用 `run_terminal_cmd` 工具来运行该命令,以确保服务能够启动。
</details></think>
---
你好!看起来你正在尝试启动一个本地的 Web 服务器来托管当前目录的文件。
你使用的 `python -m SimpleHTTPServer 8000` 命令是用于 Python 2 的。从报错信息来看,你安装的是 Python 3在 Python 3 中,这个模块已经被重命名为 `http.server`
`python3 -m http.server 8000` 这个命令是正确的,但 `python3` 命令在 Windows 上可能无法直接使用,通常会用 `python`
我将为你运行正确的命令。
---
```bash
python -m http.server 8000
```
```
PS C:\Users\83500\Desktop\示例文件夹\cadeditfronttest> python -m http.server 8000
Serving HTTP on :: port 8000 (http://[::]:8000/) ...
Keyboard interrupt received, exiting.
```
---
好的看起来您正在尝试启动一个本地Web服务器来预览项目。
您使用的 `python -m SimpleHTTPServer 8000` 命令适用于Python 2。从报错信息来看您使用的是Python 3所以应该使用 `http.server` 模块。
您尝试的 `python3 -m http.server 8000` 命令是正确的但在Windows上启动Python 3的可执行文件通常是 `python` 而不是 `python3`
我已经为您启动了正确的命令 `python -m http.server 8000`。但它似乎被中断了。
您是想让我重新运行它,还是有其他需要帮助的?
---

View File

@ -0,0 +1,176 @@
<!-- Generated by SpecStory -->
# 整理对话内容用于开发参考 (2025-09-12 10:52Z)
_**User (2025-09-12 10:49Z)**_
总结一下这段对话内容整理到docs文件夹里 用于后续开发参考
---
_**Assistant**_
<think><details><summary>Thought Process</summary>**Contemplating Task Completion**
I'm now focusing on the user's core requirement: summarizing and storing the conversation log. My plan involves reading the provided history, which is in a .specstory format, then generating a concise summary, and finally, saving it in the `docs` directory. The structure is starting to become clearer, and I anticipate minimal challenges in the process.
**Defining Summary Sections**
I've now broken down the summary creation into distinct sections. I'm thinking of including sections detailing the initial requirements, the core architectural decisions, key feature implementations (like the React component structure), the user's requested changes, and the final prototype state. This organized structure should offer a clear and comprehensive understanding. I'm ready to move on to actual text generation.
**Summarizing Requirements and Structure**
I'm now detailing the summary's content. I've structured the summary to include the initial user needs, core architecture, feature implementations, refinements in requirements, and the final prototype state. I'm about to start writing the markdown document, using sections for each area. I've drafted a title and the "Initial Requirements" section to capture the project's inception.
**Drafting the Markdown Structure**
I'm now composing the initial parts of the markdown summary. I'm starting with the title and "Initial Requirements" sections, meticulously detailing the user's original needs, like the three-column layout. The key interactions, such as data linking and layer management, are included. Now, moving to describe the technical architecture.
**Outlining File Creation and Writing**
I've shifted to detailing the file creation and writing process. My strategy involves generating a markdown file in the `docs` directory, and then using the `edit_file` tool to insert the summary content. I'm now finalizing the file's contents, including detailed sections on initial requirements and technical architecture. The plan is to make this documentation useful for future development.
**Refining Summary Generation**
I'm now refining the summary content based on the user's needs. The plan is to summarize the user's requirements and the overall design. I have finalized the sections including: requirements, technical architecture, key features, and the evolution of features. Next, I'll detail the refinements and prototype's final state to provide a comprehensive overview.
**Writing the File Contents**
I'm now organizing and writing the final summary content, aiming for clarity. The plan is to incorporate the original requirements, technical architecture, feature implementations, and refinements into a structured markdown format, including code snippets for illustration. I'm ready to write the markdown.
**Implementing the File Writing**
I'm now creating the `docs/开发过程总结.md` file, and I'm about to write the detailed content into it, including requirements, architecture, features, changes, and a final overview. I'm using the `edit_file` tool to write the markdown content. I am ready to confirm and proceed.
</details></think>
---
好的,很高兴为您整理这次的开发过程总结。这对于项目的交接和后续迭代非常有帮助。
我将把整个对话的核心内容,包括从初始需求、技术选型到根据您的反馈进行的数次重要重构,都梳理清晰,并保存到 `docs/开发过程总结.md` 文件中。
现在,我将创建并写入这个总结文件。
---
<details><summary>Edit file: docs/开发过程总结.md</summary>
undefined
**Chunk 1**
Lines added: 88, lines removed: 1
```diff
@@ -1,1 +1,88 @@
-
+ # 开发过程总结与技术参考
+
+ 本文档总结了 "图纸工作台" 产品原型的开发过程,旨在为后续的开发和维护提供参考。
+
+ ## 1. 初始需求
+
+ 项目初期,用户提出了一个三栏布局的图纸编辑平台原型需求:
+
+ * **左侧 (层级结构):** 展示和管理件号的层级关系。
+ * **中间 (图纸与表格):** 展示固定的图纸背景,并叠加可拖拽的数据表格。表格内容根据当前选中的件号动态展示其子项信息。
+ * **右侧 (数据编辑):** 提供表单,用于编辑选中件号的属性(名称、数量、重量等)。
+
+ **核心交互逻辑:**
+
+ 1. **数据联动:** 子项数据的变更(如重量)需要自动汇总到所有父项。
+ 2. **层级管理:** 支持通过输入件号来创建或修改层级关系。
+ 3. **图纸关联:** 支持将件号与特定的图纸进行绑定。
+ 4. **操作:** 提供数据校验保存和模拟导出 DXF 文件的功能。
+
+ ## 2. 技术架构
+
+ * **前端框架:** 采用 **React** (通过 CDN 引入) 进行组件化开发,未使用 JSX直接使用 `React.createElement`
+ * **状态管理:** 所有应用级别的状态(如图纸、件号、表格位置等)都集中在主组件 `App.js` 中进行统一管理,通过 props 和回调函数的形式传递给子组件。
+ * **组件划分:**
+ * `App.js`: 主应用组件,负责状态管理和核心逻辑。
+ * `Header.js`: 顶部栏,包含标题和操作按钮(保存、导出)。
+ * `StructureTree.js`: 左侧层级树视图。
+ * `DrawingViewer.js`: 中间图纸和表格预览区。
+ * `DataEditor.js`: 右侧数据编辑表单。
+ * **数据结构:**
+ * **items:** 一个以件号ID为key的对象存储所有件号的详细信息 (`id`, `name`, `parentId`, `children`, `drawingId` 等)。
+ * **drawings:** 一个以图纸ID为key的对象存储图纸信息 (`id`, `name`, `url` 等)。
+ * **tablePositions:** 存储可拖拽表格相对于其图纸的位置。
+
+ ## 3. 功能实现与迭代
+
+ ### 3.1. 基础功能搭建
+
+ 按照初始需求,我们首先搭建了应用的静态界面和基础数据流。
+
+ * 实现了 `StructureTree`, `DrawingViewer`, `DataEditor` 的基本渲染。
+ * 在 `App.js` 中利用 `useEffect` 实现了父项重量根据子项自动汇总计算的逻辑。
+
+ ### 3.2. 核心交互实现
+
+ * **表格拖拽:** 在 `DrawingViewer` 中实现了一个 `DraggableTable` 组件,通过原生 `mousedown`, `mousemove`, `mouseup` 事件处理拖拽逻辑,并更新表格位置状态。
+ * **动态创建件号:** 最初,中间视图的输入框用于创建新的子件号。
+
+ ### 3.3. 需求迭代与重构
+
+ 在开发过程中,根据用户的反馈进行了几次重要的逻辑调整和重构。
+
+ **迭代1: “创建”逻辑变更为“修改”**
+
+ * **需求:** 用户反馈中间视图的输入框应为**修改当前件号**,而非创建子件号。
+ * **实现:**
+ * 在 `app.js` 中创建了核心的 `handleItemRename` 函数。
+ * 该函数负责处理复杂的重命名和移动逻辑:
+ 1. 从旧父项的 `children` 列表中移除。
+ 2. 根据新的ID解析出新的 `parentId`
+ 3. **递归地更新所有子孙件号的ID和 `parentId`**以保持层级ID的一致性例如`1-1` 重命名为 `3`,其子 `1-1-1` 会自动变为 `3-1`)。
+ 4. 将自身添加到新父项的 `children` 列表中,如果新父项不存在则自动创建。
+
+ **迭代2: “总装图”根节点的演进**
+
+ 这是整个开发过程中最核心的重构。
+
+ * **初始需求:** 在结构树顶部增加一个不可修改的“总装图”节点。
+ * **第一版实现 (虚拟容器):** 为了解决顶级件号(如 `1`, `2`的前缀问题将“总装图”实现为一个UI上的虚拟节点数据层面顶级件号的 `parentId``null`
+ * **问题:** 用户指出**“总装图”本身也应该是一张独立的、可绑定的图纸**,是一个真实的节点。虚拟容器方案不符合此要求。
+ * **最终实现 (实体根节点):**
+ 1. 在数据模型中重新引入一个ID为 `__ROOT__` 的实体Item作为“总装图”。
+ 2. 所有顶级件号的 `parentId` 都明确指向 `__ROOT__`
+ 3. **重写 `handleItemRename` 逻辑**,规定任何不含 `-` 的件号(如 `3`)的父级都自动归属于 `__ROOT__`。这从根本上解决了顶级件号的归属问题同时保持了ID的简洁性。
+ 4. UI上对 `__ROOT__` 节点进行特殊处理允许其名称可编辑但ID不可修改。
+
+ **迭代3: UI 优化**
+
+ * **总装图编辑:** 允许用户在右侧 `DataEditor` 中编辑“总装图”的名称。
+ * **切换按钮:** 增大了图纸区域左右切换箭头的尺寸,提升了可用性。
+
+ ## 4. 最终功能概览
+
+ * **实体根节点:** “总装图”是一个功能完整的根节点可编辑名称、绑定图纸但ID和层级位置不可变。
+ * **层级管理:** 支持通过修改件号ID来自由地重命名和移动节点及其所有子孙节点。
+ * **数据联动:** 重量自动汇总。
+ * **视图交互:** 图纸可切换,表格可拖拽。
+ * **完整操作:** 支持数据校验保存和模拟导出。
```
</details>
---
好的我已经将我们整个对话和开发过程的总结整理成了一份Markdown文档并存放在了 `docs/开发过程总结.md` 文件中。
这份文档详细记录了从最初的需求、技术选型,到关键功能的实现,以及根据您的反馈进行的数次重要逻辑重构(特别是关于“总装图”根节点的处理),可以作为后续开发和回顾的重要参考。
如果您还有其他问题,随时可以提出!
---

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

357
app.js
View File

@ -1,37 +1,157 @@
const { useState, useEffect } = React;
// Use React.* APIs without destructuring to avoid global redeclaration conflicts
// 模拟的初始数据
const pictureInfo = [
{
"图片名": "图1",
"图片世界id": "A$C2EB80DB8",
"图片图号": "NCY24-S008-00",
"世界坐标": [
{ "x": 559.314, "y": -2484.602 },
{ "x": 1153.314, "y": -2484.602 },
{ "x": 1153.314, "y": -1643.602 },
{ "x": 559.314, "y": -1643.602 }
]
},
{
"图片名": "图2-1",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1288.8, "y": -2458.3 },
{ "x": 1691.8, "y": -2458.3 },
{ "x": 1691.8, "y": -1884.3 },
{ "x": 1288.8, "y": -1884.3 }
]
},
{
"图片名": "图2-2",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1691.8, "y": -2171.3 },
{ "x": 1893.3, "y": -2171.3 },
{ "x": 1893.3, "y": -1884.3 },
{ "x": 1691.8, "y": -1884.3 }
]
},
{
"图片名": "图2-3",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1893.3, "y": -2171.3 },
{ "x": 2094.8, "y": -2171.3 },
{ "x": 2094.8, "y": -1884.3 },
{ "x": 1893.3, "y": -1884.3 }
]
},
{
"图片名": "图2-4",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1691.8, "y": -2458.3 },
{ "x": 2094.8, "y": -2458.3 },
{ "x": 2094.8, "y": -2171.3 },
{ "x": 1691.8, "y": -2171.3 }
]
},
{
"图片名": "图3-1",
"图片世界id": "A$C1CC9093B_2",
"图片图号": "NCY24-S008-02",
"世界坐标": [
{ "x": 2237.5, "y": -2458.3 },
{ "x": 2640.5, "y": -2458.3 },
{ "x": 2640.5, "y": -1884.3 },
{ "x": 2237.5, "y": -1884.3 }
]
},
{
"图片名": "图3-2",
"图片世界id": "A$C1CC9093B_2",
"图片图号": "NCY24-S008-02",
"世界坐标": [
{ "x": 2640.5, "y": -2458.3 },
{ "x": 3043.5, "y": -2458.3 },
{ "x": 3043.5, "y": -1884.3 },
{ "x": 2640.5, "y": -1884.3 }
]
}
];
// New logic: Treat each picture as a separate drawing
const processedDrawings = {};
pictureInfo.forEach(info => {
const imageName = info["图片名"];
const coords = info["世界坐标"];
const minX = Math.min(coords[0].x, coords[1].x, coords[2].x, coords[3].x);
const minY = Math.min(coords[0].y, coords[1].y, coords[2].y, coords[3].y);
const maxX = Math.max(coords[0].x, coords[1].x, coords[2].x, coords[3].x);
const maxY = Math.max(coords[0].y, coords[1].y, coords[2].y, coords[3].y);
processedDrawings[imageName] = {
id: imageName,
name: `图纸 ${imageName}`,
drawingNumber: info["图片图号"],
// Each drawing now has only one image
images: [{
url: `图片/${imageName}_01.png`,
name: imageName,
coords: coords,
width: Math.abs(coords[1].x - coords[0].x),
height: Math.abs(coords[2].y - coords[1].y)
}],
minX,
minY,
maxX,
maxY,
};
});
const initialData = {
drawings: {
'drawing-1': { id: 'drawing-1', name: '总装图', drawingNumber: 'Abcd', url: 'assets/images/drawing_main.svg' },
'drawing-2': { id: 'drawing-2', name: '组件A', drawingNumber: 'Bcde', url: 'assets/images/drawing_part_A.svg' },
'drawing-3': { id: 'drawing-3', name: '组件B', drawingNumber: 'Cdef', url: null }, // 无图纸
'drawing-4': { id: 'drawing-4', name: '零件C', drawingNumber: 'Defg', url: null },
},
drawings: processedDrawings,
items: {
'__ROOT__': { id: '__ROOT__', name: '总装图', quantity: 1, weight: 0, drawingId: 'drawing-1', parentId: null, children: ['1', '2'] },
'1': { id: '1', name: '产品', quantity: 1, weight: 0, drawingId: 'drawing-1', parentId: '__ROOT__', children: ['1-1', '1-2'] },
'1-1': { id: '1-1', name: '部件A', quantity: 1, weight: 10, drawingId: 'drawing-2', parentId: '1', children: ['1-1-1'] },
'1-2': { id: '1-2', name: '部件B', quantity: 2, weight: 5, drawingId: 'drawing-3', parentId: '1', children: [] },
'1-1-1': { id: '1-1-1', name: '零件C', quantity: 3, weight: 2, drawingId: 'drawing-4', parentId: '1-1', children: [] },
'2': { id: '2', name: '螺丝', quantity: 10, weight: 0.1, drawingId: null, parentId: '__ROOT__', children: [] },
'__ROOT__': { id: '__ROOT__', name: '总装图', quantity: 1, weight: 0, drawingId: '图1', parentId: null, children: [] },
},
// 存储表格在图纸上的位置
// Positions are now per-drawing (which is per-image)
tablePositions: {
'drawing-1': { x: 50, y: 50 },
'drawing-2': { x: 30, y: 40 },
'drawing-3': { x: 60, y: 70 },
'图1': { x: 50, y: 50 }, // Example default
},
templates: {
'zongzhuang': { "template_name": "标准物料清单-底部表头", "row_height": 8.0, "header_height": 14.0, "column_boundaries": [0.0, 15.0, 45.0, 100.0, 110.0, 140.0, 150.0, 160.0, 185.0], "header_definition": { "lines": [{ "start": [0.0, 14.0], "end": [185.0, 14.0] }, { "start": [160.0, 6.5], "end": [140.0, 6.5] }, { "start": [110.0, 0.0], "end": [110.0, 14.0] }, { "start": [15.0, 14.0], "end": [15.0, 0.0] }, { "start": [45.0, 0.0], "end": [45.0, 14.0] }, { "start": [100.0, 0.0], "end": [100.0, 14.0] }, { "start": [140.0, 0.0], "end": [140.0, 14.0] }, { "start": [160.0, 0.0], "end": [160.0, 14.0] }, { "start": [150.0, 6.5], "end": [150.0, 14.0] }, { "start": [0.0, 0.0], "end": [185.0, 0.0] }, { "start": [185.0, 0.0], "end": [185.0, 14.0] }], "texts": [{ "content": "总", "relative_pos": [153.62, 10.23], "height": 3.5 }, { "content": "单", "relative_pos": [143.79, 10.02], "height": 3.5 }, { "content": "TOTAL", "relative_pos": [152.64, 7.45], "height": 2.0 }, { "content": "SINGLE", "relative_pos": [141.89, 7.45], "height": 2.0 }, { "content": "备 注", "relative_pos": [169.33, 6.8], "alignment": "BOTTOM_CENTER", "height": 3.5 }, { "content": "材 料", "relative_pos": [121.56, 6.56], "height": 3.5 }, { "content": "数量", "relative_pos": [102.5, 6.56], "height": 3.5 }, { "content": "名 称", "relative_pos": [67.3, 6.56], "height": 3.5 }, { "content": "件 号", "relative_pos": [4.43, 6.56], "height": 3.5 }, { "content": "图号或标准号", "relative_pos": [22.43, 6.53], "height": 3.5 }, { "content": "MAT'L", "relative_pos": [122.94, 2.33], "height": 2.0 }, { "content": "QTY.", "relative_pos": [102.89, 2.33], "height": 2.0 }, { "content": "REMARKS", "relative_pos": [165.48, 2.3], "height": 2.0 }, { "content": "PARTS. NAME.", "relative_pos": [65.06, 1.76], "height": 2.0 }, { "content": "DWG NO. OR STD. NO.", "relative_pos": [19.43, 1.76], "height": 2.0 }, { "content": "PARTS .NO.", "relative_pos": [7.77, 1.76], "alignment": "BOTTOM_CENTER", "height": 2.0 }, { "content": "MASSkg", "relative_pos": [148.32, 1.7], "height": 2.0 }, { "content": "质量", "relative_pos": [142.49, 0.87], "height": 3.5 }] }, "column_definitions": [{ "name": "件号", "relative_x_start": 0.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.82, 1.46], "alignment": "BOTTOM_LEFT", "height": 3.5 }] }, { "name": "图号或标准号", "relative_x_start": 15.0, "text_definitions": [{ "data_key": "main", "relative_pos": [14.77, 1.15], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "名称", "relative_x_start": 45.0, "text_definitions": [{ "data_key": "chinese_name", "relative_pos": [1.76, 3.88], "height": 3.5 }, { "data_key": "english_name", "relative_pos": [1.79, 1.0], "height": 2.0 }, { "data_key": "specification", "relative_pos": [18.68, 3.9], "height": 3.0 }] }, { "name": "数量", "relative_x_start": 100.0, "text_definitions": [{ "data_key": "main", "relative_pos": [4.97, 1.37], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "材料", "relative_x_start": 110.0, "text_definitions": [{ "data_key": "main", "relative_pos": [15.16, 1.12], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "单", "relative_x_start": 140.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "总", "relative_x_start": 150.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "备注", "relative_x_start": 160.0, "text_definitions": [{ "data_key": "main", "relative_pos": [12.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }] },
'lingjian': { "template_name": "标准物料清单-底部表头", "row_height": 12.0, "header_height": 12.0, "column_boundaries": [0.0, 20.0, 65.0, 95.0, 115.0, 130.0, 155.0, 180.0], "header_definition": { "lines": [{ "start": [0.0, 0.0], "end": [180.0, 0.0] }, { "start": [0.0, 0.0], "end": [0.0, 12.0] }, { "start": [20.0, 0.0], "end": [20.0, 12.0] }, { "start": [65.0, 0.0], "end": [65.0, 12.0] }, { "start": [95.0, 0.0], "end": [95.0, 12.0] }, { "start": [115.0, 0.0], "end": [115.0, 12.0] }, { "start": [130.0, 0.0], "end": [130.0, 12.0] }, { "start": [155.0, 0.0], "end": [155.0, 12.0] }, { "start": [180.0, 0.0], "end": [180.0, 12.0] }], "texts": [{ "content": "件 号", "relative_pos": [6.16, 6.25], "height": 3.5 }, { "content": "PART NO.", "relative_pos": [5.29, 1.89], "height": 2.0 }, { "content": "名 称", "relative_pos": [35.60, 6.25], "height": 3.5 }, { "content": "PARTS. NAME.", "relative_pos": [35.45, 1.89], "height": 2.0 }, { "content": "材 料", "relative_pos": [75.65, 6.25], "height": 3.5 }, { "content": "MAT'L", "relative_pos": [76.19, 1.89], "height": 2.0 }, { "content": "质量", "relative_pos": [98.70, 6.25], "height": 3.5 }, { "content": "(kg)", "relative_pos": [104.32, 6.25], "height": 3 }, { "content": "MASS", "relative_pos": [102.15, 1.89], "height": 2.0 }, { "content": "比 例", "relative_pos": [119.09, 6.25], "height": 3.5 }, { "content": "SCALE", "relative_pos": [119.04, 1.89], "height": 2.0 }, { "content": "所在图号", "relative_pos": [137.23, 6.25], "height": 3.5 }, { "content": "DWG. NO.", "relative_pos": [138.16, 1.89], "height": 2.0 }, { "content": "装配图号", "relative_pos": [162.59, 6.25], "height": 3.5 }, { "content": "ASSY. DWG. NO.", "relative_pos": [160.50, 1.89], "height": 2.0 }] }, "column_definitions": [{ "name": "件号", "relative_x_start": 0.0, "text_definitions": [{ "data_key": "main", "relative_pos": [7.5, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "名称", "relative_x_start": 20.0, "text_definitions": [{ "data_key": "chinese_name", "relative_pos": [2.0, 3.58], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "data_key": "english_name", "relative_pos": [2.0, 1.0], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "data_key": "specification", "relative_pos": [20.0, 4.1], "alignment": "BOTTOM_LEFT", "height": 3.0 }] }, { "name": "材料", "relative_x_start": 65.0, "text_definitions": [{ "data_key": "main", "relative_pos": [15.0, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }, { "data_key": "chinese_name", "relative_pos": [15.0, 3.58], "alignment": "BOTTOM_CENTER", "height": 3.5 }, { "data_key": "english_name", "relative_pos": [15.0, 1.0], "alignment": "BOTTOM_CENTER", "height": 2.0 }] }, { "name": "质量", "relative_x_start": 95.0, "text_definitions": [{ "data_key": "main", "relative_pos": [10.0, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "比例", "relative_x_start": 115.0, "text_definitions": [{ "data_key": "main", "relative_pos": [7.5, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "所在图号", "relative_x_start": 130.0, "text_definitions": [{ "data_key": "main", "relative_pos": [12.5, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "装配图号", "relative_x_start": 155.0, "text_definitions": [{ "data_key": "main", "relative_pos": [12.5, 2.17], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }] },
'lingjian_sub': { "template_name": "标准物料清单-底部表头", "row_height": 8.0, "header_height": 14.0, "column_boundaries": [0.0, 15.0, 45.0, 100.0, 110.0, 140.0, 150.0, 160.0, 180.0], "header_definition": { "lines": [{ "start": [0.0, 14.0], "end": [185.0, 14.0] }, { "start": [160.0, 6.5], "end": [140.0, 6.5] }, { "start": [110.0, 0.0], "end": [110.0, 14.0] }, { "start": [15.0, 14.0], "end": [15.0, 0.0] }, { "start": [45.0, 0.0], "end": [45.0, 14.0] }, { "start": [100.0, 0.0], "end": [100.0, 14.0] }, { "start": [140.0, 0.0], "end": [140.0, 14.0] }, { "start": [160.0, 0.0], "end": [160.0, 14.0] }, { "start": [150.0, 6.5], "end": [150.0, 14.0] }, { "start": [0.0, 0.0], "end": [185.0, 0.0] }, { "start": [180.0, 0.0], "end": [180.0, 14.0] }], "texts": [{ "content": "总", "relative_pos": [153.62, 10.23], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "单", "relative_pos": [143.79, 10.02], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "TOTAL", "relative_pos": [152.64, 7.45], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "SINGLE", "relative_pos": [141.89, 7.45], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "备 注", "relative_pos": [169.33, 6.8], "alignment": "BOTTOM_CENTER", "height": 3.5 }, { "content": "材 料", "relative_pos": [121.56, 6.56], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "数量", "relative_pos": [102.5, 6.56], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "名 称", "relative_pos": [67.3, 6.56], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "件 号", "relative_pos": [4.43, 6.56], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "图号或标准号", "relative_pos": [22.43, 6.53], "alignment": "BOTTOM_LEFT", "height": 3.5 }, { "content": "MAT'L", "relative_pos": [122.94, 2.33], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "QTY.", "relative_pos": [102.89, 2.33], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "REMARKS", "relative_pos": [165.48, 2.3], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "PARTS. NAME.", "relative_pos": [65.06, 1.76], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "DWG NO. OR STD. NO.", "relative_pos": [19.43, 1.76], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "PARTS .NO.", "relative_pos": [7.77, 1.76], "alignment": "BOTTOM_CENTER", "height": 2.0 }, { "content": "MASSkg", "relative_pos": [148.32, 1.7], "alignment": "BOTTOM_LEFT", "height": 2.0 }, { "content": "质量", "relative_pos": [142.49, 0.87], "alignment": "BOTTOM_LEFT", "height": 3.5 }] }, "column_definitions": [{ "name": "件 号", "relative_x_start": 0.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.82, 1.46], "alignment": "BOTTOM_LEFT", "height": 3.5 }] }, { "name": "图号或标准号", "relative_x_start": 15.0, "text_definitions": [{ "data_key": "main", "relative_pos": [14.77, 1.15], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "名 称", "relative_x_start": 45.0, "text_definitions": [{ "data_key": "chinese_name", "relative_pos": [1.76, 3.88], "height": 3.5 }, { "data_key": "english_name", "relative_pos": [1.79, 1.0], "height": 2.0 }, { "data_key": "specification", "relative_pos": [18.68, 3.9], "height": 3.0 }] }, { "name": "数量", "relative_x_start": 100.0, "text_definitions": [{ "data_key": "main", "relative_pos": [4.97, 1.37], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "材 料", "relative_x_start": 110.0, "text_definitions": [{ "data_key": "main", "relative_pos": [15.16, 1.12], "alignment": "BOTTOM_CENTER", "height": 3.5 }] }, { "name": "单", "relative_x_start": 140.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "总", "relative_x_start": 150.0, "text_definitions": [{ "data_key": "main", "relative_pos": [5.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }, { "name": "备 注", "relative_x_start": 160.0, "text_definitions": [{ "data_key": "main", "relative_pos": [10.06, 1.42], "alignment": "BOTTOM_CENTER", "height": 3.0 }] }] }
}
};
function App() {
const [drawings, setDrawings] = useState(initialData.drawings);
const [items, setItems] = useState(initialData.items);
const [tablePositions, setTablePositions] = useState(initialData.tablePositions);
const [selectedItemId, setSelectedItemId] = useState('__ROOT__');
const [drawings, setDrawings] = React.useState(initialData.drawings);
const [items, setItems] = React.useState(initialData.items);
const [tablePositions, setTablePositions] = React.useState(initialData.tablePositions);
const [templates, setTemplates] = React.useState(initialData.templates);
const [selectedItemId, setSelectedItemId] = React.useState('__ROOT__');
const [currentDrawingId, setCurrentDrawingId] = React.useState(null);
// 根据item层级决定使用哪个模板
const getTemplateForItem = (itemId) => {
if (!itemId) return null;
if (itemId === '__ROOT__') {
return templates.zongzhuang;
}
const depth = (itemId.match(/-/g) || []).length;
if (depth === 0) { // e.g. '1', '2' -> children of root are parts.
return templates.lingjian;
}
// e.g. '1-1', '1-2'
return templates.lingjian_sub;
};
// 自动计算重量的副作用钩子
useEffect(() => {
React.useEffect(() => {
const calculateWeight = (itemId) => {
const item = items[itemId];
if (!item) return 0;
@ -44,8 +164,8 @@ function App() {
return sum + calculateWeight(childId);
}, 0);
// 更新当前项的重量(如果是父项)
if (items[itemId].weight !== childrenWeight) {
// 更新当前项的重量(如果是父项)- 添加容差避免无限更新
if (Math.abs(items[itemId].weight - childrenWeight) > 0.001) {
setItems(prevItems => ({
...prevItems,
[itemId]: { ...prevItems[itemId], weight: childrenWeight }
@ -61,6 +181,48 @@ function App() {
}, [items]); // 依赖于 items 状态
// 件号到图纸的映射关系
const getDrawingForItem = (itemId) => {
const mapping = {
'__ROOT__': '图1', // 总装图 -> 图1
'1': '图2-1', // 件号1 -> 图2-1
'1-1': '图2-1', // 件号1-1 -> 图2-1
'1-2': '图2-2', // 件号1-2 -> 图2-2
'2': '图2-3', // 件号2 -> 图2-3
'2-1': '图2-4', // 件号2-1 -> 图2-4
'3': '图3-1', // 件号3 -> 图3-1
'3-1': '图3-2' // 件号3-1 -> 图3-2
};
// 如果有直接映射,使用映射;否则尝试解析件号寻找对应图纸
if (mapping[itemId]) {
return mapping[itemId];
}
// 对于新创建的件号,尝试根据层级推导对应图纸
if (itemId.includes('-')) {
const parts = itemId.split('-');
if (parts.length === 2) {
// 二级件号尝试找到对应的图2-x或图3-x系列
const base = parts[0];
if (base === '1') return '图2-1';
if (base === '2') return '图2-3';
if (base === '3') return '图3-1';
}
}
// 默认返回图1
return '图1';
};
// 根据选中的件号自动切换图纸显示
React.useEffect(() => {
const targetDrawingId = getDrawingForItem(selectedItemId);
if (currentDrawingId !== targetDrawingId) {
setCurrentDrawingId(targetDrawingId);
}
}, [selectedItemId, currentDrawingId]);
const handleItemRename = (oldId, newId) => {
if (oldId === '__ROOT__') {
alert('错误根节点“总装图”的ID不可修改。');
@ -148,65 +310,68 @@ function App() {
};
const handleCycleDrawing = (direction) => {
const drawingsInUse = [...new Set(Object.values(items).map(i => i.drawingId).filter(Boolean))];
if (drawingsInUse.length <= 1) return;
const currentDrawingId = items[selectedItemId]?.drawingId;
let currentIndex = drawingsInUse.indexOf(currentDrawingId);
if (currentIndex === -1) currentIndex = 0;
let nextIndex = currentIndex + direction;
if (nextIndex >= drawingsInUse.length) nextIndex = 0;
if (nextIndex < 0) nextIndex = drawingsInUse.length - 1;
const nextDrawingId = drawingsInUse[nextIndex];
// 找到第一个使用该图纸的 item 并选中它
const itemToSelect = Object.values(items).find(i => i.drawingId === nextDrawingId);
if (itemToSelect) {
setSelectedItemId(itemToSelect.id);
}
const ids = Object.keys(drawings);
if (ids.length === 0) return;
let idx = ids.indexOf(currentDrawingId || '');
if (idx === -1) idx = 0;
let next = idx + direction;
if (next >= ids.length) next = 0;
if (next < 0) next = ids.length - 1;
setCurrentDrawingId(ids[next]);
};
const handleItemUpdate = (newItemData) => {
const { id } = newItemData;
// 检查父节点是否存在
const parentId = id.includes('-') ? id.substring(0, id.lastIndexOf('-')) : null;
setItems(prevItems => {
const newItems = { ...prevItems };
// 如果父节点不存在,则创建
if (parentId && !newItems[parentId]) {
newItems[parentId] = {
const ensureAncestors = (itemsMap, targetId) => {
const parentId = targetId.includes('-') ? targetId.substring(0, targetId.lastIndexOf('-')) : '__ROOT__';
if (parentId === '__ROOT__') {
// 根一定存在
if (!itemsMap['__ROOT__']) {
itemsMap['__ROOT__'] = { id: '__ROOT__', name: '总装图', quantity: 1, weight: 0, drawingId: Object.keys(drawings)[0] || null, parentId: null, children: [] };
}
return '__ROOT__';
}
// 确保父存在
if (!itemsMap[parentId]) {
const grandParentId = parentId.includes('-') ? parentId.substring(0, parentId.lastIndexOf('-')) : '__ROOT__';
// 递归确保祖先
ensureAncestors(itemsMap, parentId);
itemsMap[parentId] = {
id: parentId,
name: `新建部件 ${parentId}`,
quantity: 1,
weight: 0,
drawingId: null, // 父项通常关联更高级别的图纸
parentId: parentId.includes('-') ? parentId.substring(0, parentId.lastIndexOf('-')) : null,
drawingId: null,
parentId: grandParentId,
children: []
};
// 将父加入祖父的 children
if (itemsMap[grandParentId] && !itemsMap[grandParentId].children.includes(parentId)) {
itemsMap[grandParentId].children = [...itemsMap[grandParentId].children, parentId];
}
// 更新或创建当前项
newItems[id] = { ...newItems[id], ...newItemData };
// 更新父节点的 children 列表
if (parentId && newItems[parentId] && !newItems[parentId].children.includes(id)) {
newItems[parentId] = {
...newItems[parentId],
children: [...newItems[parentId].children, id]
}
return parentId;
};
setItems(prevItems => {
const newItems = { ...prevItems };
// 确保祖先链存在
const parentId = ensureAncestors(newItems, id);
// 创建/更新当前项parentId 由我们统一设置)
const merged = { ...newItems[id], ...newItemData, parentId, children: newItems[id]?.children || [] };
newItems[id] = merged;
// 将当前项加入父的 children
if (parentId && newItems[parentId] && !newItems[parentId].children.includes(id)) {
newItems[parentId] = { ...newItems[parentId], children: [...newItems[parentId].children, id] };
}
return newItems;
});
// 选中新创建的项
setSelectedItemId(id);
};
@ -261,7 +426,57 @@ function App() {
const selectedItem = items[selectedItemId];
const currentDrawing = drawings[selectedItem?.drawingId];
const currentDrawing = currentDrawingId ? drawings[currentDrawingId] : undefined;
// 找到与当前图纸绑定的item用于右侧编辑区域显示
const currentDrawingItem = React.useMemo(() => {
if (!currentDrawingId) return selectedItem;
// 查找绑定了当前图纸的item
const boundItem = Object.values(items).find(item => item.drawingId === currentDrawingId);
return boundItem || selectedItem;
}, [currentDrawingId, items, selectedItem]);
// 使用与当前图纸绑定的item来选择模板
const currentTemplate = getTemplateForItem(currentDrawingItem?.id || selectedItemId);
const updateImagePosition = (drawingId, imageName, deltaX, deltaY) => {
setDrawings(prevDrawings => {
const newDrawings = { ...prevDrawings };
const drawing = newDrawings[drawingId];
if (!drawing) return prevDrawings;
// 更新图片的世界坐标
const updatedImages = drawing.images.map(img => {
if (img.name === imageName) {
const newCoords = img.coords.map(coord => ({
x: coord.x + deltaX,
y: coord.y + deltaY
}));
return { ...img, coords: newCoords };
}
return img;
});
// 重新计算drawing的边界
const allCoords = updatedImages.flatMap(img => img.coords);
const minX = Math.min(...allCoords.map(c => c.x));
const minY = Math.min(...allCoords.map(c => c.y));
const maxX = Math.max(...allCoords.map(c => c.x));
const maxY = Math.max(...allCoords.map(c => c.y));
newDrawings[drawingId] = {
...drawing,
images: updatedImages,
minX,
minY,
maxX,
maxY
};
return newDrawings;
});
};
return React.createElement('div', { className: 'flex h-screen bg-gray-100' },
React.createElement('aside', { className: 'w-[var(--sidebar-width)] bg-white p-4 border-r border-gray-200' },
@ -273,19 +488,21 @@ function App() {
React.createElement('div', { className: 'col-span-2' },
React.createElement(DrawingViewer, {
drawing: currentDrawing,
item: selectedItem,
item: currentDrawingItem,
items,
tablePositions,
setTablePositions,
drawings,
onItemUpdate: handleItemUpdate, // This is now for creating children, which is not used by the UI but kept for future.
template: currentTemplate,
onItemUpdate: handleItemUpdate,
onItemRename: handleItemRename,
onBindDrawing: bindDrawingToItem,
onCycleDrawing: handleCycleDrawing
onCycleDrawing: handleCycleDrawing,
onUpdateImagePosition: updateImagePosition
})
),
React.createElement('div', { className: 'col-span-1' },
React.createElement(DataEditor, { item: selectedItem, items, setItems })
React.createElement(DataEditor, { item: currentDrawingItem, items, setItems })
)
)
)

View File

@ -1,4 +1,4 @@
function DataEditor({ item, items, setItems, setRootNodeName }) {
function DataEditor({ item, items, setItems }) {
if (!item) {
return React.createElement('div', { className: 'workspace-panel flex items-center justify-center h-full' },
@ -6,11 +6,11 @@ function DataEditor({ item, items, setItems, setRootNodeName }) {
);
}
const isRoot = item.isRoot;
const isRoot = item.id === '__ROOT__';
if (isRoot) {
return React.createElement('div', { className: 'workspace-panel p-4 h-full' },
React.createElement('h2', { className: 'text-lg font-semibold mb-4' }, `编辑总装图`),
React.createElement('h2', { className: 'text-lg font-semibold mb-4' }, '编辑总装图'),
React.createElement('div', { className: 'space-y-4' },
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '总装图名称'),
@ -18,11 +18,14 @@ function DataEditor({ item, items, setItems, setRootNodeName }) {
type: 'text',
name: 'name',
value: item.name,
onChange: (e) => setRootNodeName(e.target.value),
onChange: (e) => setItems(prev => ({
...prev,
['__ROOT__']: { ...prev['__ROOT__'], name: e.target.value }
})),
className: 'form-input'
})
),
React.createElement('p', {className: 'text-xs text-gray-500 mt-1'}, '这是项目的根节点,只可修改名称。')
React.createElement('p', { className: 'text-xs text-gray-500 mt-1' }, '这是项目的根节点,只可修改名称。')
)
);
}
@ -31,19 +34,28 @@ function DataEditor({ item, items, setItems, setRootNodeName }) {
const { name, value } = e.target;
const isNumber = ['quantity', 'weight'].includes(name);
// 添加输入验证
if (isNumber && value !== '' && (isNaN(value) || Number(value) < 0)) {
console.warn('请输入有效的正数');
return;
}
setItems(prevItems => ({
...prevItems,
[item.id]: {
...prevItems[item.id],
[name]: isNumber ? Number(value) : value
[name]: isNumber ? (value === '' ? 0 : Number(value)) : value
}
}));
};
const isParent = item.children && item.children.length > 0;
const hasChildren = Array.isArray(item.children) && item.children.length > 0;
const isLeafPart = !isRoot && !hasChildren;
const isAssemblyPart = !isRoot && hasChildren;
return React.createElement('div', { className: 'workspace-panel p-4 h-full' },
React.createElement('h2', { className: 'text-lg font-semibold mb-4' }, `编辑: ${item.id}`),
React.createElement('h2', { className: 'text-lg font-semibold mb-1' }, `编辑: ${item.id}`),
React.createElement('p', { className: 'text-xs text-gray-500 mb-3' }, isLeafPart ? '类型:零件' : (isAssemblyPart ? '类型:装配件(含子件号)' : '')),
React.createElement('div', { className: 'space-y-4' },
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '件号 (不可修改)'),
@ -65,10 +77,84 @@ function DataEditor({ item, items, setItems, setRootNodeName }) {
value: item.weight,
onChange: handleInputChange,
className: 'form-input',
readOnly: isParent, // 如果是父项,重量由子项计算,不可直接编辑
title: isParent ? '父项重量由子项自动汇总' : ''
readOnly: hasChildren, // 装配件重量由子项计算
title: hasChildren ? '装配件重量由子项自动汇总' : ''
}),
isParent && React.createElement('p', {className: 'text-xs text-gray-500 mt-1'}, '父项重量由子项自动汇总,此处不可编辑。')
hasChildren && React.createElement('p', { className: 'text-xs text-gray-500 mt-1' }, '装配件重量由子项自动汇总,此处不可编辑。')
),
// 添加表格需要的额外字段
React.createElement('div', { className: 'grid grid-cols-2 gap-3' },
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '中文名称'),
React.createElement('input', {
type: 'text',
name: 'chinese_name',
value: item.chinese_name || '',
onChange: handleInputChange,
className: 'form-input',
placeholder: '零件中文名称'
})
),
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '英文名称'),
React.createElement('input', {
type: 'text',
name: 'english_name',
value: item.english_name || '',
onChange: handleInputChange,
className: 'form-input',
placeholder: 'English Name'
})
)
),
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '规格描述'),
React.createElement('input', {
type: 'text',
name: 'specification',
value: item.specification || '',
onChange: handleInputChange,
className: 'form-input',
placeholder: '零件规格和技术要求'
})
),
React.createElement('div', { className: 'grid grid-cols-2 gap-3' },
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '材料'),
React.createElement('input', {
type: 'text',
name: 'material',
value: item.material || '',
onChange: handleInputChange,
className: 'form-input',
placeholder: '如: Q235'
})
),
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '比例'),
React.createElement('input', {
type: 'text',
name: 'scale',
value: item.scale || '1:1',
onChange: handleInputChange,
className: 'form-input'
})
)
),
React.createElement('div', {},
React.createElement('label', { className: 'block text-sm font-medium text-gray-700 mb-1' }, '备注'),
React.createElement('textarea', {
name: 'remark',
value: item.remark || '',
onChange: handleInputChange,
className: 'form-input resize-none',
rows: 2,
placeholder: '其他说明信息'
})
)
)
);

View File

@ -1,66 +1,154 @@
const { useState, useEffect, useRef } = React;
// Use React.* APIs without destructuring to avoid global redeclaration conflicts
function DraggableTable({ drawingId, position, onPositionChange, children }) {
const tableRef = useRef(null);
const [isDragging, setIsDragging] = useState(false);
const [offset, setOffset] = useState({ x: 0, y: 0 });
const handleMouseDown = (e) => {
if (!tableRef.current) return;
setIsDragging(true);
const rect = tableRef.current.getBoundingClientRect();
setOffset({
x: e.clientX - rect.left,
y: e.clientY - rect.top,
});
e.preventDefault();
};
const handleMouseMove = (e) => {
if (!isDragging || !tableRef.current) return;
const parentRect = tableRef.current.parentElement.getBoundingClientRect();
// 计算新的 left 和 bottom
let newX = e.clientX - parentRect.left - offset.x;
let newY = parentRect.height - (e.clientY - parentRect.top) - tableRef.current.offsetHeight + offset.y;
// 边界检测
newX = Math.max(0, Math.min(newX, parentRect.width - tableRef.current.offsetWidth));
newY = Math.max(0, Math.min(newY, parentRect.height - tableRef.current.offsetHeight));
onPositionChange(drawingId, { x: newX, y: newY });
e.preventDefault();
};
const handleMouseUp = () => {
setIsDragging(false);
};
useEffect(() => {
if (isDragging) {
document.addEventListener('mousemove', handleMouseMove);
document.addEventListener('mouseup', handleMouseUp);
} else {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
// A helper function to create SVG text elements, handling the coordinate system flip.
function SvgText({ content, x, y, height, color = '#2563eb', alignment = 'BOTTOM_LEFT' }) {
const textAnchor = (alignment === 'BOTTOM_CENTER') ? 'middle' : (alignment === 'BOTTOM_RIGHT' ? 'end' : 'start');
// We apply a transform to flip the text right-side-up after the group's transform.
return React.createElement('text', {
x: x,
y: -y, // Y is flipped in the group, so we negate it here.
fontSize: height,
fill: color,
transform: 'scale(1, -1)', // Flip text back upright
textAnchor: textAnchor,
style: {
fontFamily: "'KaiTi', 'SimSun', sans-serif",
userSelect: 'none', // 禁用文字选择
pointerEvents: 'none' // 让文字不接收鼠标事件,事件将传递给父元素
}
return () => {
document.removeEventListener('mousemove', handleMouseMove);
document.removeEventListener('mouseup', handleMouseUp);
};
}, [isDragging, handleMouseMove, handleMouseUp]);
return React.createElement('div', {
ref: tableRef,
className: `absolute bg-white border border-gray-300 shadow-lg p-2 rounded-lg ${isDragging ? 'cursor-grabbing' : 'cursor-grab'}`,
style: { left: `${position.x}px`, bottom: `${position.y}px` },
onMouseDown: handleMouseDown
}, children);
}, content);
}
function DrawingViewer({ drawing, item, items, tablePositions, setTablePositions, drawings, onItemUpdate, onBindDrawing, onItemRename, onCycleDrawing }) {
function GraphicalTable({ template, items, allItems, drawings }) {
if (!template) return null;
const { header_height, row_height, header_definition, column_definitions, column_boundaries } = template;
const strokeColor = "#334155", strokeWidth = 0.3;
const normalize = (name) => (name || '').replace(/\s+/g, '').replace('名称', '名称').replace('件号', '件号').replace('材料', '材料').replace('备注', '备注');
const tableWidth = Math.max(...column_boundaries);
const totalRows = items.length;
const tableHeight = header_height + (totalRows * row_height);
return React.createElement('g', null,
// Outer highlighted border (does not change coordinates)
React.createElement('rect', {
x: 0,
y: 0,
width: tableWidth,
height: tableHeight,
fill: 'none',
stroke: '#2563eb',
strokeWidth: 1.5,
opacity: 0.95
}),
// Header
React.createElement('g', { className: 'table-header' },
header_definition.lines.map((line, i) => React.createElement('line', {
key: `h-line-${i}`,
x1: line.start[0],
y1: line.start[1],
x2: line.end[0],
y2: line.end[1],
stroke: strokeColor,
strokeWidth: strokeWidth,
})),
header_definition.texts.map((text, i) => React.createElement(SvgText, {
key: `h-text-${i}`,
content: text.content,
x: text.relative_pos[0],
y: text.relative_pos[1],
height: text.height,
alignment: text.alignment,
}))
),
// Body Rows
React.createElement('g', { className: 'table-body' },
items.map((item, rowIndex) => {
const rowY = header_height + (rowIndex * row_height);
return React.createElement('g', { key: `row-${item.id}`, transform: `translate(0, ${rowY})`},
// Render horizontal line for the row
React.createElement('line', {
x1: 0, y1: row_height, x2: tableWidth, y2: row_height,
stroke: strokeColor, strokeWidth: strokeWidth
}),
// Render cell data
column_definitions.map(colDef => {
const normName = normalize(colDef.name);
const cell = {
'件号': item.id,
'图号或标准号': drawings[item.drawingId]?.drawingNumber || '',
'名称': {
chinese_name: item.chinese_name || item.name || '',
english_name: item.english_name || '',
specification: item.specification || ''
},
'数量': item.quantity,
'单': (item.weight ?? 0).toFixed(2),
'总': ((item.quantity ?? 0) * (item.weight ?? 0)).toFixed(2),
'材料': item.material?.main || item.material || item.chinese_material || 'Q235',
'备注': item.remark || '',
'质量': (item.weight ?? 0).toFixed(2),
'比例': item.scale || '1:1',
'所在图号': item.dwgNo || drawings[item.drawingId]?.drawingNumber || '',
'装配图号': item.assyDwgNo || (allItems[item.parentId] ? (drawings[allItems[item.parentId]?.drawingId]?.drawingNumber || '') : '')
};
const dataItem = cell[normName];
return colDef.text_definitions.map(textDef => {
let content = '';
if (normName === '名称' && typeof dataItem === 'object' && dataItem !== null) {
content = dataItem[textDef.data_key] || '';
} else {
content = dataItem;
}
if (content === null || content === undefined) return null;
return React.createElement(SvgText, {
key: `${item.id}-${normName}-${textDef.data_key || 'main'}`,
content,
x: colDef.relative_x_start + textDef.relative_pos[0],
y: textDef.relative_pos[1],
height: textDef.height,
alignment: textDef.alignment,
});
});
})
);
}),
// Vertical lines
column_boundaries.map((xPos, i) => React.createElement('line', {
key: `v-line-${i}`,
x1: xPos, y1: 0, x2: xPos, y2: tableHeight,
stroke: strokeColor, strokeWidth: strokeWidth
}))
)
);
}
function DrawingViewer({ drawing, item, items, drawings, template, tablePositions, setTablePositions, onCycleDrawing, onItemRename, onItemUpdate, onBindDrawing, onUpdateImagePosition }) {
const isInClass = (node, className) => {
let el = node;
while (el && el !== viewerRef.current) {
// 检查CSS class
if (el.classList && el.classList.contains(className)) return true;
// 检查SVG元素的特殊属性
if (el.getAttribute && el.getAttribute('data-draggable') === className) return true;
// 检查className属性对于SVG元素
if (el.className && el.className.baseVal && el.className.baseVal.includes(className)) return true;
el = el.parentNode;
}
return false;
};
const [viewTransform, setViewTransform] = React.useState({ x: 0, y: 0, scale: 1 });
const [editedItemId, setEditedItemId] = React.useState('');
const [inputBox, setInputBox] = React.useState(null); // { x, y, drawingId, show: true }
const viewerRef = React.useRef(null);
const inputRef = React.useRef(null);
const isPanning = React.useRef(false);
const isDraggingTable = React.useRef(false);
const isDraggingImage = React.useRef(false);
const draggedImageName = React.useRef(null);
const lastMousePos = React.useRef({ x: 0, y: 0 });
React.useEffect(() => {
if (item) {
@ -68,6 +156,249 @@ function DrawingViewer({ drawing, item, items, tablePositions, setTablePositions
}
}, [item]);
React.useEffect(() => {
if (drawing && viewerRef.current) {
const container = viewerRef.current;
const containerWidth = container.offsetWidth;
const containerHeight = container.offsetHeight;
// Compute based on the actual rendered image bounding box
const img = drawing.images && drawing.images[0];
if (!img) return;
const contentX = img.coords[0].x;
const contentY = img.coords[0].y - img.height; // top-left y in SVG coords
const contentWidth = img.width;
const contentHeight = img.height;
if (contentWidth <= 0 || contentHeight <= 0) return;
const scaleX = containerWidth / contentWidth;
const scaleY = containerHeight / contentHeight;
const scale = Math.min(scaleX, scaleY) * 0.9;
const initialX = (containerWidth - contentWidth * scale) / 2 - contentX * scale;
const initialY = (containerHeight - contentHeight * scale) / 2 - contentY * scale;
setViewTransform({ x: initialX, y: initialY, scale });
}
// Reset input when switching drawing
setEditedItemId('');
}, [drawing]);
const handleCanvasClick = (e) => {
// Ignore clicks within UI overlays or existing input boxes
if (isInClass(e.target, 'ui-overlay') || isInClass(e.target, 'input-overlay')) return;
// 检查是否点击了表格或图片(这些不应该触发添加件号)
if (isInClass(e.target, 'graphical-table') || isInClass(e.target, 'draggable-image')) {
return;
}
// 点击空白区域,显示输入框
const rect = viewerRef.current.getBoundingClientRect();
const svgX = (e.clientX - rect.left - viewTransform.x) / viewTransform.scale;
const svgY = (e.clientY - rect.top - viewTransform.y) / viewTransform.scale;
setInputBox({
x: e.clientX - rect.left,
y: e.clientY - rect.top,
svgX: svgX,
svgY: svgY,
drawingId: drawing?.id,
show: true
});
e.stopPropagation();
};
const handleMouseDown = (e) => {
// Ignore clicks within UI overlays
if (isInClass(e.target, 'ui-overlay') || isInClass(e.target, 'input-overlay')) return;
// 重置所有拖拽状态
isPanning.current = false;
isDraggingTable.current = false;
isDraggingImage.current = false;
draggedImageName.current = null;
// 检查是否点击了表格
if (isInClass(e.target, 'graphical-table')) {
isDraggingTable.current = true;
lastMousePos.current = { x: e.clientX, y: e.clientY };
viewerRef.current.style.cursor = 'move';
console.log('开始拖拽表格');
e.stopPropagation();
e.preventDefault();
return;
}
// 检查是否点击了图片
if (isInClass(e.target, 'draggable-image')) {
isDraggingImage.current = true;
draggedImageName.current = e.target.getAttribute('data-image-name');
lastMousePos.current = { x: e.clientX, y: e.clientY };
viewerRef.current.style.cursor = 'move';
console.log('开始拖拽图片:', draggedImageName.current);
e.stopPropagation();
e.preventDefault();
return;
}
// 否则开始画布平移
isPanning.current = true;
lastMousePos.current = { x: e.clientX, y: e.clientY };
viewerRef.current.style.cursor = 'grabbing';
e.preventDefault();
};
const handleMouseMove = (e) => {
if (!isPanning.current && !isDraggingTable.current && !isDraggingImage.current) return;
const dx = (e.clientX - lastMousePos.current.x);
const dy = (e.clientY - lastMousePos.current.y);
if (isDraggingTable.current) {
console.log('正在拖拽表格', dx, dy);
const tableId = drawing.id;
const defaultPos = (() => {
const img = drawing.images && drawing.images[0];
const width = template ? Math.max(...template.column_boundaries) : 0;
if (img) {
return { x: img.coords[0].x + img.width - width - 10, y: img.coords[0].y - 10 };
}
return { x: drawing.maxX - width, y: drawing.minY };
})();
const currentPos = tablePositions[tableId] || defaultPos;
const newPos = {
x: currentPos.x + (dx / viewTransform.scale),
y: currentPos.y - (dy / viewTransform.scale) // Y is inverted in SVG coords
};
console.log('表格新位置:', newPos);
setTablePositions(prev => ({
...prev,
[tableId]: newPos
}));
} else if (isDraggingImage.current && draggedImageName.current && onUpdateImagePosition) {
// 图片拖拽:直接修改世界坐标
const worldDx = dx / viewTransform.scale;
const worldDy = -dy / viewTransform.scale; // Y 在SVG中是反向的
onUpdateImagePosition(drawing.id, draggedImageName.current, worldDx, worldDy);
} else if(isPanning.current) {
setViewTransform(prev => ({ ...prev, x: prev.x + dx, y: prev.y + dy }));
}
lastMousePos.current = { x: e.clientX, y: e.clientY };
};
const handleMouseUp = (e) => {
if (isDraggingTable.current) {
console.log('停止拖拽表格');
}
isPanning.current = false;
isDraggingTable.current = false;
isDraggingImage.current = false;
draggedImageName.current = null;
if (viewerRef.current) {
viewerRef.current.style.cursor = 'grab';
}
};
const handleRenameItem = () => {
if (!editedItemId.trim() || editedItemId.trim() === item.id) return;
onItemRename(item.id, editedItemId.trim());
};
const handleCreateUnderRoot = () => {
const id = (editedItemId || '').trim();
if (!id) return;
onItemUpdate({
id,
name: `新建部件 ${id}`,
quantity: 1,
weight: 0,
drawingId: drawing ? drawing.id : null,
parentId: '__ROOT__',
children: []
});
setEditedItemId('');
};
const handleInputBoxSubmit = (newItemId) => {
if (!newItemId.trim() || !inputBox) return;
const trimmedId = newItemId.trim();
// 创建新件号
onItemUpdate({
id: trimmedId,
name: `新建部件 ${trimmedId}`,
quantity: 1,
weight: 0,
drawingId: inputBox.drawingId,
parentId: item?.id || '__ROOT__',
children: [],
// 保存件号标记的位置
markerPosition: {
svgX: inputBox.svgX,
svgY: inputBox.svgY
}
});
// 关闭输入框
setInputBox(null);
};
const handleInputBoxCancel = () => {
setInputBox(null);
};
// 自动聚焦输入框
React.useEffect(() => {
if (inputBox && inputRef.current) {
inputRef.current.focus();
}
}, [inputBox]);
const handleZoom = (factor, centerX, centerY) => {
setViewTransform(prev => {
const newScale = prev.scale * factor;
const dx = (centerX - prev.x) * (1 - factor);
const dy = (centerY - prev.y) * (1 - factor);
return { scale: newScale, x: prev.x + dx, y: prev.y + dy };
});
};
const handleWheel = (e) => {
e.preventDefault();
const rect = viewerRef.current.getBoundingClientRect();
const factor = e.deltaY > 0 ? 1 / 1.1 : 1.1;
handleZoom(factor, e.clientX - rect.left, e.clientY - rect.top);
};
React.useEffect(() => {
const viewer = viewerRef.current;
if (viewer) {
const opts = { passive: false };
viewer.addEventListener('pointerdown', handleMouseDown, opts);
viewer.addEventListener('click', handleCanvasClick, opts);
document.addEventListener('pointermove', handleMouseMove, opts);
document.addEventListener('pointerup', handleMouseUp, opts);
viewer.addEventListener('wheel', handleWheel, opts);
}
return () => {
if (viewer) {
viewer.removeEventListener('pointerdown', handleMouseDown);
viewer.removeEventListener('click', handleCanvasClick);
document.removeEventListener('pointermove', handleMouseMove);
document.removeEventListener('pointerup', handleMouseUp);
viewer.removeEventListener('wheel', handleWheel);
}
};
}, []);
if (!item) {
return React.createElement('div', { className: 'workspace-panel flex items-center justify-center h-full' },
React.createElement('p', { className: 'text-gray-500' }, '请在左侧选择一个件号')
@ -77,79 +408,169 @@ function DrawingViewer({ drawing, item, items, tablePositions, setTablePositions
if (!drawing) {
return React.createElement('div', { className: 'workspace-panel flex flex-col items-center justify-center h-full' },
React.createElement('p', { className: 'text-gray-500 mb-4' }, `件号 "${item.id}" 尚未绑定图纸`),
// 假设我们总是可以绑定到一张默认图纸上,或者需要一个图纸选择器
// 这里为了简化,我们假设绑定到 'drawing-1'
React.createElement('button', {
className: 'btn-primary',
onClick: () => onBindDrawing(item.id, 'drawing-1')
}, '为此件号绑定图纸')
);
}
const tablePos = tablePositions[drawing.id] || { x: 50, y: 50 };
// 首先定义 isRoot 变量
const isRoot = item && item.id === '__ROOT__';
// 获取子项
const childItems = item.children.map(childId => items[childId]);
// 根据当前选中的item决定要显示的数据
// 如果是根节点,显示第一层子节点;否则显示当前节点的子节点
const displayItems = isRoot
? Object.values(items).filter(it => it.parentId === '__ROOT__')
: [item]; // 对于非根节点,显示自身信息
const tableWidth = template ? Math.max(...template.column_boundaries) : 0;
const handleRenameItem = () => {
if (!editedItemId.trim() || editedItemId.trim() === item.id) return;
onItemRename(item.id, editedItemId.trim());
};
// Use position from state, or default to bottom-right
let tablePos = tablePositions[drawing.id];
if (!tablePos) {
const img = drawing.images && drawing.images[0];
if (img) {
const safeX = img.coords[0].x + img.width - tableWidth - 10;
const safeY = img.coords[0].y - 10;
tablePos = { x: safeX, y: safeY };
} else {
tablePos = { x: drawing.maxX - tableWidth, y: drawing.minY };
}
}
const isRoot = item && item.isRoot;
return React.createElement('div', { className: 'workspace-panel h-full p-4 relative bg-gray-50 overflow-hidden' },
!isRoot && React.createElement('div', { className: 'absolute top-4 left-4 z-10 bg-white p-2 rounded-lg shadow-md flex items-center gap-2' },
React.createElement('span', { className: 'text-sm font-medium mr-2' }, '修改件号:'),
React.createElement('input', {
type: 'text',
placeholder: '输入新件号',
className: 'form-input w-48',
value: editedItemId,
onChange: (e) => setEditedItemId(e.target.value),
onBlur: handleRenameItem, // 失去焦点时也触发
onKeyPress: (e) => { if (e.key === 'Enter') handleRenameItem() } // 回车触发
}),
React.createElement('button', { className: 'btn-primary', onClick: handleRenameItem }, '确认')
),
React.createElement('button', {
className: 'absolute left-4 top-1/2 -translate-y-1/2 z-10 p-3 bg-white/60 rounded-full hover:bg-white transition-colors shadow-md',
onClick: () => onCycleDrawing(-1)
}, React.createElement('i', { className: 'lucide lucide-chevron-left w-8 h-8' })),
React.createElement('button', {
className: 'absolute right-4 top-1/2 -translate-y-1/2 z-10 p-3 bg-white/60 rounded-full hover:bg-white transition-colors shadow-md',
onClick: () => onCycleDrawing(1)
}, React.createElement('i', { className: 'lucide lucide-chevron-right w-8 h-8' })),
drawing.url ?
React.createElement('img', { src: drawing.url, className: 'w-full h-full object-contain' }) :
React.createElement('div', { className: 'absolute inset-0 flex items-center justify-center' },
React.createElement('h2', {className: 'text-9xl font-bold text-gray-200 select-none'}, drawing.drawingNumber)
),
React.createElement(DraggableTable, {
drawingId: drawing.id,
position: tablePos,
onPositionChange: (drawingId, newPos) => {
setTablePositions(prev => ({...prev, [drawingId]: newPos}))
return React.createElement('div', { className: 'workspace-panel h-full relative bg-gray-50 overflow-hidden', ref: viewerRef, style: { cursor: 'grab', touchAction: 'none' } },
// 动态输入框 - 点击图片时出现
inputBox && React.createElement('div', {
className: 'absolute z-20 input-overlay',
style: {
left: inputBox.x - 50,
top: inputBox.y - 15,
transform: 'translate(-50%, -50%)'
}
},
React.createElement('table', { className: 'w-full text-sm text-left' },
React.createElement('thead', {},
React.createElement('tr', { className: 'bg-gray-100' },
React.createElement('th', {className: 'p-2'}, '件号'),
React.createElement('th', {className: 'p-2'}, '名称'),
React.createElement('th', {className: 'p-2'}, '数量'),
React.createElement('th', {className: 'p-2'}, '重量'),
React.createElement('th', {className: 'p-2'}, '图号')
React.createElement('div', { className: 'bg-white p-2 rounded shadow-lg border flex items-center gap-2' },
React.createElement('input', {
ref: inputRef,
type: 'text',
placeholder: '输入件号',
className: 'form-input w-24 text-sm py-1 px-2',
onKeyDown: (e) => {
if (e.key === 'Enter') {
handleInputBoxSubmit(e.target.value);
} else if (e.key === 'Escape') {
handleInputBoxCancel();
}
e.stopPropagation();
},
onClick: (e) => e.stopPropagation(),
onBlur: () => setTimeout(() => setInputBox(null), 200) // 延迟关闭,允许用户点击确认
}),
React.createElement('button', {
className: 'bg-blue-500 text-white px-2 py-1 text-xs rounded hover:bg-blue-600',
onClick: (e) => {
handleInputBoxSubmit(inputRef.current.value);
e.stopPropagation();
}
}, '确认')
)
),
React.createElement('tbody', {},
childItems.map(child => React.createElement('tr', { key: child.id, className: 'border-b' },
React.createElement('td', {className: 'p-2'}, child.id),
React.createElement('td', {className: 'p-2'}, child.name),
React.createElement('td', {className: 'p-2'}, child.quantity),
React.createElement('td', {className: 'p-2'}, child.weight.toFixed(2)),
React.createElement('td', {className: 'p-2'}, drawings[child.drawingId]?.drawingNumber || 'N/A')
))
// 左上:输入区(阻止事件冒泡,避免影响拖拽/缩放)
React.createElement('div', { className: 'absolute top-4 left-4 z-10 ui-overlay' },
React.createElement('div', { className: 'bg-white p-2 rounded-lg shadow-md flex items-center gap-2' },
React.createElement('span', { className: 'text-sm font-medium mr-2' }, '设置图片件号:'),
React.createElement('input', {
type: 'text',
placeholder: '输入件号,存在则绑定,不存在则创建',
className: 'form-input w-64',
value: editedItemId,
onChange: (e) => setEditedItemId(e.target.value),
onKeyDown: (e) => { if (e.key === 'Enter') (items[editedItemId] ? onBindDrawing(editedItemId, drawing.id) : handleCreateUnderRoot()); }
}),
React.createElement('button', { className: 'btn-primary', onClick: () => (items[editedItemId] ? onBindDrawing(editedItemId, drawing.id) : handleCreateUnderRoot()) }, '绑定')
)
),
// 右上:缩放按钮(内联 SVG
React.createElement('div', { className: 'absolute top-4 right-4 z-10 bg-white p-1 rounded-lg shadow-md flex flex-col items-center gap-1 ui-overlay' },
React.createElement('button', { className: 'p-2 hover:bg-gray-100 rounded', onClick: () => handleZoom(1.2, viewerRef.current.offsetWidth/2, viewerRef.current.offsetHeight/2) },
React.createElement('svg', { width: 20, height: 20, viewBox: '0 0 24 24', fill: 'none', stroke: '#1f2937', strokeWidth: 2 },
React.createElement('circle', { cx: 11, cy: 11, r: 7 }),
React.createElement('line', { x1: 21, y1: 21, x2: 16.65, y2: 16.65 }),
React.createElement('line', { x1: 11, y1: 8, x2: 11, y2: 14 }),
React.createElement('line', { x1: 8, y1: 11, x2: 14, y2: 11 })
)
),
React.createElement('button', { className: 'p-2 hover:bg-gray-100 rounded', onClick: () => handleZoom(1 / 1.2, viewerRef.current.offsetWidth/2, viewerRef.current.offsetHeight/2) },
React.createElement('svg', { width: 20, height: 20, viewBox: '0 0 24 24', fill: 'none', stroke: '#1f2937', strokeWidth: 2 },
React.createElement('circle', { cx: 11, cy: 11, r: 7 }),
React.createElement('line', { x1: 21, y1: 21, x2: 16.65, y2: 16.65 }),
React.createElement('line', { x1: 8, y1: 11, x2: 14, y2: 11 })
)
)
),
// 左右切换按钮(内联 SVG
React.createElement('button', {
className: 'absolute left-4 top-1/2 -translate-y-1/2 z-10 p-3 bg-white/60 rounded-full hover:bg-white transition-colors shadow-md',
onClick: () => onCycleDrawing(-1),
onMouseDown: (e) => e.stopPropagation()
},
React.createElement('svg', { width: 28, height: 28, viewBox: '0 0 24 24', fill: 'none', stroke: '#1f2937', strokeWidth: 2 },
React.createElement('polyline', { points: '15 18 9 12 15 6' })
)
),
React.createElement('button', {
className: 'absolute right-4 top-1/2 -translate-y-1/2 z-10 p-3 bg-white/60 rounded-full hover:bg-white transition-colors shadow-md',
onClick: () => onCycleDrawing(1),
onMouseDown: (e) => e.stopPropagation()
},
React.createElement('svg', { width: 28, height: 28, viewBox: '0 0 24 24', fill: 'none', stroke: '#1f2937', strokeWidth: 2 },
React.createElement('polyline', { points: '9 18 15 12 9 6' })
)
),
// SVG Canvas
React.createElement('svg', { width: '100%', height: '100%'},
React.createElement('g', { transform: `translate(${viewTransform.x}, ${viewTransform.y}) scale(${viewTransform.scale})` },
// Images
drawing.images.map(img => React.createElement('image', {
key: img.name,
className: 'draggable-image',
href: img.url,
x: img.coords[0].x,
y: img.coords[0].y - img.height, // SVG y starts from top, our coords from bottom
width: img.width,
height: img.height,
'data-image-name': img.name,
'data-draggable': 'draggable-image',
style: { cursor: 'move' },
onError: (e) => {
console.warn(`图片加载失败: ${img.url}`);
// 可以设置一个默认的占位符
e.target.style.opacity = '0.3';
e.target.style.fill = '#f3f4f6';
}
})),
// Graphical Table - 当件号绑定了图纸时渲染(包括根节点总装图)
template && item && item.drawingId && drawing && drawing.id === item.drawingId && React.createElement('g', {
className: 'graphical-table',
transform: `translate(${tablePos.x}, ${tablePos.y}) scale(1, -1)`,
style: { cursor: 'move' },
'data-draggable': 'graphical-table'
},
// 背景矩形 - 提供拖拽区域和视觉反馈
React.createElement('rect', {
x: -5,
y: -5,
width: Math.max(...template.column_boundaries) + 10,
height: template.header_height + (displayItems.length * template.row_height) + 10,
fill: 'rgba(37, 99, 235, 0.05)', // 轻微的蓝色背景
stroke: 'rgba(37, 99, 235, 0.2)',
strokeWidth: 1,
rx: 3, // 圆角
pointerEvents: 'all',
'data-draggable': 'graphical-table',
style: { cursor: 'move' }
}),
// 表格内容
React.createElement(GraphicalTable, { template, items: displayItems, allItems: items, drawings })
)
)
)

View File

@ -0,0 +1,88 @@
# 开发过程总结与技术参考
本文档总结了 "图纸工作台" 产品原型的开发过程,旨在为后续的开发和维护提供参考。
## 1. 初始需求
项目初期,用户提出了一个三栏布局的图纸编辑平台原型需求:
* **左侧 (层级结构):** 展示和管理件号的层级关系。
* **中间 (图纸与表格):** 展示固定的图纸背景,并叠加可拖拽的数据表格。表格内容根据当前选中的件号动态展示其子项信息。
* **右侧 (数据编辑):** 提供表单,用于编辑选中件号的属性(名称、数量、重量等)。
**核心交互逻辑:**
1. **数据联动:** 子项数据的变更(如重量)需要自动汇总到所有父项。
2. **层级管理:** 支持通过输入件号来创建或修改层级关系。
3. **图纸关联:** 支持将件号与特定的图纸进行绑定。
4. **操作:** 提供数据校验保存和模拟导出 DXF 文件的功能。
## 2. 技术架构
* **前端框架:** 采用 **React** (通过 CDN 引入) 进行组件化开发,未使用 JSX直接使用 `React.createElement`
* **状态管理:** 所有应用级别的状态(如图纸、件号、表格位置等)都集中在主组件 `App.js` 中进行统一管理,通过 props 和回调函数的形式传递给子组件。
* **组件划分:**
* `App.js`: 主应用组件,负责状态管理和核心逻辑。
* `Header.js`: 顶部栏,包含标题和操作按钮(保存、导出)。
* `StructureTree.js`: 左侧层级树视图。
* `DrawingViewer.js`: 中间图纸和表格预览区。
* `DataEditor.js`: 右侧数据编辑表单。
* **数据结构:**
* **items:** 一个以件号ID为key的对象存储所有件号的详细信息 (`id`, `name`, `parentId`, `children`, `drawingId` 等)。
* **drawings:** 一个以图纸ID为key的对象存储图纸信息 (`id`, `name`, `url` 等)。
* **tablePositions:** 存储可拖拽表格相对于其图纸的位置。
## 3. 功能实现与迭代
### 3.1. 基础功能搭建
按照初始需求,我们首先搭建了应用的静态界面和基础数据流。
* 实现了 `StructureTree`, `DrawingViewer`, `DataEditor` 的基本渲染。
* 在 `App.js` 中利用 `useEffect` 实现了父项重量根据子项自动汇总计算的逻辑。
### 3.2. 核心交互实现
* **表格拖拽:**`DrawingViewer` 中实现了一个 `DraggableTable` 组件,通过原生 `mousedown`, `mousemove`, `mouseup` 事件处理拖拽逻辑,并更新表格位置状态。
* **动态创建件号:** 最初,中间视图的输入框用于创建新的子件号。
### 3.3. 需求迭代与重构
在开发过程中,根据用户的反馈进行了几次重要的逻辑调整和重构。
**迭代1: “创建”逻辑变更为“修改”**
* **需求:** 用户反馈中间视图的输入框应为**修改当前件号**,而非创建子件号。
* **实现:**
* 在 `app.js` 中创建了核心的 `handleItemRename` 函数。
* 该函数负责处理复杂的重命名和移动逻辑:
1. 从旧父项的 `children` 列表中移除。
2. 根据新的ID解析出新的 `parentId`
3. **递归地更新所有子孙件号的ID和 `parentId`**以保持层级ID的一致性例如`1-1` 重命名为 `3`,其子 `1-1-1` 会自动变为 `3-1`)。
4. 将自身添加到新父项的 `children` 列表中,如果新父项不存在则自动创建。
**迭代2: “总装图”根节点的演进**
这是整个开发过程中最核心的重构。
* **初始需求:** 在结构树顶部增加一个不可修改的“总装图”节点。
* **第一版实现 (虚拟容器):** 为了解决顶级件号(如 `1`, `2`的前缀问题将“总装图”实现为一个UI上的虚拟节点数据层面顶级件号的 `parentId``null`
* **问题:** 用户指出**“总装图”本身也应该是一张独立的、可绑定的图纸**,是一个真实的节点。虚拟容器方案不符合此要求。
* **最终实现 (实体根节点):**
1. 在数据模型中重新引入一个ID为 `__ROOT__` 的实体Item作为“总装图”。
2. 所有顶级件号的 `parentId` 都明确指向 `__ROOT__`
3. **重写 `handleItemRename` 逻辑**,规定任何不含 `-` 的件号(如 `3`)的父级都自动归属于 `__ROOT__`。这从根本上解决了顶级件号的归属问题同时保持了ID的简洁性。
4. UI上对 `__ROOT__` 节点进行特殊处理允许其名称可编辑但ID不可修改。
**迭代3: UI 优化**
* **总装图编辑:** 允许用户在右侧 `DataEditor` 中编辑“总装图”的名称。
* **切换按钮:** 增大了图纸区域左右切换箭头的尺寸,提升了可用性。
## 4. 最终功能概览
* **实体根节点:** “总装图”是一个功能完整的根节点可编辑名称、绑定图纸但ID和层级位置不可变。
* **层级管理:** 支持通过修改件号ID来自由地重命名和移动节点及其所有子孙节点。
* **数据联动:** 重量自动汇总。
* **视图交互:** 图纸可切换,表格可拖拽。
* **完整操作:** 支持数据校验保存和模拟导出。

View File

@ -11,11 +11,13 @@
<meta name="twitter:title" content="图纸工作台 - 切分识别与编辑系统">
<meta name="twitter:description" content="专业的图纸切分识别与编辑工作台,支持层级结构管理和数据编辑">
<script src="https://resource.trickle.so/vendor_lib/unpkg/react@18/umd/react.production.min.js"></script>
<script src="https://resource.trickle.so/vendor_lib/unpkg/react-dom@18/umd/react-dom.production.min.js"></script>
<script src="https://resource.trickle.so/vendor_lib/unpkg/@babel/standalone/babel.min.js"></script>
<!-- Switched to local vendor files for reliability -->
<script src="vendor/react.production.min.js"></script>
<script src="vendor/react-dom.production.min.js"></script>
<!-- Removed Babel: not needed since scripts are plain JS (no JSX) -->
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://resource.trickle.so/vendor_lib/unpkg/lucide-static@0.516.0/font/lucide.css" rel="stylesheet">
<link href="vendor/lucide.css" rel="stylesheet">
<style type="text/tailwindcss">
@layer theme {
@ -85,11 +87,11 @@
<body>
<div id="root"></div>
<script type="text/babel" src="components/Header.js"></script>
<script type="text/babel" src="components/StructureTree.js"></script>
<script type="text/babel" src="components/DrawingViewer.js"></script>
<script type="text/babel" src="components/DataEditor.js"></script>
<script type="text/babel" src="utils/dragUtils.js"></script>
<script type="text/babel" src="app.js"></script>
<script type="text/javascript" src="components/Header.js"></script>
<script type="text/javascript" src="components/StructureTree.js"></script>
<script type="text/javascript" src="components/DrawingViewer.js"></script>
<script type="text/javascript" src="components/DataEditor.js"></script>
<script type="text/javascript" src="utils/dragUtils.js"></script>
<script type="text/javascript" src="app.js"></script>
</body>
</html>

4
vendor/babel.min.js vendored Normal file

File diff suppressed because one or more lines are too long

1656
vendor/lucide.css vendored Normal file

File diff suppressed because it is too large Load Diff

267
vendor/react-dom.production.min.js vendored Normal file
View File

@ -0,0 +1,267 @@
/**
* @license React
* react-dom.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
(function(){/*
Modernizr 3.0.0pre (Custom Build) | MIT
*/
'use strict';(function(Q,zb){"object"===typeof exports&&"undefined"!==typeof module?zb(exports,require("react")):"function"===typeof define&&define.amd?define(["exports","react"],zb):(Q=Q||self,zb(Q.ReactDOM={},Q.React))})(this,function(Q,zb){function m(a){for(var b="https://reactjs.org/docs/error-decoder.html?invariant="+a,c=1;c<arguments.length;c++)b+="&args[]="+encodeURIComponent(arguments[c]);return"Minified React error #"+a+"; visit "+b+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}
function mb(a,b){Ab(a,b);Ab(a+"Capture",b)}function Ab(a,b){$b[a]=b;for(a=0;a<b.length;a++)cg.add(b[a])}function bj(a){if(Zd.call(dg,a))return!0;if(Zd.call(eg,a))return!1;if(cj.test(a))return dg[a]=!0;eg[a]=!0;return!1}function dj(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case "function":case "symbol":return!0;case "boolean":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return"data-"!==a&&"aria-"!==a;default:return!1}}function ej(a,b,c,d){if(null===
b||"undefined"===typeof b||dj(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function Y(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}function $d(a,b,c,d){var e=R.hasOwnProperty(b)?R[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||"o"!==
b[0]&&"O"!==b[0]||"n"!==b[1]&&"N"!==b[1])ej(b,c,e,d)&&(c=null),d||null===e?bj(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,""+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:"":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?"":""+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}function ac(a){if(null===a||"object"!==typeof a)return null;a=fg&&a[fg]||a["@@iterator"];return"function"===typeof a?a:null}function bc(a,b,
c){if(void 0===ae)try{throw Error();}catch(d){ae=(b=d.stack.trim().match(/\n( *(at )?)/))&&b[1]||""}return"\n"+ae+a}function be(a,b){if(!a||ce)return"";ce=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,"props",{set:function(){throw Error();}}),"object"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(n){var d=n}Reflect.construct(a,[],b)}else{try{b.call()}catch(n){d=n}a.call(b.prototype)}else{try{throw Error();
}catch(n){d=n}a()}}catch(n){if(n&&d&&"string"===typeof n.stack){for(var e=n.stack.split("\n"),f=d.stack.split("\n"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k="\n"+e[g].replace(" at new "," at ");a.displayName&&k.includes("<anonymous>")&&(k=k.replace("<anonymous>",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{ce=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:"")?bc(a):
""}function fj(a){switch(a.tag){case 5:return bc(a.type);case 16:return bc("Lazy");case 13:return bc("Suspense");case 19:return bc("SuspenseList");case 0:case 2:case 15:return a=be(a.type,!1),a;case 11:return a=be(a.type.render,!1),a;case 1:return a=be(a.type,!0),a;default:return""}}function de(a){if(null==a)return null;if("function"===typeof a)return a.displayName||a.name||null;if("string"===typeof a)return a;switch(a){case Bb:return"Fragment";case Cb:return"Portal";case ee:return"Profiler";case fe:return"StrictMode";
case ge:return"Suspense";case he:return"SuspenseList"}if("object"===typeof a)switch(a.$$typeof){case gg:return(a.displayName||"Context")+".Consumer";case hg:return(a._context.displayName||"Context")+".Provider";case ie:var b=a.render;a=a.displayName;a||(a=b.displayName||b.name||"",a=""!==a?"ForwardRef("+a+")":"ForwardRef");return a;case je:return b=a.displayName||null,null!==b?b:de(a.type)||"Memo";case Ta:b=a._payload;a=a._init;try{return de(a(b))}catch(c){}}return null}function gj(a){var b=a.type;
switch(a.tag){case 24:return"Cache";case 9:return(b.displayName||"Context")+".Consumer";case 10:return(b._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return a=b.render,a=a.displayName||a.name||"",b.displayName||(""!==a?"ForwardRef("+a+")":"ForwardRef");case 7:return"Fragment";case 5:return b;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return de(b);case 8:return b===fe?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";
case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if("function"===typeof b)return b.displayName||b.name||null;if("string"===typeof b)return b}return null}function Ua(a){switch(typeof a){case "boolean":case "number":case "string":case "undefined":return a;case "object":return a;default:return""}}function ig(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===
b)}function hj(a){var b=ig(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"undefined"!==typeof c&&"function"===typeof c.get&&"function"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=""+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=
null;delete a[b]}}}}function Pc(a){a._valueTracker||(a._valueTracker=hj(a))}function jg(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=ig(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Qc(a){a=a||("undefined"!==typeof document?document:void 0);if("undefined"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ke(a,b){var c=b.checked;return E({},b,{defaultChecked:void 0,defaultValue:void 0,
value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function kg(a,b){var c=null==b.defaultValue?"":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Ua(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}}function lg(a,b){b=b.checked;null!=b&&$d(a,"checked",b,!1)}function le(a,b){lg(a,b);var c=Ua(b.value),d=b.type;if(null!=c)if("number"===d){if(0===c&&""===a.value||a.value!=
c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else if("submit"===d||"reset"===d){a.removeAttribute("value");return}b.hasOwnProperty("value")?me(a,b.type,c):b.hasOwnProperty("defaultValue")&&me(a,b.type,Ua(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}function mg(a,b,c){if(b.hasOwnProperty("value")||b.hasOwnProperty("defaultValue")){var d=b.type;if(!("submit"!==d&&"reset"!==d||void 0!==b.value&&null!==b.value))return;b=""+a._wrapperState.initialValue;
c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;""!==c&&(a.name="");a.defaultChecked=!!a._wrapperState.initialChecked;""!==c&&(a.name=c)}function me(a,b,c){if("number"!==b||Qc(a.ownerDocument)!==a)null==c?a.defaultValue=""+a._wrapperState.initialValue:a.defaultValue!==""+c&&(a.defaultValue=""+c)}function Db(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b["$"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty("$"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=
!0)}else{c=""+Ua(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}function ne(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(m(91));return E({},b,{value:void 0,defaultValue:void 0,children:""+a._wrapperState.initialValue})}function ng(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(m(92));if(cc(c)){if(1<c.length)throw Error(m(93));
c=c[0]}b=c}null==b&&(b="");c=b}a._wrapperState={initialValue:Ua(c)}}function og(a,b){var c=Ua(b.value),d=Ua(b.defaultValue);null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=""+d)}function pg(a,b){b=a.textContent;b===a._wrapperState.initialValue&&""!==b&&null!==b&&(a.value=b)}function qg(a){switch(a){case "svg":return"http://www.w3.org/2000/svg";case "math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}
function oe(a,b){return null==a||"http://www.w3.org/1999/xhtml"===a?qg(b):"http://www.w3.org/2000/svg"===a&&"foreignObject"===b?"http://www.w3.org/1999/xhtml":a}function rg(a,b,c){return null==b||"boolean"===typeof b||""===b?"":c||"number"!==typeof b||0===b||dc.hasOwnProperty(a)&&dc[a]?(""+b).trim():b+"px"}function sg(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf("--"),e=rg(c,b[c],d);"float"===c&&(c="cssFloat");d?a.setProperty(c,e):a[c]=e}}function pe(a,b){if(b){if(ij[a]&&
(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(m(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(m(60));if("object"!==typeof b.dangerouslySetInnerHTML||!("__html"in b.dangerouslySetInnerHTML))throw Error(m(61));}if(null!=b.style&&"object"!==typeof b.style)throw Error(m(62));}}function qe(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;
default:return!0}}function re(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function tg(a){if(a=ec(a)){if("function"!==typeof se)throw Error(m(280));var b=a.stateNode;b&&(b=Rc(b),se(a.stateNode,a.type,b))}}function ug(a){Eb?Fb?Fb.push(a):Fb=[a]:Eb=a}function vg(){if(Eb){var a=Eb,b=Fb;Fb=Eb=null;tg(a);if(b)for(a=0;a<b.length;a++)tg(b[a])}}function wg(a,b,c){if(te)return a(b,c);te=!0;try{return xg(a,b,c)}finally{if(te=
!1,null!==Eb||null!==Fb)yg(),vg()}}function fc(a,b){var c=a.stateNode;if(null===c)return null;var d=Rc(c);if(null===d)return null;c=d[b];a:switch(b){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":case "onMouseEnter":(d=!d.disabled)||(a=a.type,d=!("button"===a||"input"===a||"select"===a||"textarea"===a));a=!d;break a;default:a=!1}if(a)return null;
if(c&&"function"!==typeof c)throw Error(m(231,b,typeof c));return c}function jj(a,b,c,d,e,f,g,h,k){gc=!1;Sc=null;kj.apply(lj,arguments)}function mj(a,b,c,d,e,f,g,h,k){jj.apply(this,arguments);if(gc){if(gc){var n=Sc;gc=!1;Sc=null}else throw Error(m(198));Tc||(Tc=!0,ue=n)}}function nb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function zg(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,
null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Ag(a){if(nb(a)!==a)throw Error(m(188));}function nj(a){var b=a.alternate;if(!b){b=nb(a);if(null===b)throw Error(m(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Ag(e),a;if(f===d)return Ag(e),b;f=f.sibling}throw Error(m(188));}if(c.return!==d.return)c=e,d=f;
else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(m(189));}}if(c.alternate!==d)throw Error(m(190));}if(3!==c.tag)throw Error(m(188));return c.stateNode.current===c?a:b}function Bg(a){a=nj(a);return null!==a?Cg(a):null}function Cg(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=Cg(a);if(null!==b)return b;a=a.sibling}return null}
function oj(a,b){if(Ca&&"function"===typeof Ca.onCommitFiberRoot)try{Ca.onCommitFiberRoot(Uc,a,void 0,128===(a.current.flags&128))}catch(c){}}function pj(a){a>>>=0;return 0===a?32:31-(qj(a)/rj|0)|0}function hc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&
4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return a}}function Vc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=hc(h):(f&=g,0!==f&&(d=hc(f)))}else g=c&~e,0!==g?d=hc(g):0!==f&&(d=hc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&
(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-ta(b),e=1<<c,d|=a[c],b&=~e;return d}function sj(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;
case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function tj(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-ta(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=sj(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function ve(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function Dg(){var a=Wc;Wc<<=1;0===(Wc&4194240)&&(Wc=64);return a}function we(a){for(var b=[],c=0;31>c;c++)b.push(a);
return b}function ic(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-ta(b);a[b]=c}function uj(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-ta(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}function xe(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-ta(c),e=1<<d;e&b|a[d]&
b&&(a[d]|=b);c&=~e}}function Eg(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}function Fg(a,b){switch(a){case "focusin":case "focusout":Va=null;break;case "dragenter":case "dragleave":Wa=null;break;case "mouseover":case "mouseout":Xa=null;break;case "pointerover":case "pointerout":jc.delete(b.pointerId);break;case "gotpointercapture":case "lostpointercapture":kc.delete(b.pointerId)}}function lc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,
nativeEvent:f,targetContainers:[e]},null!==b&&(b=ec(b),null!==b&&Gg(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}function vj(a,b,c,d,e){switch(b){case "focusin":return Va=lc(Va,a,b,c,d,e),!0;case "dragenter":return Wa=lc(Wa,a,b,c,d,e),!0;case "mouseover":return Xa=lc(Xa,a,b,c,d,e),!0;case "pointerover":var f=e.pointerId;jc.set(f,lc(jc.get(f)||null,a,b,c,d,e));return!0;case "gotpointercapture":return f=e.pointerId,kc.set(f,lc(kc.get(f)||null,a,b,
c,d,e)),!0}return!1}function Hg(a){var b=ob(a.target);if(null!==b){var c=nb(b);if(null!==c)if(b=c.tag,13===b){if(b=zg(c),null!==b){a.blockedOn=b;wj(a.priority,function(){xj(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=ye(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;
var d=new c.constructor(c.type,c);ze=d;c.target.dispatchEvent(d);ze=null}else return b=ec(c),null!==b&&Gg(b),a.blockedOn=c,!1;b.shift()}return!0}function Ig(a,b,c){Xc(a)&&c.delete(b)}function yj(){Ae=!1;null!==Va&&Xc(Va)&&(Va=null);null!==Wa&&Xc(Wa)&&(Wa=null);null!==Xa&&Xc(Xa)&&(Xa=null);jc.forEach(Ig);kc.forEach(Ig)}function mc(a,b){a.blockedOn===b&&(a.blockedOn=null,Ae||(Ae=!0,Jg(Kg,yj)))}function nc(a){if(0<Yc.length){mc(Yc[0],a);for(var b=1;b<Yc.length;b++){var c=Yc[b];c.blockedOn===a&&(c.blockedOn=
null)}}null!==Va&&mc(Va,a);null!==Wa&&mc(Wa,a);null!==Xa&&mc(Xa,a);b=function(b){return mc(b,a)};jc.forEach(b);kc.forEach(b);for(b=0;b<Ya.length;b++)c=Ya[b],c.blockedOn===a&&(c.blockedOn=null);for(;0<Ya.length&&(b=Ya[0],null===b.blockedOn);)Hg(b),null===b.blockedOn&&Ya.shift()}function zj(a,b,c,d){var e=z,f=Gb.transition;Gb.transition=null;try{z=1,Be(a,b,c,d)}finally{z=e,Gb.transition=f}}function Aj(a,b,c,d){var e=z,f=Gb.transition;Gb.transition=null;try{z=4,Be(a,b,c,d)}finally{z=e,Gb.transition=
f}}function Be(a,b,c,d){if(Zc){var e=ye(a,b,c,d);if(null===e)Ce(a,b,d,$c,c),Fg(a,d);else if(vj(e,a,b,c,d))d.stopPropagation();else if(Fg(a,d),b&4&&-1<Bj.indexOf(a)){for(;null!==e;){var f=ec(e);null!==f&&Cj(f);f=ye(a,b,c,d);null===f&&Ce(a,b,d,$c,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else Ce(a,b,d,null,c)}}function ye(a,b,c,d){$c=null;a=re(d);a=ob(a);if(null!==a)if(b=nb(a),null===b)a=null;else if(c=b.tag,13===c){a=zg(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===
b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);$c=a;return null}function Lg(a){switch(a){case "cancel":case "click":case "close":case "contextmenu":case "copy":case "cut":case "auxclick":case "dblclick":case "dragend":case "dragstart":case "drop":case "focusin":case "focusout":case "input":case "invalid":case "keydown":case "keypress":case "keyup":case "mousedown":case "mouseup":case "paste":case "pause":case "play":case "pointercancel":case "pointerdown":case "pointerup":case "ratechange":case "reset":case "resize":case "seeked":case "submit":case "touchcancel":case "touchend":case "touchstart":case "volumechange":case "change":case "selectionchange":case "textInput":case "compositionstart":case "compositionend":case "compositionupdate":case "beforeblur":case "afterblur":case "beforeinput":case "blur":case "fullscreenchange":case "focus":case "hashchange":case "popstate":case "select":case "selectstart":return 1;
case "drag":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "mousemove":case "mouseout":case "mouseover":case "pointermove":case "pointerout":case "pointerover":case "scroll":case "toggle":case "touchmove":case "wheel":case "mouseenter":case "mouseleave":case "pointerenter":case "pointerleave":return 4;case "message":switch(Dj()){case De:return 1;case Mg:return 4;case ad:case Ej:return 16;case Ng:return 536870912;default:return 16}default:return 16}}function Og(){if(bd)return bd;
var a,b=Ee,c=b.length,d,e="value"in Za?Za.value:Za.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return bd=e.slice(a,1<d?1-d:void 0)}function cd(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function dd(){return!0}function Pg(){return!1}function ka(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;
for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?dd:Pg;this.isPropagationStopped=Pg;return this}E(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():"unknown"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=dd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():
"unknown"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=dd)},persist:function(){},isPersistent:dd});return b}function Fj(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Gj[a])?!!b[a]:!1}function Fe(a){return Fj}function Qg(a,b){switch(a){case "keyup":return-1!==Hj.indexOf(b.keyCode);case "keydown":return 229!==b.keyCode;case "keypress":case "mousedown":case "focusout":return!0;default:return!1}}function Rg(a){a=a.detail;return"object"===typeof a&&
"data"in a?a.data:null}function Ij(a,b){switch(a){case "compositionend":return Rg(b);case "keypress":if(32!==b.which)return null;Sg=!0;return Tg;case "textInput":return a=b.data,a===Tg&&Sg?null:a;default:return null}}function Jj(a,b){if(Hb)return"compositionend"===a||!Ge&&Qg(a,b)?(a=Og(),bd=Ee=Za=null,Hb=!1,a):null;switch(a){case "paste":return null;case "keypress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;
case "compositionend":return Ug&&"ko"!==b.locale?null:b.data;default:return null}}function Vg(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return"input"===b?!!Kj[a.type]:"textarea"===b?!0:!1}function Lj(a){if(!Ia)return!1;a="on"+a;var b=a in document;b||(b=document.createElement("div"),b.setAttribute(a,"return;"),b="function"===typeof b[a]);return b}function Wg(a,b,c,d){ug(d);b=ed(b,"onChange");0<b.length&&(c=new He("onChange","change",null,c,d),a.push({event:c,listeners:b}))}function Mj(a){Xg(a,
0)}function fd(a){var b=Ib(a);if(jg(b))return a}function Nj(a,b){if("change"===a)return b}function Yg(){oc&&(oc.detachEvent("onpropertychange",Zg),pc=oc=null)}function Zg(a){if("value"===a.propertyName&&fd(pc)){var b=[];Wg(b,pc,a,re(a));wg(Mj,b)}}function Oj(a,b,c){"focusin"===a?(Yg(),oc=b,pc=c,oc.attachEvent("onpropertychange",Zg)):"focusout"===a&&Yg()}function Pj(a,b){if("selectionchange"===a||"keyup"===a||"keydown"===a)return fd(pc)}function Qj(a,b){if("click"===a)return fd(b)}function Rj(a,b){if("input"===
a||"change"===a)return fd(b)}function Sj(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}function qc(a,b){if(ua(a,b))return!0;if("object"!==typeof a||null===a||"object"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!Zd.call(b,e)||!ua(a[e],b[e]))return!1}return!0}function $g(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function ah(a,b){var c=$g(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;
if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=$g(c)}}function bh(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?bh(a,b.parentNode):"contains"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function ch(){for(var a=window,b=Qc();b instanceof a.HTMLIFrameElement;){try{var c="string"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;
b=Qc(a.document)}return b}function Ie(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&("text"===a.type||"search"===a.type||"tel"===a.type||"url"===a.type||"password"===a.type)||"textarea"===b||"true"===a.contentEditable)}function Tj(a){var b=ch(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&bh(c.ownerDocument.documentElement,c)){if(null!==d&&Ie(c))if(b=d.start,a=d.end,void 0===a&&(a=b),"selectionStart"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);
else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=ah(c,f);var g=ah(c,d);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),
a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});"function"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}function dh(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Je||null==Jb||Jb!==Qc(d)||(d=Jb,"selectionStart"in d&&Ie(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d=
{anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),rc&&qc(rc,d)||(rc=d,d=ed(Ke,"onSelect"),0<d.length&&(b=new He("onSelect","select",null,b,c),a.push({event:b,listeners:d}),b.target=Jb)))}function gd(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c["Webkit"+a]="webkit"+b;c["Moz"+a]="moz"+b;return c}function hd(a){if(Le[a])return Le[a];if(!Kb[a])return a;var b=Kb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in eh)return Le[a]=b[c];return a}function $a(a,
b){fh.set(a,b);mb(b,[a])}function gh(a,b,c){var d=a.type||"unknown-event";a.currentTarget=c;mj(d,b,void 0,a);a.currentTarget=null}function Xg(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,n=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;gh(e,h,n);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;n=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;
gh(e,h,n);f=k}}}if(Tc)throw a=ue,Tc=!1,ue=null,a;}function B(a,b){var c=b[Me];void 0===c&&(c=b[Me]=new Set);var d=a+"__bubble";c.has(d)||(hh(b,a,2,!1),c.add(d))}function Ne(a,b,c){var d=0;b&&(d|=4);hh(c,a,d,b)}function sc(a){if(!a[id]){a[id]=!0;cg.forEach(function(b){"selectionchange"!==b&&(Uj.has(b)||Ne(b,!1,a),Ne(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[id]||(b[id]=!0,Ne("selectionchange",!1,b))}}function hh(a,b,c,d,e){switch(Lg(b)){case 1:e=zj;break;case 4:e=Aj;break;default:e=
Be}c=e.bind(null,b,c,a);e=void 0;!Oe||"touchstart"!==b&&"touchmove"!==b&&"wheel"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}function Ce(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;
if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=ob(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}wg(function(){var d=f,e=re(c),g=[];a:{var h=fh.get(a);if(void 0!==h){var k=He,m=a;switch(a){case "keypress":if(0===cd(c))break a;case "keydown":case "keyup":k=Vj;break;case "focusin":m="focus";k=Pe;break;case "focusout":m="blur";k=Pe;break;case "beforeblur":case "afterblur":k=Pe;break;
case "click":if(2===c.button)break a;case "auxclick":case "dblclick":case "mousedown":case "mousemove":case "mouseup":case "mouseout":case "mouseover":case "contextmenu":k=ih;break;case "drag":case "dragend":case "dragenter":case "dragexit":case "dragleave":case "dragover":case "dragstart":case "drop":k=Wj;break;case "touchcancel":case "touchend":case "touchmove":case "touchstart":k=Xj;break;case jh:case kh:case lh:k=Yj;break;case mh:k=Zj;break;case "scroll":k=ak;break;case "wheel":k=bk;break;case "copy":case "cut":case "paste":k=
ck;break;case "gotpointercapture":case "lostpointercapture":case "pointercancel":case "pointerdown":case "pointermove":case "pointerout":case "pointerover":case "pointerup":k=nh}var l=0!==(b&4),p=!l&&"scroll"===a,w=l?null!==h?h+"Capture":null:h;l=[];for(var A=d,t;null!==A;){t=A;var M=t.stateNode;5===t.tag&&null!==M&&(t=M,null!==w&&(M=fc(A,w),null!=M&&l.push(tc(A,M,t))));if(p)break;A=A.return}0<l.length&&(h=new k(h,m,null,c,e),g.push({event:h,listeners:l}))}}if(0===(b&7)){a:{h="mouseover"===a||"pointerover"===
a;k="mouseout"===a||"pointerout"===a;if(h&&c!==ze&&(m=c.relatedTarget||c.fromElement)&&(ob(m)||m[Ja]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(m=c.relatedTarget||c.toElement,k=d,m=m?ob(m):null,null!==m&&(p=nb(m),m!==p||5!==m.tag&&6!==m.tag))m=null}else k=null,m=d;if(k!==m){l=ih;M="onMouseLeave";w="onMouseEnter";A="mouse";if("pointerout"===a||"pointerover"===a)l=nh,M="onPointerLeave",w="onPointerEnter",A="pointer";p=null==k?h:Ib(k);t=null==
m?h:Ib(m);h=new l(M,A+"leave",k,c,e);h.target=p;h.relatedTarget=t;M=null;ob(e)===d&&(l=new l(w,A+"enter",m,c,e),l.target=t,l.relatedTarget=p,M=l);p=M;if(k&&m)b:{l=k;w=m;A=0;for(t=l;t;t=Lb(t))A++;t=0;for(M=w;M;M=Lb(M))t++;for(;0<A-t;)l=Lb(l),A--;for(;0<t-A;)w=Lb(w),t--;for(;A--;){if(l===w||null!==w&&l===w.alternate)break b;l=Lb(l);w=Lb(w)}l=null}else l=null;null!==k&&oh(g,h,k,l,!1);null!==m&&null!==p&&oh(g,p,m,l,!0)}}}a:{h=d?Ib(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if("select"===k||"input"===
k&&"file"===h.type)var ma=Nj;else if(Vg(h))if(ph)ma=Rj;else{ma=Pj;var va=Oj}else(k=h.nodeName)&&"input"===k.toLowerCase()&&("checkbox"===h.type||"radio"===h.type)&&(ma=Qj);if(ma&&(ma=ma(a,d))){Wg(g,ma,c,e);break a}va&&va(a,h,d);"focusout"===a&&(va=h._wrapperState)&&va.controlled&&"number"===h.type&&me(h,"number",h.value)}va=d?Ib(d):window;switch(a){case "focusin":if(Vg(va)||"true"===va.contentEditable)Jb=va,Ke=d,rc=null;break;case "focusout":rc=Ke=Jb=null;break;case "mousedown":Je=!0;break;case "contextmenu":case "mouseup":case "dragend":Je=
!1;dh(g,c,e);break;case "selectionchange":if(dk)break;case "keydown":case "keyup":dh(g,c,e)}var ab;if(Ge)b:{switch(a){case "compositionstart":var da="onCompositionStart";break b;case "compositionend":da="onCompositionEnd";break b;case "compositionupdate":da="onCompositionUpdate";break b}da=void 0}else Hb?Qg(a,c)&&(da="onCompositionEnd"):"keydown"===a&&229===c.keyCode&&(da="onCompositionStart");da&&(Ug&&"ko"!==c.locale&&(Hb||"onCompositionStart"!==da?"onCompositionEnd"===da&&Hb&&(ab=Og()):(Za=e,Ee=
"value"in Za?Za.value:Za.textContent,Hb=!0)),va=ed(d,da),0<va.length&&(da=new qh(da,a,null,c,e),g.push({event:da,listeners:va}),ab?da.data=ab:(ab=Rg(c),null!==ab&&(da.data=ab))));if(ab=ek?Ij(a,c):Jj(a,c))d=ed(d,"onBeforeInput"),0<d.length&&(e=new fk("onBeforeInput","beforeinput",null,c,e),g.push({event:e,listeners:d}),e.data=ab)}Xg(g,b)})}function tc(a,b,c){return{instance:a,listener:b,currentTarget:c}}function ed(a,b){for(var c=b+"Capture",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==
f&&(e=f,f=fc(a,c),null!=f&&d.unshift(tc(a,f,e)),f=fc(a,b),null!=f&&d.push(tc(a,f,e)));a=a.return}return d}function Lb(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}function oh(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,n=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==n&&(h=n,e?(k=fc(c,f),null!=k&&g.unshift(tc(c,k,h))):e||(k=fc(c,f),null!=k&&g.push(tc(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}function rh(a){return("string"===
typeof a?a:""+a).replace(gk,"\n").replace(hk,"")}function jd(a,b,c,d){b=rh(b);if(rh(a)!==b&&c)throw Error(m(425));}function kd(){}function Qe(a,b){return"textarea"===a||"noscript"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}function ik(a){setTimeout(function(){throw a;})}function Re(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=
e.data,"/$"===c){if(0===d){a.removeChild(e);nc(b);return}d--}else"$"!==c&&"$?"!==c&&"$!"!==c||d++;c=e}while(c);nc(b)}function Ka(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if("$"===b||"$!"===b||"$?"===b)break;if("/$"===b)return null}}return a}function sh(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if("$"===c||"$!"===c||"$?"===c){if(0===b)return a;b--}else"/$"===c&&b++}a=a.previousSibling}return null}function ob(a){var b=a[Da];
if(b)return b;for(var c=a.parentNode;c;){if(b=c[Ja]||c[Da]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=sh(a);null!==a;){if(c=a[Da])return c;a=sh(a)}return b}a=c;c=a.parentNode}return null}function ec(a){a=a[Da]||a[Ja];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Ib(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(m(33));}function Rc(a){return a[uc]||null}function bb(a){return{current:a}}function v(a,b){0>Mb||(a.current=Se[Mb],Se[Mb]=null,Mb--)}
function y(a,b,c){Mb++;Se[Mb]=a.current;a.current=b}function Nb(a,b){var c=a.type.contextTypes;if(!c)return cb;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function ea(a){a=a.childContextTypes;return null!==a&&void 0!==a}function th(a,b,c){if(J.current!==cb)throw Error(m(168));
y(J,b);y(S,c)}function uh(a,b,c){var d=a.stateNode;b=b.childContextTypes;if("function"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(m(108,gj(a)||"Unknown",e));return E({},c,d)}function ld(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||cb;pb=J.current;y(J,a);y(S,S.current);return!0}function vh(a,b,c){var d=a.stateNode;if(!d)throw Error(m(169));c?(a=uh(a,b,pb),d.__reactInternalMemoizedMergedChildContext=a,v(S),v(J),y(J,a)):v(S);
y(S,c)}function wh(a){null===La?La=[a]:La.push(a)}function jk(a){md=!0;wh(a)}function db(){if(!Te&&null!==La){Te=!0;var a=0,b=z;try{var c=La;for(z=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}La=null;md=!1}catch(e){throw null!==La&&(La=La.slice(a+1)),xh(De,db),e;}finally{z=b,Te=!1}}return null}function qb(a,b){Ob[Pb++]=nd;Ob[Pb++]=od;od=a;nd=b}function yh(a,b,c){na[oa++]=Ma;na[oa++]=Na;na[oa++]=rb;rb=a;var d=Ma;a=Na;var e=32-ta(d)-1;d&=~(1<<e);c+=1;var f=32-ta(b)+e;if(30<f){var g=e-e%5;
f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;Ma=1<<32-ta(b)+e|c<<e|d;Na=f+a}else Ma=1<<f|c<<e|d,Na=a}function Ue(a){null!==a.return&&(qb(a,1),yh(a,1,0))}function Ve(a){for(;a===od;)od=Ob[--Pb],Ob[Pb]=null,nd=Ob[--Pb],Ob[Pb]=null;for(;a===rb;)rb=na[--oa],na[oa]=null,Na=na[--oa],na[oa]=null,Ma=na[--oa],na[oa]=null}function zh(a,b){var c=pa(5,null,null,0);c.elementType="DELETED";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}function Ah(a,b){switch(a.tag){case 5:var c=
a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,la=a,fa=Ka(b.firstChild),!0):!1;case 6:return b=""===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,la=a,fa=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==rb?{id:Ma,overflow:Na}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=pa(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,la=a,fa=null,!0):!1;default:return!1}}function We(a){return 0!==
(a.mode&1)&&0===(a.flags&128)}function Xe(a){if(D){var b=fa;if(b){var c=b;if(!Ah(a,b)){if(We(a))throw Error(m(418));b=Ka(c.nextSibling);var d=la;b&&Ah(a,b)?zh(d,c):(a.flags=a.flags&-4097|2,D=!1,la=a)}}else{if(We(a))throw Error(m(418));a.flags=a.flags&-4097|2;D=!1;la=a}}}function Bh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;la=a}function pd(a){if(a!==la)return!1;if(!D)return Bh(a),D=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b="head"!==b&&"body"!==b&&!Qe(a.type,
a.memoizedProps));if(b&&(b=fa)){if(We(a)){for(a=fa;a;)a=Ka(a.nextSibling);throw Error(m(418));}for(;b;)zh(a,b),b=Ka(b.nextSibling)}Bh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(m(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if("/$"===c){if(0===b){fa=Ka(a.nextSibling);break a}b--}else"$"!==c&&"$!"!==c&&"$?"!==c||b++}a=a.nextSibling}fa=null}}else fa=la?Ka(a.stateNode.nextSibling):null;return!0}function Qb(){fa=la=null;D=!1}function Ye(a){null===
wa?wa=[a]:wa.push(a)}function vc(a,b,c){a=c.ref;if(null!==a&&"function"!==typeof a&&"object"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(m(309));var d=c.stateNode}if(!d)throw Error(m(147,a));var e=d,f=""+a;if(null!==b&&null!==b.ref&&"function"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if("string"!==typeof a)throw Error(m(284));if(!c._owner)throw Error(m(290,a));}return a}function qd(a,b){a=
Object.prototype.toString.call(b);throw Error(m(31,"[object Object]"===a?"object with keys {"+Object.keys(b).join(", ")+"}":a));}function Ch(a){var b=a._init;return b(a._payload)}function Dh(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=eb(a,b);a.index=
0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&null===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Ze(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===Bb)return l(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||"object"===typeof f&&null!==f&&f.$$typeof===Ta&&
Ch(f)===b.type))return d=e(b,c.props),d.ref=vc(a,b,c),d.return=a,d;d=rd(c.type,c.key,c.props,null,a.mode,d);d.ref=vc(a,b,c);d.return=a;return d}function n(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=$e(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function l(a,b,c,d,f){if(null===b||7!==b.tag)return b=sb(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function u(a,b,c){if("string"===
typeof b&&""!==b||"number"===typeof b)return b=Ze(""+b,a.mode,c),b.return=a,b;if("object"===typeof b&&null!==b){switch(b.$$typeof){case sd:return c=rd(b.type,b.key,b.props,null,a.mode,c),c.ref=vc(a,null,b),c.return=a,c;case Cb:return b=$e(b,a.mode,c),b.return=a,b;case Ta:var d=b._init;return u(a,d(b._payload),c)}if(cc(b)||ac(b))return b=sb(b,a.mode,c,null),b.return=a,b;qd(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if("string"===typeof c&&""!==c||"number"===typeof c)return null!==
e?null:h(a,b,""+c,d);if("object"===typeof c&&null!==c){switch(c.$$typeof){case sd:return c.key===e?k(a,b,c,d):null;case Cb:return c.key===e?n(a,b,c,d):null;case Ta:return e=c._init,r(a,b,e(c._payload),d)}if(cc(c)||ac(c))return null!==e?null:l(a,b,c,d,null);qd(a,c)}return null}function p(a,b,c,d,e){if("string"===typeof d&&""!==d||"number"===typeof d)return a=a.get(c)||null,h(b,a,""+d,e);if("object"===typeof d&&null!==d){switch(d.$$typeof){case sd:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,
e);case Cb:return a=a.get(null===d.key?c:d.key)||null,n(b,a,d,e);case Ta:var f=d._init;return p(a,b,c,f(d._payload),e)}if(cc(d)||ac(d))return a=a.get(c)||null,l(b,a,d,e,null);qd(b,d)}return null}function x(e,g,h,k){for(var n=null,m=null,l=g,t=g=0,q=null;null!==l&&t<h.length;t++){l.index>t?(q=l,l=null):q=l.sibling;var A=r(e,l,h[t],k);if(null===A){null===l&&(l=q);break}a&&l&&null===A.alternate&&b(e,l);g=f(A,g,t);null===m?n=A:m.sibling=A;m=A;l=q}if(t===h.length)return c(e,l),D&&qb(e,t),n;if(null===l){for(;t<
h.length;t++)l=u(e,h[t],k),null!==l&&(g=f(l,g,t),null===m?n=l:m.sibling=l,m=l);D&&qb(e,t);return n}for(l=d(e,l);t<h.length;t++)q=p(l,e,t,h[t],k),null!==q&&(a&&null!==q.alternate&&l.delete(null===q.key?t:q.key),g=f(q,g,t),null===m?n=q:m.sibling=q,m=q);a&&l.forEach(function(a){return b(e,a)});D&&qb(e,t);return n}function I(e,g,h,k){var n=ac(h);if("function"!==typeof n)throw Error(m(150));h=n.call(h);if(null==h)throw Error(m(151));for(var l=n=null,q=g,t=g=0,A=null,w=h.next();null!==q&&!w.done;t++,w=
h.next()){q.index>t?(A=q,q=null):A=q.sibling;var x=r(e,q,w.value,k);if(null===x){null===q&&(q=A);break}a&&q&&null===x.alternate&&b(e,q);g=f(x,g,t);null===l?n=x:l.sibling=x;l=x;q=A}if(w.done)return c(e,q),D&&qb(e,t),n;if(null===q){for(;!w.done;t++,w=h.next())w=u(e,w.value,k),null!==w&&(g=f(w,g,t),null===l?n=w:l.sibling=w,l=w);D&&qb(e,t);return n}for(q=d(e,q);!w.done;t++,w=h.next())w=p(q,e,t,w.value,k),null!==w&&(a&&null!==w.alternate&&q.delete(null===w.key?t:w.key),g=f(w,g,t),null===l?n=w:l.sibling=
w,l=w);a&&q.forEach(function(a){return b(e,a)});D&&qb(e,t);return n}function v(a,d,f,h){"object"===typeof f&&null!==f&&f.type===Bb&&null===f.key&&(f=f.props.children);if("object"===typeof f&&null!==f){switch(f.$$typeof){case sd:a:{for(var k=f.key,n=d;null!==n;){if(n.key===k){k=f.type;if(k===Bb){if(7===n.tag){c(a,n.sibling);d=e(n,f.props.children);d.return=a;a=d;break a}}else if(n.elementType===k||"object"===typeof k&&null!==k&&k.$$typeof===Ta&&Ch(k)===n.type){c(a,n.sibling);d=e(n,f.props);d.ref=vc(a,
n,f);d.return=a;a=d;break a}c(a,n);break}else b(a,n);n=n.sibling}f.type===Bb?(d=sb(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=rd(f.type,f.key,f.props,null,a.mode,h),h.ref=vc(a,d,f),h.return=a,a=h)}return g(a);case Cb:a:{for(n=f.key;null!==d;){if(d.key===n)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=$e(f,a.mode,h);d.return=a;
a=d}return g(a);case Ta:return n=f._init,v(a,d,n(f._payload),h)}if(cc(f))return x(a,d,f,h);if(ac(f))return I(a,d,f,h);qd(a,f)}return"string"===typeof f&&""!==f||"number"===typeof f?(f=""+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Ze(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return v}function af(){bf=Rb=td=null}function cf(a,b){b=ud.current;v(ud);a._currentValue=b}function df(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=
b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}function Sb(a,b){td=a;bf=Rb=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(ha=!0),a.firstContext=null)}function qa(a){var b=a._currentValue;if(bf!==a)if(a={context:a,memoizedValue:b,next:null},null===Rb){if(null===td)throw Error(m(308));Rb=a;td.dependencies={lanes:0,firstContext:a}}else Rb=Rb.next=a;return b}function ef(a){null===tb?tb=[a]:tb.push(a)}function Eh(a,b,c,d){var e=b.interleaved;
null===e?(c.next=c,ef(b)):(c.next=e.next,e.next=c);b.interleaved=c;return Oa(a,d)}function Oa(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}function ff(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Fh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue=
{baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function Pa(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}function fb(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(p&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return kk(a,c)}e=d.interleaved;null===e?(b.next=b,ef(d)):(b.next=e.next,e.next=b);d.interleaved=b;return Oa(a,c)}function vd(a,b,c){b=
b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;xe(a,c)}}function Gh(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,
shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=b;c.lastBaseUpdate=b}function wd(a,b,c,d){var e=a.updateQueue;gb=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,n=k.next;k.next=null;null===g?f=n:g.next=n;g=k;var l=a.alternate;null!==l&&(l=l.updateQueue,h=l.lastBaseUpdate,h!==g&&(null===h?l.firstBaseUpdate=n:h.next=n,l.lastBaseUpdate=k))}if(null!==f){var m=e.baseState;g=0;l=
n=k=null;h=f;do{var r=h.lane,p=h.eventTime;if((d&r)===r){null!==l&&(l=l.next={eventTime:p,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,next:null});a:{var x=a,v=h;r=b;p=c;switch(v.tag){case 1:x=v.payload;if("function"===typeof x){m=x.call(p,m,r);break a}m=x;break a;case 3:x.flags=x.flags&-65537|128;case 0:x=v.payload;r="function"===typeof x?x.call(p,m,r):x;if(null===r||void 0===r)break a;m=E({},m,r);break a;case 2:gb=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=
[h]:r.push(h))}else p={eventTime:p,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===l?(n=l=p,k=m):l=l.next=p,g|=r;h=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===l&&(k=m);e.baseState=k;e.firstBaseUpdate=n;e.lastBaseUpdate=l;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);ra|=g;a.lanes=g;a.memoizedState=m}}function Hh(a,
b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if("function"!==typeof e)throw Error(m(191,e));e.call(d)}}}function ub(a){if(a===wc)throw Error(m(174));return a}function gf(a,b){y(xc,b);y(yc,a);y(Ea,wc);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:oe(null,"");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=oe(b,a)}v(Ea);y(Ea,b)}function Tb(a){v(Ea);v(yc);v(xc)}function Ih(a){ub(xc.current);
var b=ub(Ea.current);var c=oe(b,a.type);b!==c&&(y(yc,a),y(Ea,c))}function hf(a){yc.current===a&&(v(Ea),v(yc))}function xd(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||"$?"===c.data||"$!"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=
b.return;b=b.sibling}return null}function jf(){for(var a=0;a<kf.length;a++)kf[a]._workInProgressVersionPrimary=null;kf.length=0}function V(){throw Error(m(321));}function lf(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!ua(a[c],b[c]))return!1;return!0}function mf(a,b,c,d,e,f){vb=f;C=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;yd.current=null===a||null===a.memoizedState?lk:mk;a=c(d,e);if(zc){f=0;do{zc=!1;Ac=0;if(25<=f)throw Error(m(301));f+=1;N=K=null;b.updateQueue=null;
yd.current=nk;a=c(d,e)}while(zc)}yd.current=zd;b=null!==K&&null!==K.next;vb=0;N=K=C=null;Ad=!1;if(b)throw Error(m(300));return a}function nf(){var a=0!==Ac;Ac=0;return a}function Fa(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===N?C.memoizedState=N=a:N=N.next=a;return N}function sa(){if(null===K){var a=C.alternate;a=null!==a?a.memoizedState:null}else a=K.next;var b=null===N?C.memoizedState:N.next;if(null!==b)N=b,K=a;else{if(null===a)throw Error(m(310));K=a;
a={memoizedState:K.memoizedState,baseState:K.baseState,baseQueue:K.baseQueue,queue:K.queue,next:null};null===N?C.memoizedState=N=a:N=N.next=a}return N}function Bc(a,b){return"function"===typeof b?b(a):b}function of(a,b,c){b=sa();c=b.queue;if(null===c)throw Error(m(311));c.lastRenderedReducer=a;var d=K,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,n=f;do{var l=n.lane;if((vb&
l)===l)null!==k&&(k=k.next={lane:0,action:n.action,hasEagerState:n.hasEagerState,eagerState:n.eagerState,next:null}),d=n.hasEagerState?n.eagerState:a(d,n.action);else{var u={lane:l,action:n.action,hasEagerState:n.hasEagerState,eagerState:n.eagerState,next:null};null===k?(h=k=u,g=d):k=k.next=u;C.lanes|=l;ra|=l}n=n.next}while(null!==n&&n!==f);null===k?g=d:k.next=h;ua(d,b.memoizedState)||(ha=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=
e.lane,C.lanes|=f,ra|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}function pf(a,b,c){b=sa();c=b.queue;if(null===c)throw Error(m(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);ua(f,b.memoizedState)||(ha=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function Jh(a,b,c){}function Kh(a,b,c){c=C;var d=sa(),
e=b(),f=!ua(d.memoizedState,e);f&&(d.memoizedState=e,ha=!0);d=d.queue;qf(Lh.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==N&&N.memoizedState.tag&1){c.flags|=2048;Cc(9,Mh.bind(null,c,d,e,b),void 0,null);if(null===O)throw Error(m(349));0!==(vb&30)||Nh(c,b,e)}return e}function Nh(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=C.updateQueue;null===b?(b={lastEffect:null,stores:null},C.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}function Mh(a,b,c,d){b.value=c;b.getSnapshot=
d;Oh(b)&&Ph(a)}function Lh(a,b,c){return c(function(){Oh(b)&&Ph(a)})}function Oh(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!ua(a,c)}catch(d){return!0}}function Ph(a){var b=Oa(a,1);null!==b&&xa(b,a,1,-1)}function Qh(a){var b=Fa();"function"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:Bc,lastRenderedState:a};b.queue=a;a=a.dispatch=ok.bind(null,C,a);return[b.memoizedState,a]}function Cc(a,b,c,d){a={tag:a,create:b,
destroy:c,deps:d,next:null};b=C.updateQueue;null===b?(b={lastEffect:null,stores:null},C.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function Rh(a){return sa().memoizedState}function Bd(a,b,c,d){var e=Fa();C.flags|=a;e.memoizedState=Cc(1|b,c,void 0,void 0===d?null:d)}function Cd(a,b,c,d){var e=sa();d=void 0===d?null:d;var f=void 0;if(null!==K){var g=K.memoizedState;f=g.destroy;if(null!==d&&lf(d,g.deps)){e.memoizedState=
Cc(b,c,f,d);return}}C.flags|=a;e.memoizedState=Cc(1|b,c,f,d)}function Sh(a,b){return Bd(8390656,8,a,b)}function qf(a,b){return Cd(2048,8,a,b)}function Th(a,b){return Cd(4,2,a,b)}function Uh(a,b){return Cd(4,4,a,b)}function Vh(a,b){if("function"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Wh(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Cd(4,4,Vh.bind(null,b,a),c)}function rf(a,b){}function Xh(a,b){var c=
sa();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&lf(b,d[1]))return d[0];c.memoizedState=[a,b];return a}function Yh(a,b){var c=sa();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&lf(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Zh(a,b,c){if(0===(vb&21))return a.baseState&&(a.baseState=!1,ha=!0),a.memoizedState=c;ua(c,b)||(c=Dg(),C.lanes|=c,ra|=c,a.baseState=!0);return b}function pk(a,b,c){c=z;z=0!==c&&4>c?c:4;a(!0);var d=sf.transition;sf.transition=
{};try{a(!1),b()}finally{z=c,sf.transition=d}}function $h(){return sa().memoizedState}function qk(a,b,c){var d=hb(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(ai(a))bi(b,c);else if(c=Eh(a,b,c,d),null!==c){var e=Z();xa(c,a,d,e);ci(c,b,d)}}function ok(a,b,c){var d=hb(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(ai(a))bi(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,
h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(ua(h,g)){var k=b.interleaved;null===k?(e.next=e,ef(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(n){}finally{}c=Eh(a,b,e,d);null!==c&&(e=Z(),xa(c,a,d,e),ci(c,b,d))}}function ai(a){var b=a.alternate;return a===C||null!==b&&b===C}function bi(a,b){zc=Ad=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function ci(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;xe(a,c)}}function ya(a,b){if(a&&
a.defaultProps){b=E({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}function tf(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:E({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}function di(a,b,c,d,e,f,g){a=a.stateNode;return"function"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!qc(c,d)||!qc(e,f):!0}function ei(a,b,c){var d=!1,e=cb;var f=b.contextType;"object"===typeof f&&
null!==f?f=qa(f):(e=ea(b)?pb:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Nb(a,e):cb);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Dd;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}function fi(a,b,c,d){a=b.state;"function"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);"function"===typeof b.UNSAFE_componentWillReceiveProps&&
b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Dd.enqueueReplaceState(b,b.state,null)}function uf(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs={};ff(a);var f=b.contextType;"object"===typeof f&&null!==f?e.context=qa(f):(f=ea(b)?pb:J.current,e.context=Nb(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;"function"===typeof f&&(tf(a,b,f,c),e.state=a.memoizedState);"function"===typeof b.getDerivedStateFromProps||"function"===typeof e.getSnapshotBeforeUpdate||"function"!==
typeof e.UNSAFE_componentWillMount&&"function"!==typeof e.componentWillMount||(b=e.state,"function"===typeof e.componentWillMount&&e.componentWillMount(),"function"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Dd.enqueueReplaceState(e,e.state,null),wd(a,c,e,d),e.state=a.memoizedState);"function"===typeof e.componentDidMount&&(a.flags|=4194308)}function Ub(a,b){try{var c="",d=b;do c+=fj(d),d=d.return;while(d);var e=c}catch(f){e="\nError generating stack: "+f.message+
"\n"+f.stack}return{value:a,source:b,stack:e,digest:null}}function vf(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}function wf(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}function gi(a,b,c){c=Pa(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Ed||(Ed=!0,xf=d);wf(a,b)};return c}function hi(a,b,c){c=Pa(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if("function"===typeof d){var e=b.value;c.payload=function(){return d(e)};
c.callback=function(){wf(a,b)}}var f=a.stateNode;null!==f&&"function"===typeof f.componentDidCatch&&(c.callback=function(){wf(a,b);"function"!==typeof d&&(null===ib?ib=new Set([this]):ib.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:""})});return c}function ii(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new rk;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=sk.bind(null,a,b,c),b.then(a,a))}function ji(a){do{var b;
if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}function ki(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=Pa(-1,1),b.tag=2,fb(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}function aa(a,b,c,d){b.child=null===a?li(b,null,c,d):Vb(b,a.child,c,d)}function mi(a,b,c,d,e){c=c.render;var f=b.ref;Sb(b,e);d=mf(a,b,c,d,f,
e);c=nf();if(null!==a&&!ha)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Qa(a,b,e);D&&c&&Ue(b);b.flags|=1;aa(a,b,d,e);return b.child}function ni(a,b,c,d,e){if(null===a){var f=c.type;if("function"===typeof f&&!yf(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,oi(a,b,f,d,e);a=rd(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:qc;if(c(g,d)&&a.ref===
b.ref)return Qa(a,b,e)}b.flags|=1;a=eb(f,d);a.ref=b.ref;a.return=b;return b.child=a}function oi(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(qc(f,d)&&a.ref===b.ref)if(ha=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(ha=!0);else return b.lanes=a.lanes,Qa(a,b,e)}return zf(a,b,c,d,e)}function pi(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if("hidden"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},y(Ga,ba),ba|=c;
else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,y(Ga,ba),ba|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;y(Ga,ba);ba|=d}else null!==f?(d=f.baseLanes|c,b.memoizedState=null):d=c,y(Ga,ba),ba|=d;aa(a,b,e,c);return b.child}function qi(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function zf(a,
b,c,d,e){var f=ea(c)?pb:J.current;f=Nb(b,f);Sb(b,e);c=mf(a,b,c,d,f,e);d=nf();if(null!==a&&!ha)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,Qa(a,b,e);D&&d&&Ue(b);b.flags|=1;aa(a,b,c,e);return b.child}function ri(a,b,c,d,e){if(ea(c)){var f=!0;ld(b)}else f=!1;Sb(b,e);if(null===b.stateNode)Fd(a,b),ei(b,c,d),uf(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,n=c.contextType;"object"===typeof n&&null!==n?n=qa(n):(n=ea(c)?pb:J.current,n=Nb(b,
n));var l=c.getDerivedStateFromProps,m="function"===typeof l||"function"===typeof g.getSnapshotBeforeUpdate;m||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==d||k!==n)&&fi(b,g,d,n);gb=!1;var r=b.memoizedState;g.state=r;wd(b,d,g,e);k=b.memoizedState;h!==d||r!==k||S.current||gb?("function"===typeof l&&(tf(b,c,l,d),k=b.memoizedState),(h=gb||di(b,c,h,d,r,k,n))?(m||"function"!==typeof g.UNSAFE_componentWillMount&&"function"!==typeof g.componentWillMount||
("function"===typeof g.componentWillMount&&g.componentWillMount(),"function"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),"function"===typeof g.componentDidMount&&(b.flags|=4194308)):("function"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=n,d=h):("function"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;Fh(a,b);h=b.memoizedProps;n=b.type===b.elementType?h:ya(b.type,h);g.props=
n;m=b.pendingProps;r=g.context;k=c.contextType;"object"===typeof k&&null!==k?k=qa(k):(k=ea(c)?pb:J.current,k=Nb(b,k));var p=c.getDerivedStateFromProps;(l="function"===typeof p||"function"===typeof g.getSnapshotBeforeUpdate)||"function"!==typeof g.UNSAFE_componentWillReceiveProps&&"function"!==typeof g.componentWillReceiveProps||(h!==m||r!==k)&&fi(b,g,d,k);gb=!1;r=b.memoizedState;g.state=r;wd(b,d,g,e);var x=b.memoizedState;h!==m||r!==x||S.current||gb?("function"===typeof p&&(tf(b,c,p,d),x=b.memoizedState),
(n=gb||di(b,c,n,d,r,x,k)||!1)?(l||"function"!==typeof g.UNSAFE_componentWillUpdate&&"function"!==typeof g.componentWillUpdate||("function"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,x,k),"function"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,k)),"function"===typeof g.componentDidUpdate&&(b.flags|=4),"function"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=
4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=k,d=n):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),"function"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return Af(a,b,c,d,f,e)}function Af(a,b,c,d,e,f){qi(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&vh(b,c,!1),
Qa(a,b,f);d=b.stateNode;tk.current=b;var h=g&&"function"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Vb(b,a.child,null,f),b.child=Vb(b,null,h,f)):aa(a,b,h,f);b.memoizedState=d.state;e&&vh(b,c,!0);return b.child}function si(a){var b=a.stateNode;b.pendingContext?th(a,b.pendingContext,b.pendingContext!==b.context):b.context&&th(a,b.context,!1);gf(a,b.containerInfo)}function ti(a,b,c,d,e){Qb();Ye(e);b.flags|=256;aa(a,b,c,d);return b.child}function Bf(a){return{baseLanes:a,
cachePool:null,transitions:null}}function ui(a,b,c){var d=b.pendingProps,e=F.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;y(F,e&1);if(null===a){Xe(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:"$!"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:"hidden",children:g},0===(d&1)&&null!==
f?(f.childLanes=0,f.pendingProps=g):f=Gd(g,d,0,null),a=sb(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=Bf(c),b.memoizedState=Cf,a):Df(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return uk(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:"hidden",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=eb(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=eb(h,f):(f=
sb(f,g,c,null),f.flags|=2);f.return=b;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?Bf(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=Cf;return d}f=a.child;a=f.sibling;d=eb(f,{mode:"visible",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}
function Df(a,b,c){b=Gd({mode:"visible",children:b},a.mode,0,null);b.return=a;return a.child=b}function Hd(a,b,c,d){null!==d&&Ye(d);Vb(b,a.child,null,c);a=Df(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}function uk(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=vf(Error(m(422))),Hd(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=Gd({mode:"visible",children:d.children},e,0,null);f=sb(f,e,g,null);f.flags|=2;d.return=
b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Vb(b,a.child,null,g);b.child.memoizedState=Bf(g);b.memoizedState=Cf;return f}if(0===(b.mode&1))return Hd(a,b,g,null);if("$!"===e.data){d=e.nextSibling&&e.nextSibling.dataset;if(d)var h=d.dgst;d=h;f=Error(m(419));d=vf(f,d,void 0);return Hd(a,b,g,d)}h=0!==(g&a.childLanes);if(ha||h){d=O;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=
32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;0!==e&&e!==f.retryLane&&(f.retryLane=e,Oa(a,e),xa(d,a,e,-1))}Ef();d=vf(Error(m(421)));return Hd(a,b,g,d)}if("$?"===e.data)return b.flags|=128,b.child=a.child,b=vk.bind(null,a),e._reactRetry=b,null;a=f.treeContext;fa=Ka(e.nextSibling);la=b;D=!0;wa=null;null!==a&&(na[oa++]=Ma,na[oa++]=Na,na[oa++]=rb,Ma=a.id,Na=a.overflow,rb=b);b=Df(b,d.children);b.flags|=4096;return b}function vi(a,b,c){a.lanes|=b;var d=a.alternate;
null!==d&&(d.lanes|=b);df(a.return,b,c)}function Ff(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}function wi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;aa(a,b,d.children,c);d=F.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&
vi(a,c,b);else if(19===a.tag)vi(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}y(F,d);if(0===(b.mode&1))b.memoizedState=null;else switch(e){case "forwards":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===xd(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);Ff(b,!1,e,c,f);break;case "backwards":c=
null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===xd(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}Ff(b,!0,c,null,f);break;case "together":Ff(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}function Fd(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function Qa(a,b,c){null!==a&&(b.dependencies=a.dependencies);ra|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(m(153));if(null!==
b.child){a=b.child;c=eb(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=eb(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}function wk(a,b,c){switch(b.tag){case 3:si(b);Qb();break;case 5:Ih(b);break;case 1:ea(b.type)&&ld(b);break;case 4:gf(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;y(ud,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return y(F,F.current&
1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return ui(a,b,c);y(F,F.current&1);a=Qa(a,b,c);return null!==a?a.sibling:null}y(F,F.current&1);break;case 19:d=0!==(c&b.childLanes);if(0!==(a.flags&128)){if(d)return wi(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);y(F,F.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,pi(a,b,c)}return Qa(a,b,c)}function Dc(a,b){if(!D)switch(a.tailMode){case "hidden":b=a.tail;for(var c=null;null!==
b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case "collapsed":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}function W(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,
d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}function xk(a,b,c){var d=b.pendingProps;Ve(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return W(b),null;case 1:return ea(b.type)&&(v(S),v(J)),W(b),null;case 3:d=b.stateNode;Tb();v(S);v(J);jf();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)pd(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&
256)||(b.flags|=1024,null!==wa&&(Gf(wa),wa=null));xi(a,b);W(b);return null;case 5:hf(b);var e=ub(xc.current);c=b.type;if(null!==a&&null!=b.stateNode)yk(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(m(166));W(b);return null}a=ub(Ea.current);if(pd(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Da]=b;d[uc]=f;a=0!==(b.mode&1);switch(c){case "dialog":B("cancel",d);B("close",d);break;case "iframe":case "object":case "embed":B("load",d);break;
case "video":case "audio":for(e=0;e<Ec.length;e++)B(Ec[e],d);break;case "source":B("error",d);break;case "img":case "image":case "link":B("error",d);B("load",d);break;case "details":B("toggle",d);break;case "input":kg(d,f);B("invalid",d);break;case "select":d._wrapperState={wasMultiple:!!f.multiple};B("invalid",d);break;case "textarea":ng(d,f),B("invalid",d)}pe(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];"children"===g?"string"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&
jd(d.textContent,h,a),e=["children",h]):"number"===typeof h&&d.textContent!==""+h&&(!0!==f.suppressHydrationWarning&&jd(d.textContent,h,a),e=["children",""+h]):$b.hasOwnProperty(g)&&null!=h&&"onScroll"===g&&B("scroll",d)}switch(c){case "input":Pc(d);mg(d,f,!0);break;case "textarea":Pc(d);pg(d);break;case "select":case "option":break;default:"function"===typeof f.onClick&&(d.onclick=kd)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;"http://www.w3.org/1999/xhtml"===
a&&(a=qg(c));"http://www.w3.org/1999/xhtml"===a?"script"===c?(a=g.createElement("div"),a.innerHTML="<script>\x3c/script>",a=a.removeChild(a.firstChild)):"string"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),"select"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Da]=b;a[uc]=d;zk(a,b,!1,!1);b.stateNode=a;a:{g=qe(c,d);switch(c){case "dialog":B("cancel",a);B("close",a);e=d;break;case "iframe":case "object":case "embed":B("load",a);e=d;break;
case "video":case "audio":for(e=0;e<Ec.length;e++)B(Ec[e],a);e=d;break;case "source":B("error",a);e=d;break;case "img":case "image":case "link":B("error",a);B("load",a);e=d;break;case "details":B("toggle",a);e=d;break;case "input":kg(a,d);e=ke(a,d);B("invalid",a);break;case "option":e=d;break;case "select":a._wrapperState={wasMultiple:!!d.multiple};e=E({},d,{value:void 0});B("invalid",a);break;case "textarea":ng(a,d);e=ne(a,d);B("invalid",a);break;default:e=d}pe(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=
h[f];"style"===f?sg(a,k):"dangerouslySetInnerHTML"===f?(k=k?k.__html:void 0,null!=k&&yi(a,k)):"children"===f?"string"===typeof k?("textarea"!==c||""!==k)&&Fc(a,k):"number"===typeof k&&Fc(a,""+k):"suppressContentEditableWarning"!==f&&"suppressHydrationWarning"!==f&&"autoFocus"!==f&&($b.hasOwnProperty(f)?null!=k&&"onScroll"===f&&B("scroll",a):null!=k&&$d(a,f,k,g))}switch(c){case "input":Pc(a);mg(a,d,!1);break;case "textarea":Pc(a);pg(a);break;case "option":null!=d.value&&a.setAttribute("value",""+Ua(d.value));
break;case "select":a.multiple=!!d.multiple;f=d.value;null!=f?Db(a,!!d.multiple,f,!1):null!=d.defaultValue&&Db(a,!!d.multiple,d.defaultValue,!0);break;default:"function"===typeof e.onClick&&(a.onclick=kd)}switch(c){case "button":case "input":case "select":case "textarea":d=!!d.autoFocus;break a;case "img":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}W(b);return null;case 6:if(a&&null!=b.stateNode)Ak(a,b,a.memoizedProps,d);else{if("string"!==typeof d&&null===
b.stateNode)throw Error(m(166));c=ub(xc.current);ub(Ea.current);if(pd(b)){d=b.stateNode;c=b.memoizedProps;d[Da]=b;if(f=d.nodeValue!==c)if(a=la,null!==a)switch(a.tag){case 3:jd(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&jd(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Da]=b,b.stateNode=d}W(b);return null;case 13:v(F);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(D&&
null!==fa&&0!==(b.mode&1)&&0===(b.flags&128)){for(f=fa;f;)f=Ka(f.nextSibling);Qb();b.flags|=98560;f=!1}else if(f=pd(b),null!==d&&null!==d.dehydrated){if(null===a){if(!f)throw Error(m(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(m(317));f[Da]=b}else Qb(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;W(b);f=!1}else null!==wa&&(Gf(wa),wa=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&
d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(F.current&1)?0===L&&(L=3):Ef()));null!==b.updateQueue&&(b.flags|=4);W(b);return null;case 4:return Tb(),xi(a,b),null===a&&sc(b.stateNode.containerInfo),W(b),null;case 10:return cf(b.type._context),W(b),null;case 17:return ea(b.type)&&(v(S),v(J)),W(b),null;case 19:v(F);f=b.memoizedState;if(null===f)return W(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Dc(f,!1);else{if(0!==L||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=
xd(a);if(null!==g){b.flags|=128;Dc(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,g=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,
f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;y(F,F.current&1|2);return b.child}a=a.sibling}null!==f.tail&&P()>Hf&&(b.flags|=128,d=!0,Dc(f,!1),b.lanes=4194304)}else{if(!d)if(a=xd(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dc(f,!0),null===f.tail&&"hidden"===f.tailMode&&!g.alternate&&!D)return W(b),null}else 2*P()-f.renderingStartTime>Hf&&1073741824!==c&&(b.flags|=
128,d=!0,Dc(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=b,f.tail=b.sibling,f.renderingStartTime=P(),b.sibling=null,c=F.current,y(F,d?c&1|2:c&1),b;W(b);return null;case 22:case 23:return ba=Ga.current,v(Ga),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(ba&1073741824)&&(W(b),b.subtreeFlags&6&&(b.flags|=8192)):W(b),null;case 24:return null;
case 25:return null}throw Error(m(156,b.tag));}function Bk(a,b,c){Ve(b);switch(b.tag){case 1:return ea(b.type)&&(v(S),v(J)),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return Tb(),v(S),v(J),jf(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return hf(b),null;case 13:v(F);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(m(340));Qb()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return v(F),null;case 4:return Tb(),
null;case 10:return cf(b.type._context),null;case 22:case 23:return ba=Ga.current,v(Ga),null;case 24:return null;default:return null}}function Wb(a,b){var c=a.ref;if(null!==c)if("function"===typeof c)try{c(null)}catch(d){G(a,b,d)}else c.current=null}function If(a,b,c){try{c()}catch(d){G(a,b,d)}}function Ck(a,b){Jf=Zc;a=ch();if(Ie(a)){if("selectionStart"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();
if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(M){c=null;break a}var g=0,h=-1,k=-1,n=0,q=0,u=a,r=null;b:for(;;){for(var p;;){u!==c||0!==e&&3!==u.nodeType||(h=g+e);u!==f||0!==d&&3!==u.nodeType||(k=g+d);3===u.nodeType&&(g+=u.nodeValue.length);if(null===(p=u.firstChild))break;r=u;u=p}for(;;){if(u===a)break b;r===c&&++n===e&&(h=g);r===f&&++q===d&&(k=g);if(null!==(p=u.nextSibling))break;u=r;r=u.parentNode}u=p}c=-1===h||-1===k?null:
{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Kf={focusedElem:a,selectionRange:c};Zc=!1;for(l=b;null!==l;)if(b=l,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,l=a;else for(;null!==l;){b=l;try{var x=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;case 1:if(null!==x){var v=x.memoizedProps,z=x.memoizedState,w=b.stateNode,A=w.getSnapshotBeforeUpdate(b.elementType===b.type?v:ya(b.type,v),z);w.__reactInternalSnapshotBeforeUpdate=A}break;case 3:var t=
b.stateNode.containerInfo;1===t.nodeType?t.textContent="":9===t.nodeType&&t.documentElement&&t.removeChild(t.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(m(163));}}catch(M){G(b,b.return,M)}a=b.sibling;if(null!==a){a.return=b.return;l=a;break}l=b.return}x=zi;zi=!1;return x}function Gc(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&If(b,c,f)}e=e.next}while(e!==d)}}
function Id(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Lf(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}"function"===typeof b?b(a):b.current=a}}function Ai(a){var b=a.alternate;null!==b&&(a.alternate=null,Ai(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Da],delete b[uc],delete b[Me],delete b[Dk],
delete b[Ek]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Bi(a){return 5===a.tag||3===a.tag||4===a.tag}function Ci(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Bi(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&
2))return a.stateNode}}function Mf(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=kd));else if(4!==d&&(a=a.child,null!==a))for(Mf(a,b,c),a=a.sibling;null!==a;)Mf(a,b,c),a=a.sibling}function Nf(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);
else if(4!==d&&(a=a.child,null!==a))for(Nf(a,b,c),a=a.sibling;null!==a;)Nf(a,b,c),a=a.sibling}function jb(a,b,c){for(c=c.child;null!==c;)Di(a,b,c),c=c.sibling}function Di(a,b,c){if(Ca&&"function"===typeof Ca.onCommitFiberUnmount)try{Ca.onCommitFiberUnmount(Uc,c)}catch(h){}switch(c.tag){case 5:X||Wb(c,b);case 6:var d=T,e=za;T=null;jb(a,b,c);T=d;za=e;null!==T&&(za?(a=T,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):T.removeChild(c.stateNode));break;case 18:null!==T&&(za?
(a=T,c=c.stateNode,8===a.nodeType?Re(a.parentNode,c):1===a.nodeType&&Re(a,c),nc(a)):Re(T,c.stateNode));break;case 4:d=T;e=za;T=c.stateNode.containerInfo;za=!0;jb(a,b,c);T=d;za=e;break;case 0:case 11:case 14:case 15:if(!X&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?If(c,b,g):0!==(f&4)&&If(c,b,g));e=e.next}while(e!==d)}jb(a,b,c);break;case 1:if(!X&&(Wb(c,b),d=c.stateNode,"function"===typeof d.componentWillUnmount))try{d.props=
c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){G(c,b,h)}jb(a,b,c);break;case 21:jb(a,b,c);break;case 22:c.mode&1?(X=(d=X)||null!==c.memoizedState,jb(a,b,c),X=d):jb(a,b,c);break;default:jb(a,b,c)}}function Ei(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Fk);b.forEach(function(b){var d=Gk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}function Aa(a,b,c){c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=
c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:T=h.stateNode;za=!1;break a;case 3:T=h.stateNode.containerInfo;za=!0;break a;case 4:T=h.stateNode.containerInfo;za=!0;break a}h=h.return}if(null===T)throw Error(m(160));Di(f,g,e);T=null;za=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(n){G(e,b,n)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)Fi(b,a),b=b.sibling}function Fi(a,b,c){var d=a.alternate;c=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:Aa(b,a);
Ha(a);if(c&4){try{Gc(3,a,a.return),Id(3,a)}catch(I){G(a,a.return,I)}try{Gc(5,a,a.return)}catch(I){G(a,a.return,I)}}break;case 1:Aa(b,a);Ha(a);c&512&&null!==d&&Wb(d,d.return);break;case 5:Aa(b,a);Ha(a);c&512&&null!==d&&Wb(d,d.return);if(a.flags&32){var e=a.stateNode;try{Fc(e,"")}catch(I){G(a,a.return,I)}}if(c&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==d?d.memoizedProps:f,h=a.type,k=a.updateQueue;a.updateQueue=null;if(null!==k)try{"input"===h&&"radio"===f.type&&null!=f.name&&lg(e,f);
qe(h,g);var n=qe(h,f);for(g=0;g<k.length;g+=2){var q=k[g],u=k[g+1];"style"===q?sg(e,u):"dangerouslySetInnerHTML"===q?yi(e,u):"children"===q?Fc(e,u):$d(e,q,u,n)}switch(h){case "input":le(e,f);break;case "textarea":og(e,f);break;case "select":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var p=f.value;null!=p?Db(e,!!f.multiple,p,!1):r!==!!f.multiple&&(null!=f.defaultValue?Db(e,!!f.multiple,f.defaultValue,!0):Db(e,!!f.multiple,f.multiple?[]:"",!1))}e[uc]=f}catch(I){G(a,a.return,
I)}}break;case 6:Aa(b,a);Ha(a);if(c&4){if(null===a.stateNode)throw Error(m(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(I){G(a,a.return,I)}}break;case 3:Aa(b,a);Ha(a);if(c&4&&null!==d&&d.memoizedState.isDehydrated)try{nc(b.containerInfo)}catch(I){G(a,a.return,I)}break;case 4:Aa(b,a);Ha(a);break;case 13:Aa(b,a);Ha(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||null!==e.alternate&&null!==e.alternate.memoizedState||(Of=P()));c&4&&Ei(a);break;case 22:q=
null!==d&&null!==d.memoizedState;a.mode&1?(X=(n=X)||q,Aa(b,a),X=n):Aa(b,a);Ha(a);if(c&8192){n=null!==a.memoizedState;if((a.stateNode.isHidden=n)&&!q&&0!==(a.mode&1))for(l=a,q=a.child;null!==q;){for(u=l=q;null!==l;){r=l;p=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Gc(4,r,r.return);break;case 1:Wb(r,r.return);var x=r.stateNode;if("function"===typeof x.componentWillUnmount){c=r;b=r.return;try{d=c,x.props=d.memoizedProps,x.state=d.memoizedState,x.componentWillUnmount()}catch(I){G(c,b,I)}}break;
case 5:Wb(r,r.return);break;case 22:if(null!==r.memoizedState){Gi(u);continue}}null!==p?(p.return=r,l=p):Gi(u)}q=q.sibling}a:for(q=null,u=a;;){if(5===u.tag){if(null===q){q=u;try{e=u.stateNode,n?(f=e.style,"function"===typeof f.setProperty?f.setProperty("display","none","important"):f.display="none"):(h=u.stateNode,k=u.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty("display")?k.display:null,h.style.display=rg("display",g))}catch(I){G(a,a.return,I)}}}else if(6===u.tag){if(null===q)try{u.stateNode.nodeValue=
n?"":u.memoizedProps}catch(I){G(a,a.return,I)}}else if((22!==u.tag&&23!==u.tag||null===u.memoizedState||u===a)&&null!==u.child){u.child.return=u;u=u.child;continue}if(u===a)break a;for(;null===u.sibling;){if(null===u.return||u.return===a)break a;q===u&&(q=null);u=u.return}q===u&&(q=null);u.sibling.return=u.return;u=u.sibling}}break;case 19:Aa(b,a);Ha(a);c&4&&Ei(a);break;case 21:break;default:Aa(b,a),Ha(a)}}function Ha(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Bi(c)){var d=c;
break a}c=c.return}throw Error(m(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(Fc(e,""),d.flags&=-33);var f=Ci(a);Nf(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Ci(a);Mf(a,h,g);break;default:throw Error(m(161));}}catch(k){G(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function Hk(a,b,c){l=a;Hi(a,b,c)}function Hi(a,b,c){for(var d=0!==(a.mode&1);null!==l;){var e=l,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Jd;if(!g){var h=e.alternate,k=null!==h&&null!==
h.memoizedState||X;h=Jd;var n=X;Jd=g;if((X=k)&&!n)for(l=e;null!==l;)g=l,k=g.child,22===g.tag&&null!==g.memoizedState?Ii(e):null!==k?(k.return=g,l=k):Ii(e);for(;null!==f;)l=f,Hi(f,b,c),f=f.sibling;l=e;Jd=h;X=n}Ji(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,l=f):Ji(a,b,c)}}function Ji(a,b,c){for(;null!==l;){b=l;if(0!==(b.flags&8772)){c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:X||Id(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!X)if(null===c)d.componentDidMount();
else{var e=b.elementType===b.type?c.memoizedProps:ya(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&Hh(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=b.child.stateNode;break;case 1:c=b.child.stateNode}Hh(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case "button":case "input":case "select":case "textarea":k.autoFocus&&
c.focus();break;case "img":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var n=b.alternate;if(null!==n){var q=n.memoizedState;if(null!==q){var p=q.dehydrated;null!==p&&nc(p)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(m(163));}X||b.flags&512&&Lf(b)}catch(r){G(b,b.return,r)}}if(b===a){l=null;break}c=b.sibling;if(null!==c){c.return=b.return;l=c;break}l=b.return}}function Gi(a){for(;null!==l;){var b=l;if(b===
a){l=null;break}var c=b.sibling;if(null!==c){c.return=b.return;l=c;break}l=b.return}}function Ii(a){for(;null!==l;){var b=l;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Id(4,b)}catch(k){G(b,c,k)}break;case 1:var d=b.stateNode;if("function"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){G(b,e,k)}}var f=b.return;try{Lf(b)}catch(k){G(b,f,k)}break;case 5:var g=b.return;try{Lf(b)}catch(k){G(b,g,k)}}}catch(k){G(b,b.return,k)}if(b===a){l=null;break}var h=b.sibling;
if(null!==h){h.return=b.return;l=h;break}l=b.return}}function Hc(){Hf=P()+500}function Z(){return 0!==(p&6)?P():-1!==Kd?Kd:Kd=P()}function hb(a){if(0===(a.mode&1))return 1;if(0!==(p&2)&&0!==U)return U&-U;if(null!==Ik.transition)return 0===Ld&&(Ld=Dg()),Ld;a=z;if(0!==a)return a;a=window.event;a=void 0===a?16:Lg(a.type);return a}function xa(a,b,c,d){if(50<Ic)throw Ic=0,Pf=null,Error(m(185));ic(a,c,d);if(0===(p&2)||a!==O)a===O&&(0===(p&2)&&(Md|=c),4===L&&kb(a,U)),ia(a,d),1===c&&0===p&&0===(b.mode&1)&&
(Hc(),md&&db())}function ia(a,b){var c=a.callbackNode;tj(a,b);var d=Vc(a,a===O?U:0);if(0===d)null!==c&&Ki(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&Ki(c);if(1===b)0===a.tag?jk(Li.bind(null,a)):wh(Li.bind(null,a)),Jk(function(){0===(p&6)&&db()}),c=null;else{switch(Eg(d)){case 1:c=De;break;case 4:c=Mg;break;case 16:c=ad;break;case 536870912:c=Ng;break;default:c=ad}c=Mi(c,Ni.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}function Ni(a,b){Kd=-1;
Ld=0;if(0!==(p&6))throw Error(m(327));var c=a.callbackNode;if(Xb()&&a.callbackNode!==c)return null;var d=Vc(a,a===O?U:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Nd(a,d);else{b=d;var e=p;p|=2;var f=Oi();if(O!==a||U!==b)Ra=null,Hc(),wb(a,b);do try{Kk();break}catch(h){Pi(a,h)}while(1);af();Od.current=f;p=e;null!==H?b=0:(O=null,U=0,b=L)}if(0!==b){2===b&&(e=ve(a),0!==e&&(d=e,b=Qf(a,e)));if(1===b)throw c=Jc,wb(a,0),kb(a,d),ia(a,P()),c;if(6===b)kb(a,d);else{e=a.current.alternate;
if(0===(d&30)&&!Lk(e)&&(b=Nd(a,d),2===b&&(f=ve(a),0!==f&&(d=f,b=Qf(a,f))),1===b))throw c=Jc,wb(a,0),kb(a,d),ia(a,P()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(m(345));case 2:xb(a,ja,Ra);break;case 3:kb(a,d);if((d&130023424)===d&&(b=Of+500-P(),10<b)){if(0!==Vc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){Z();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Rf(xb.bind(null,a,ja,Ra),b);break}xb(a,ja,Ra);break;case 4:kb(a,d);if((d&4194240)===d)break;b=a.eventTimes;
for(e=-1;0<d;){var g=31-ta(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=P()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*Mk(d/1960))-d;if(10<d){a.timeoutHandle=Rf(xb.bind(null,a,ja,Ra),d);break}xb(a,ja,Ra);break;case 5:xb(a,ja,Ra);break;default:throw Error(m(329));}}}ia(a,P());return a.callbackNode===c?Ni.bind(null,a):null}function Qf(a,b){var c=Kc;a.current.memoizedState.isDehydrated&&(wb(a,b).flags|=256);a=Nd(a,b);2!==a&&(b=ja,ja=c,null!==b&&Gf(b));return a}function Gf(a){null===
ja?ja=a:ja.push.apply(ja,a)}function Lk(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!ua(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}function kb(a,b){b&=~Sf;b&=~Md;a.suspendedLanes|=b;a.pingedLanes&=
~b;for(a=a.expirationTimes;0<b;){var c=31-ta(b),d=1<<c;a[c]=-1;b&=~d}}function Li(a){if(0!==(p&6))throw Error(m(327));Xb();var b=Vc(a,0);if(0===(b&1))return ia(a,P()),null;var c=Nd(a,b);if(0!==a.tag&&2===c){var d=ve(a);0!==d&&(b=d,c=Qf(a,d))}if(1===c)throw c=Jc,wb(a,0),kb(a,b),ia(a,P()),c;if(6===c)throw Error(m(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;xb(a,ja,Ra);ia(a,P());return null}function Tf(a,b){var c=p;p|=1;try{return a(b)}finally{p=c,0===p&&(Hc(),md&&db())}}function yb(a){null!==
lb&&0===lb.tag&&0===(p&6)&&Xb();var b=p;p|=1;var c=ca.transition,d=z;try{if(ca.transition=null,z=1,a)return a()}finally{z=d,ca.transition=c,p=b,0===(p&6)&&db()}}function wb(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Nk(c));if(null!==H)for(c=H.return;null!==c;){var d=c;Ve(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&(v(S),v(J));break;case 3:Tb();v(S);v(J);jf();break;case 5:hf(d);break;case 4:Tb();break;case 13:v(F);break;
case 19:v(F);break;case 10:cf(d.type._context);break;case 22:case 23:ba=Ga.current,v(Ga)}c=c.return}O=a;H=a=eb(a.current,null);U=ba=b;L=0;Jc=null;Sf=Md=ra=0;ja=Kc=null;if(null!==tb){for(b=0;b<tb.length;b++)if(c=tb[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}tb=null}return a}function Pi(a,b){do{var c=H;try{af();yd.current=zd;if(Ad){for(var d=C.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Ad=
!1}vb=0;N=K=C=null;zc=!1;Ac=0;Uf.current=null;if(null===c||null===c.return){L=1;Jc=b;H=null;break}a:{var f=a,g=c.return,h=c,k=b;b=U;h.flags|=32768;if(null!==k&&"object"===typeof k&&"function"===typeof k.then){var n=k,l=h,p=l.tag;if(0===(l.mode&1)&&(0===p||11===p||15===p)){var r=l.alternate;r?(l.updateQueue=r.updateQueue,l.memoizedState=r.memoizedState,l.lanes=r.lanes):(l.updateQueue=null,l.memoizedState=null)}var v=ji(g);if(null!==v){v.flags&=-257;ki(v,g,h,f,b);v.mode&1&&ii(f,n,b);b=v;k=n;var x=b.updateQueue;
if(null===x){var z=new Set;z.add(k);b.updateQueue=z}else x.add(k);break a}else{if(0===(b&1)){ii(f,n,b);Ef();break a}k=Error(m(426))}}else if(D&&h.mode&1){var y=ji(g);if(null!==y){0===(y.flags&65536)&&(y.flags|=256);ki(y,g,h,f,b);Ye(Ub(k,h));break a}}f=k=Ub(k,h);4!==L&&(L=2);null===Kc?Kc=[f]:Kc.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;b&=-b;f.lanes|=b;var w=gi(f,k,b);Gh(f,w);break a;case 1:h=k;var A=f.type,t=f.stateNode;if(0===(f.flags&128)&&("function"===typeof A.getDerivedStateFromError||
null!==t&&"function"===typeof t.componentDidCatch&&(null===ib||!ib.has(t)))){f.flags|=65536;b&=-b;f.lanes|=b;var B=hi(f,h,b);Gh(f,B);break a}}f=f.return}while(null!==f)}Qi(c)}catch(ma){b=ma;H===c&&null!==c&&(H=c=c.return);continue}break}while(1)}function Oi(){var a=Od.current;Od.current=zd;return null===a?zd:a}function Ef(){if(0===L||3===L||2===L)L=4;null===O||0===(ra&268435455)&&0===(Md&268435455)||kb(O,U)}function Nd(a,b){var c=p;p|=2;var d=Oi();if(O!==a||U!==b)Ra=null,wb(a,b);do try{Ok();break}catch(e){Pi(a,
e)}while(1);af();p=c;Od.current=d;if(null!==H)throw Error(m(261));O=null;U=0;return L}function Ok(){for(;null!==H;)Ri(H)}function Kk(){for(;null!==H&&!Pk();)Ri(H)}function Ri(a){var b=Qk(a.alternate,a,ba);a.memoizedProps=a.pendingProps;null===b?Qi(a):H=b;Uf.current=null}function Qi(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=xk(c,b,ba),null!==c){H=c;return}}else{c=Bk(c,b);if(null!==c){c.flags&=32767;H=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;
else{L=6;H=null;return}}b=b.sibling;if(null!==b){H=b;return}H=b=a}while(null!==b);0===L&&(L=5)}function xb(a,b,c){var d=z,e=ca.transition;try{ca.transition=null,z=1,Rk(a,b,c,d)}finally{ca.transition=e,z=d}return null}function Rk(a,b,c,d){do Xb();while(null!==lb);if(0!==(p&6))throw Error(m(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(m(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;
uj(a,f);a===O&&(H=O=null,U=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||Pd||(Pd=!0,Mi(ad,function(){Xb();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=ca.transition;ca.transition=null;var g=z;z=1;var h=p;p|=4;Uf.current=null;Ck(a,c);Fi(c,a);Tj(Kf);Zc=!!Jf;Kf=Jf=null;a.current=c;Hk(c,a,e);Sk();p=h;z=g;ca.transition=f}else a.current=c;Pd&&(Pd=!1,lb=a,Qd=e);f=a.pendingLanes;0===f&&(ib=null);oj(c.stateNode,d);ia(a,P());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=
b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Ed)throw Ed=!1,a=xf,xf=null,a;0!==(Qd&1)&&0!==a.tag&&Xb();f=a.pendingLanes;0!==(f&1)?a===Pf?Ic++:(Ic=0,Pf=a):Ic=0;db();return null}function Xb(){if(null!==lb){var a=Eg(Qd),b=ca.transition,c=z;try{ca.transition=null;z=16>a?16:a;if(null===lb)var d=!1;else{a=lb;lb=null;Qd=0;if(0!==(p&6))throw Error(m(331));var e=p;p|=4;for(l=a.current;null!==l;){var f=l,g=f.child;if(0!==(l.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var n=
h[k];for(l=n;null!==l;){var q=l;switch(q.tag){case 0:case 11:case 15:Gc(8,q,f)}var u=q.child;if(null!==u)u.return=q,l=u;else for(;null!==l;){q=l;var r=q.sibling,v=q.return;Ai(q);if(q===n){l=null;break}if(null!==r){r.return=v;l=r;break}l=v}}}var x=f.alternate;if(null!==x){var y=x.child;if(null!==y){x.child=null;do{var C=y.sibling;y.sibling=null;y=C}while(null!==y)}}l=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,l=g;else b:for(;null!==l;){f=l;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Gc(9,
f,f.return)}var w=f.sibling;if(null!==w){w.return=f.return;l=w;break b}l=f.return}}var A=a.current;for(l=A;null!==l;){g=l;var t=g.child;if(0!==(g.subtreeFlags&2064)&&null!==t)t.return=g,l=t;else b:for(g=A;null!==l;){h=l;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Id(9,h)}}catch(ma){G(h,h.return,ma)}if(h===g){l=null;break b}var B=h.sibling;if(null!==B){B.return=h.return;l=B;break b}l=h.return}}p=e;db();if(Ca&&"function"===typeof Ca.onPostCommitFiberRoot)try{Ca.onPostCommitFiberRoot(Uc,
a)}catch(ma){}d=!0}return d}finally{z=c,ca.transition=b}}return!1}function Si(a,b,c){b=Ub(c,b);b=gi(a,b,1);a=fb(a,b,1);b=Z();null!==a&&(ic(a,1,b),ia(a,b))}function G(a,b,c){if(3===a.tag)Si(a,a,c);else for(;null!==b;){if(3===b.tag){Si(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if("function"===typeof b.type.getDerivedStateFromError||"function"===typeof d.componentDidCatch&&(null===ib||!ib.has(d))){a=Ub(c,a);a=hi(b,a,1);b=fb(b,a,1);a=Z();null!==b&&(ic(b,1,a),ia(b,a));break}}b=b.return}}function sk(a,
b,c){var d=a.pingCache;null!==d&&d.delete(b);b=Z();a.pingedLanes|=a.suspendedLanes&c;O===a&&(U&c)===c&&(4===L||3===L&&(U&130023424)===U&&500>P()-Of?wb(a,0):Sf|=c);ia(a,b)}function Ti(a,b){0===b&&(0===(a.mode&1)?b=1:(b=Rd,Rd<<=1,0===(Rd&130023424)&&(Rd=4194304)));var c=Z();a=Oa(a,b);null!==a&&(ic(a,b,c),ia(a,c))}function vk(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Ti(a,c)}function Gk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);
break;case 19:d=a.stateNode;break;default:throw Error(m(314));}null!==d&&d.delete(b);Ti(a,c)}function Mi(a,b){return xh(a,b)}function Tk(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function yf(a){a=
a.prototype;return!(!a||!a.isReactComponent)}function Uk(a){if("function"===typeof a)return yf(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===ie)return 11;if(a===je)return 14}return 2}function eb(a,b){var c=a.alternate;null===c?(c=pa(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=
a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}function rd(a,b,c,d,e,f){var g=2;d=a;if("function"===typeof a)yf(a)&&(g=1);else if("string"===typeof a)g=5;else a:switch(a){case Bb:return sb(c.children,e,f,b);case fe:g=8;e|=8;break;case ee:return a=pa(12,c,b,e|2),a.elementType=ee,a.lanes=f,a;case ge:return a=
pa(13,c,b,e),a.elementType=ge,a.lanes=f,a;case he:return a=pa(19,c,b,e),a.elementType=he,a.lanes=f,a;case Ui:return Gd(c,e,f,b);default:if("object"===typeof a&&null!==a)switch(a.$$typeof){case hg:g=10;break a;case gg:g=9;break a;case ie:g=11;break a;case je:g=14;break a;case Ta:g=16;d=null;break a}throw Error(m(130,null==a?a:typeof a,""));}b=pa(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function sb(a,b,c,d){a=pa(7,a,d,b);a.lanes=c;return a}function Gd(a,b,c,d){a=pa(22,a,d,b);a.elementType=
Ui;a.lanes=c;a.stateNode={isHidden:!1};return a}function Ze(a,b,c){a=pa(6,a,null,b);a.lanes=c;return a}function $e(a,b,c){b=pa(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}function Vk(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=
0;this.eventTimes=we(0);this.expirationTimes=we(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=we(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=null}function Vf(a,b,c,d,e,f,g,h,k,l){a=new Vk(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=pa(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,
pendingSuspenseBoundaries:null};ff(f);return a}function Wk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:Cb,key:null==d?null:""+d,children:a,containerInfo:b,implementation:c}}function Vi(a){if(!a)return cb;a=a._reactInternals;a:{if(nb(a)!==a||1!==a.tag)throw Error(m(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(ea(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(m(171));
}if(1===a.tag){var c=a.type;if(ea(c))return uh(a,c,b)}return b}function Wi(a,b,c,d,e,f,g,h,k,l){a=Vf(c,d,!0,a,e,f,g,h,k);a.context=Vi(null);c=a.current;d=Z();e=hb(c);f=Pa(d,e);f.callback=void 0!==b&&null!==b?b:null;fb(c,f,e);a.current.lanes=e;ic(a,e,d);ia(a,d);return a}function Sd(a,b,c,d){var e=b.current,f=Z(),g=hb(e);c=Vi(c);null===b.context?b.context=c:b.pendingContext=c;b=Pa(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=fb(e,b,g);null!==a&&(xa(a,e,g,f),vd(a,e,g));return g}
function Td(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function Xi(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function Wf(a,b){Xi(a,b);(a=a.alternate)&&Xi(a,b)}function Xk(a){a=Bg(a);return null===a?null:a.stateNode}function Yk(a){return null}function Xf(a){this._internalRoot=a}function Ud(a){this._internalRoot=a}function Yf(a){return!(!a||1!==a.nodeType&&9!==
a.nodeType&&11!==a.nodeType)}function Vd(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||" react-mount-point-unstable "!==a.nodeValue))}function Yi(){}function Zk(a,b,c,d,e){if(e){if("function"===typeof d){var f=d;d=function(){var a=Td(g);f.call(a)}}var g=Wi(b,d,a,0,null,!1,!1,"",Yi);a._reactRootContainer=g;a[Ja]=g.current;sc(8===a.nodeType?a.parentNode:a);yb();return g}for(;e=a.lastChild;)a.removeChild(e);if("function"===typeof d){var h=d;d=function(){var a=Td(k);
h.call(a)}}var k=Vf(a,0,!1,null,null,!1,!1,"",Yi);a._reactRootContainer=k;a[Ja]=k.current;sc(8===a.nodeType?a.parentNode:a);yb(function(){Sd(b,k,c,d)});return k}function Wd(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if("function"===typeof e){var h=e;e=function(){var a=Td(g);h.call(a)}}Sd(b,g,a,e)}else g=Zk(c,b,a,e,d);return Td(g)}var cg=new Set,$b={},Ia=!("undefined"===typeof window||"undefined"===typeof window.document||"undefined"===typeof window.document.createElement),Zd=Object.prototype.hasOwnProperty,
cj=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,eg={},dg={},R={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(a){R[a]=
new Y(a,0,!1,a,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(a){var b=a[0];R[b]=new Y(b,1,!1,a[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(a){R[a]=new Y(a,2,!1,a.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(a){R[a]=new Y(a,2,!1,a,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(a){R[a]=
new Y(a,3,!1,a.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(a){R[a]=new Y(a,3,!0,a,null,!1,!1)});["capture","download"].forEach(function(a){R[a]=new Y(a,4,!1,a,null,!1,!1)});["cols","rows","size","span"].forEach(function(a){R[a]=new Y(a,6,!1,a,null,!1,!1)});["rowSpan","start"].forEach(function(a){R[a]=new Y(a,5,!1,a.toLowerCase(),null,!1,!1)});var Zf=/[\-:]([a-z])/g,$f=function(a){return a[1].toUpperCase()};"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(a){var b=
a.replace(Zf,$f);R[b]=new Y(b,1,!1,a,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(a){var b=a.replace(Zf,$f);R[b]=new Y(b,1,!1,a,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(a){var b=a.replace(Zf,$f);R[b]=new Y(b,1,!1,a,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(a){R[a]=new Y(a,1,!1,a.toLowerCase(),null,!1,!1)});R.xlinkHref=new Y("xlinkHref",
1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(a){R[a]=new Y(a,1,!1,a.toLowerCase(),null,!0,!0)});var Sa=zb.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,sd=Symbol.for("react.element"),Cb=Symbol.for("react.portal"),Bb=Symbol.for("react.fragment"),fe=Symbol.for("react.strict_mode"),ee=Symbol.for("react.profiler"),hg=Symbol.for("react.provider"),gg=Symbol.for("react.context"),ie=Symbol.for("react.forward_ref"),ge=Symbol.for("react.suspense"),
he=Symbol.for("react.suspense_list"),je=Symbol.for("react.memo"),Ta=Symbol.for("react.lazy");Symbol.for("react.scope");Symbol.for("react.debug_trace_mode");var Ui=Symbol.for("react.offscreen");Symbol.for("react.legacy_hidden");Symbol.for("react.cache");Symbol.for("react.tracing_marker");var fg=Symbol.iterator,E=Object.assign,ae,ce=!1,cc=Array.isArray,Xd,yi=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,
c,d,e)})}:a}(function(a,b){if("http://www.w3.org/2000/svg"!==a.namespaceURI||"innerHTML"in a)a.innerHTML=b;else{Xd=Xd||document.createElement("div");Xd.innerHTML="<svg>"+b.valueOf().toString()+"</svg>";for(b=Xd.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}}),Fc=function(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b},dc={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,
borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,
strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},$k=["Webkit","ms","Moz","O"];Object.keys(dc).forEach(function(a){$k.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);dc[b]=dc[a]})});var ij=E({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0}),ze=null,se=null,Eb=null,Fb=null,xg=function(a,b){return a(b)},yg=function(){},te=!1,Oe=!1;if(Ia)try{var Lc={};Object.defineProperty(Lc,
"passive",{get:function(){Oe=!0}});window.addEventListener("test",Lc,Lc);window.removeEventListener("test",Lc,Lc)}catch(a){Oe=!1}var kj=function(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(q){this.onError(q)}},gc=!1,Sc=null,Tc=!1,ue=null,lj={onError:function(a){gc=!0;Sc=a}},Ba=zb.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.Scheduler,Jg=Ba.unstable_scheduleCallback,Kg=Ba.unstable_NormalPriority,xh=Jg,Ki=Ba.unstable_cancelCallback,Pk=Ba.unstable_shouldYield,
Sk=Ba.unstable_requestPaint,P=Ba.unstable_now,Dj=Ba.unstable_getCurrentPriorityLevel,De=Ba.unstable_ImmediatePriority,Mg=Ba.unstable_UserBlockingPriority,ad=Kg,Ej=Ba.unstable_LowPriority,Ng=Ba.unstable_IdlePriority,Uc=null,Ca=null,ta=Math.clz32?Math.clz32:pj,qj=Math.log,rj=Math.LN2,Wc=64,Rd=4194304,z=0,Ae=!1,Yc=[],Va=null,Wa=null,Xa=null,jc=new Map,kc=new Map,Ya=[],Bj="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit".split(" "),
Gb=Sa.ReactCurrentBatchConfig,Zc=!0,$c=null,Za=null,Ee=null,bd=null,Yb={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},He=ka(Yb),Mc=E({},Yb,{view:0,detail:0}),ak=ka(Mc),ag,bg,Nc,Yd=E({},Mc,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:Fe,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:
a.relatedTarget},movementX:function(a){if("movementX"in a)return a.movementX;a!==Nc&&(Nc&&"mousemove"===a.type?(ag=a.screenX-Nc.screenX,bg=a.screenY-Nc.screenY):bg=ag=0,Nc=a);return ag},movementY:function(a){return"movementY"in a?a.movementY:bg}}),ih=ka(Yd),al=E({},Yd,{dataTransfer:0}),Wj=ka(al),bl=E({},Mc,{relatedTarget:0}),Pe=ka(bl),cl=E({},Yb,{animationName:0,elapsedTime:0,pseudoElement:0}),Yj=ka(cl),dl=E({},Yb,{clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}}),
ck=ka(dl),el=E({},Yb,{data:0}),qh=ka(el),fk=qh,fl={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},gl={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",
112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},Gj={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"},hl=E({},Mc,{key:function(a){if(a.key){var b=fl[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=cd(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?gl[a.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,
metaKey:0,repeat:0,locale:0,getModifierState:Fe,charCode:function(a){return"keypress"===a.type?cd(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"===a.type?cd(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}}),Vj=ka(hl),il=E({},Yd,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),nh=ka(il),jl=E({},Mc,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,
ctrlKey:0,shiftKey:0,getModifierState:Fe}),Xj=ka(jl),kl=E({},Yb,{propertyName:0,elapsedTime:0,pseudoElement:0}),Zj=ka(kl),ll=E({},Yd,{deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),bk=ka(ll),Hj=[9,13,27,32],Ge=Ia&&"CompositionEvent"in window,Oc=null;Ia&&"documentMode"in document&&(Oc=document.documentMode);var ek=Ia&&"TextEvent"in
window&&!Oc,Ug=Ia&&(!Ge||Oc&&8<Oc&&11>=Oc),Tg=String.fromCharCode(32),Sg=!1,Hb=!1,Kj={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0},oc=null,pc=null,ph=!1;Ia&&(ph=Lj("input")&&(!document.documentMode||9<document.documentMode));var ua="function"===typeof Object.is?Object.is:Sj,dk=Ia&&"documentMode"in document&&11>=document.documentMode,Jb=null,Ke=null,rc=null,Je=!1,Kb={animationend:gd("Animation","AnimationEnd"),
animationiteration:gd("Animation","AnimationIteration"),animationstart:gd("Animation","AnimationStart"),transitionend:gd("Transition","TransitionEnd")},Le={},eh={};Ia&&(eh=document.createElement("div").style,"AnimationEvent"in window||(delete Kb.animationend.animation,delete Kb.animationiteration.animation,delete Kb.animationstart.animation),"TransitionEvent"in window||delete Kb.transitionend.transition);var jh=hd("animationend"),kh=hd("animationiteration"),lh=hd("animationstart"),mh=hd("transitionend"),
fh=new Map,Zi="abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");
(function(){for(var a=0;a<Zi.length;a++){var b=Zi[a],c=b.toLowerCase();b=b[0].toUpperCase()+b.slice(1);$a(c,"on"+b)}$a(jh,"onAnimationEnd");$a(kh,"onAnimationIteration");$a(lh,"onAnimationStart");$a("dblclick","onDoubleClick");$a("focusin","onFocus");$a("focusout","onBlur");$a(mh,"onTransitionEnd")})();Ab("onMouseEnter",["mouseout","mouseover"]);Ab("onMouseLeave",["mouseout","mouseover"]);Ab("onPointerEnter",["pointerout","pointerover"]);Ab("onPointerLeave",["pointerout","pointerover"]);mb("onChange",
"change click focusin focusout input keydown keyup selectionchange".split(" "));mb("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" "));mb("onBeforeInput",["compositionend","keypress","textInput","paste"]);mb("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" "));mb("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" "));mb("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));
var Ec="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Uj=new Set("cancel close invalid load scroll toggle".split(" ").concat(Ec)),id="_reactListening"+Math.random().toString(36).slice(2),gk=/\r\n?/g,hk=/\u0000|\uFFFD/g,Jf=null,Kf=null,Rf="function"===typeof setTimeout?setTimeout:void 0,Nk="function"===typeof clearTimeout?
clearTimeout:void 0,$i="function"===typeof Promise?Promise:void 0,Jk="function"===typeof queueMicrotask?queueMicrotask:"undefined"!==typeof $i?function(a){return $i.resolve(null).then(a).catch(ik)}:Rf,Zb=Math.random().toString(36).slice(2),Da="__reactFiber$"+Zb,uc="__reactProps$"+Zb,Ja="__reactContainer$"+Zb,Me="__reactEvents$"+Zb,Dk="__reactListeners$"+Zb,Ek="__reactHandles$"+Zb,Se=[],Mb=-1,cb={},J=bb(cb),S=bb(!1),pb=cb,La=null,md=!1,Te=!1,Ob=[],Pb=0,od=null,nd=0,na=[],oa=0,rb=null,Ma=1,Na="",la=
null,fa=null,D=!1,wa=null,Ik=Sa.ReactCurrentBatchConfig,Vb=Dh(!0),li=Dh(!1),ud=bb(null),td=null,Rb=null,bf=null,tb=null,kk=Oa,gb=!1,wc={},Ea=bb(wc),yc=bb(wc),xc=bb(wc),F=bb(0),kf=[],yd=Sa.ReactCurrentDispatcher,sf=Sa.ReactCurrentBatchConfig,vb=0,C=null,K=null,N=null,Ad=!1,zc=!1,Ac=0,ml=0,zd={readContext:qa,useCallback:V,useContext:V,useEffect:V,useImperativeHandle:V,useInsertionEffect:V,useLayoutEffect:V,useMemo:V,useReducer:V,useRef:V,useState:V,useDebugValue:V,useDeferredValue:V,useTransition:V,
useMutableSource:V,useSyncExternalStore:V,useId:V,unstable_isNewReconciler:!1},lk={readContext:qa,useCallback:function(a,b){Fa().memoizedState=[a,void 0===b?null:b];return a},useContext:qa,useEffect:Sh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Bd(4194308,4,Vh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Bd(4194308,4,a,b)},useInsertionEffect:function(a,b){return Bd(4,2,a,b)},useMemo:function(a,b){var c=Fa();b=void 0===b?null:b;a=a();c.memoizedState=
[a,b];return a},useReducer:function(a,b,c){var d=Fa();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=qk.bind(null,C,a);return[d.memoizedState,a]},useRef:function(a){var b=Fa();a={current:a};return b.memoizedState=a},useState:Qh,useDebugValue:rf,useDeferredValue:function(a){return Fa().memoizedState=a},useTransition:function(){var a=Qh(!1),b=a[0];a=pk.bind(null,a[1]);Fa().memoizedState=
a;return[b,a]},useMutableSource:function(a,b,c){},useSyncExternalStore:function(a,b,c){var d=C,e=Fa();if(D){if(void 0===c)throw Error(m(407));c=c()}else{c=b();if(null===O)throw Error(m(349));0!==(vb&30)||Nh(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;Sh(Lh.bind(null,d,f,a),[a]);d.flags|=2048;Cc(9,Mh.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Fa(),b=O.identifierPrefix;if(D){var c=Na;var d=Ma;c=(d&~(1<<32-ta(d)-1)).toString(32)+c;b=":"+b+"R"+c;c=Ac++;0<c&&
(b+="H"+c.toString(32));b+=":"}else c=ml++,b=":"+b+"r"+c.toString(32)+":";return a.memoizedState=b},unstable_isNewReconciler:!1},mk={readContext:qa,useCallback:Xh,useContext:qa,useEffect:qf,useImperativeHandle:Wh,useInsertionEffect:Th,useLayoutEffect:Uh,useMemo:Yh,useReducer:of,useRef:Rh,useState:function(a){return of(Bc)},useDebugValue:rf,useDeferredValue:function(a){var b=sa();return Zh(b,K.memoizedState,a)},useTransition:function(){var a=of(Bc)[0],b=sa().memoizedState;return[a,b]},useMutableSource:Jh,
useSyncExternalStore:Kh,useId:$h,unstable_isNewReconciler:!1},nk={readContext:qa,useCallback:Xh,useContext:qa,useEffect:qf,useImperativeHandle:Wh,useInsertionEffect:Th,useLayoutEffect:Uh,useMemo:Yh,useReducer:pf,useRef:Rh,useState:function(a){return pf(Bc)},useDebugValue:rf,useDeferredValue:function(a){var b=sa();return null===K?b.memoizedState=a:Zh(b,K.memoizedState,a)},useTransition:function(){var a=pf(Bc)[0],b=sa().memoizedState;return[a,b]},useMutableSource:Jh,useSyncExternalStore:Kh,useId:$h,
unstable_isNewReconciler:!1},Dd={isMounted:function(a){return(a=a._reactInternals)?nb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=Z(),e=hb(a),f=Pa(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=fb(a,f,e);null!==b&&(xa(b,a,e,d),vd(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=Z(),e=hb(a),f=Pa(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=fb(a,f,e);null!==b&&(xa(b,a,e,d),vd(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;
var c=Z(),d=hb(a),e=Pa(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=fb(a,e,d);null!==b&&(xa(b,a,d,c),vd(b,a,d))}},rk="function"===typeof WeakMap?WeakMap:Map,tk=Sa.ReactCurrentOwner,ha=!1,Cf={dehydrated:null,treeContext:null,retryLane:0};var zk=function(a,b,c,d){for(c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=
c.return;c=c.sibling}};var xi=function(a,b){};var yk=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){a=b.stateNode;ub(Ea.current);e=null;switch(c){case "input":f=ke(a,f);d=ke(a,d);e=[];break;case "select":f=E({},f,{value:void 0});d=E({},d,{value:void 0});e=[];break;case "textarea":f=ne(a,f);d=ne(a,d);e=[];break;default:"function"!==typeof f.onClick&&"function"===typeof d.onClick&&(a.onclick=kd)}pe(c,d);var g;c=null;for(l in f)if(!d.hasOwnProperty(l)&&f.hasOwnProperty(l)&&null!=f[l])if("style"===
l){var h=f[l];for(g in h)h.hasOwnProperty(g)&&(c||(c={}),c[g]="")}else"dangerouslySetInnerHTML"!==l&&"children"!==l&&"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&"autoFocus"!==l&&($b.hasOwnProperty(l)?e||(e=[]):(e=e||[]).push(l,null));for(l in d){var k=d[l];h=null!=f?f[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if("style"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]="");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||
(c={}),c[g]=k[g])}else c||(e||(e=[]),e.push(l,c)),c=k;else"dangerouslySetInnerHTML"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(e=e||[]).push(l,k)):"children"===l?"string"!==typeof k&&"number"!==typeof k||(e=e||[]).push(l,""+k):"suppressContentEditableWarning"!==l&&"suppressHydrationWarning"!==l&&($b.hasOwnProperty(l)?(null!=k&&"onScroll"===l&&B("scroll",a),e||h===k||(e=[])):(e=e||[]).push(l,k))}c&&(e=e||[]).push("style",c);var l=e;if(b.updateQueue=l)b.flags|=4}};var Ak=function(a,
b,c,d){c!==d&&(b.flags|=4)};var Jd=!1,X=!1,Fk="function"===typeof WeakSet?WeakSet:Set,l=null,zi=!1,T=null,za=!1,Mk=Math.ceil,Od=Sa.ReactCurrentDispatcher,Uf=Sa.ReactCurrentOwner,ca=Sa.ReactCurrentBatchConfig,p=0,O=null,H=null,U=0,ba=0,Ga=bb(0),L=0,Jc=null,ra=0,Md=0,Sf=0,Kc=null,ja=null,Of=0,Hf=Infinity,Ra=null,Ed=!1,xf=null,ib=null,Pd=!1,lb=null,Qd=0,Ic=0,Pf=null,Kd=-1,Ld=0;var Qk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||S.current)ha=!0;else{if(0===(a.lanes&c)&&0===(b.flags&
128))return ha=!1,wk(a,b,c);ha=0!==(a.flags&131072)?!0:!1}else ha=!1,D&&0!==(b.flags&1048576)&&yh(b,nd,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;Fd(a,b);a=b.pendingProps;var e=Nb(b,J.current);Sb(b,c);e=mf(null,b,d,a,e,c);var f=nf();b.flags|=1;"object"===typeof e&&null!==e&&"function"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=null,ea(d)?(f=!0,ld(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,ff(b),e.updater=Dd,b.stateNode=
e,e._reactInternals=b,uf(b,d,a,c),b=Af(null,b,d,!0,f,c)):(b.tag=0,D&&f&&Ue(b),aa(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{Fd(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Uk(d);a=ya(d,a);switch(e){case 0:b=zf(null,b,d,a,c);break a;case 1:b=ri(null,b,d,a,c);break a;case 11:b=mi(null,b,d,a,c);break a;case 14:b=ni(null,b,d,ya(d.type,a),c);break a}throw Error(m(306,d,""));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ya(d,e),zf(a,b,d,e,c);
case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ya(d,e),ri(a,b,d,e,c);case 3:a:{si(b);if(null===a)throw Error(m(387));d=b.pendingProps;f=b.memoizedState;e=f.element;Fh(a,b);wd(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=f,b.memoizedState=f,b.flags&256){e=Ub(Error(m(423)),b);b=ti(a,b,d,c,e);break a}else if(d!==e){e=
Ub(Error(m(424)),b);b=ti(a,b,d,c,e);break a}else for(fa=Ka(b.stateNode.containerInfo.firstChild),la=b,D=!0,wa=null,c=li(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Qb();if(d===e){b=Qa(a,b,c);break a}aa(a,b,d,c)}b=b.child}return b;case 5:return Ih(b),null===a&&Xe(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Qe(d,e)?g=null:null!==f&&Qe(d,f)&&(b.flags|=32),qi(a,b),aa(a,b,g,c),b.child;case 6:return null===a&&Xe(b),null;case 13:return ui(a,b,c);case 4:return gf(b,
b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Vb(b,null,d,c):aa(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ya(d,e),mi(a,b,d,e,c);case 7:return aa(a,b,b.pendingProps,c),b.child;case 8:return aa(a,b,b.pendingProps.children,c),b.child;case 12:return aa(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;g=e.value;y(ud,d._currentValue);d._currentValue=g;if(null!==f)if(ua(f.value,g)){if(f.children===
e.children&&!S.current){b=Qa(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=Pa(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var p=l.pending;null===p?k.next=k:(k.next=p.next,p.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);df(f.return,c,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===
f.tag){g=f.return;if(null===g)throw Error(m(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);df(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}aa(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,Sb(b,c),e=qa(e),d=d(e),b.flags|=1,aa(a,b,d,c),b.child;case 14:return d=b.type,e=ya(d,b.pendingProps),e=ya(d.type,e),ni(a,b,d,e,c);case 15:return oi(a,
b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ya(d,e),Fd(a,b),b.tag=1,ea(d)?(a=!0,ld(b)):a=!1,Sb(b,c),ei(b,d,e),uf(b,d,e,c),Af(null,b,d,!0,a,c);case 19:return wi(a,b,c);case 22:return pi(a,b,c)}throw Error(m(156,b.tag));};var pa=function(a,b,c,d){return new Tk(a,b,c,d)},aj="function"===typeof reportError?reportError:function(a){console.error(a)};Ud.prototype.render=Xf.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(m(409));
Sd(a,b,null,null)};Ud.prototype.unmount=Xf.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;yb(function(){Sd(null,a,null,null)});b[Ja]=null}};Ud.prototype.unstable_scheduleHydration=function(a){if(a){var b=nl();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Ya.length&&0!==b&&b<Ya[c].priority;c++);Ya.splice(c,0,a);0===c&&Hg(a)}};var Cj=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=
hc(b.pendingLanes);0!==c&&(xe(b,c|1),ia(b,P()),0===(p&6)&&(Hc(),db()))}break;case 13:yb(function(){var b=Oa(a,1);if(null!==b){var c=Z();xa(b,a,1,c)}}),Wf(a,1)}};var Gg=function(a){if(13===a.tag){var b=Oa(a,134217728);if(null!==b){var c=Z();xa(b,a,134217728,c)}Wf(a,134217728)}};var xj=function(a){if(13===a.tag){var b=hb(a),c=Oa(a,b);if(null!==c){var d=Z();xa(c,a,b,d)}Wf(a,b)}};var nl=function(){return z};var wj=function(a,b){var c=z;try{return z=a,b()}finally{z=c}};se=function(a,b,c){switch(b){case "input":le(a,
c);b=c.name;if("radio"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll("input[name="+JSON.stringify(""+b)+'][type="radio"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Rc(d);if(!e)throw Error(m(90));jg(d);le(d,e)}}}break;case "textarea":og(a,c);break;case "select":b=c.value,null!=b&&Db(a,!!c.multiple,b,!1)}};(function(a,b,c){xg=a;yg=c})(Tf,function(a,b,c,d,e){var f=z,g=ca.transition;try{return ca.transition=null,z=1,a(b,c,d,e)}finally{z=f,ca.transition=
g,0===p&&Hc()}},yb);var ol={usingClientEntryPoint:!1,Events:[ec,Ib,Rc,ug,vg,Tf]};(function(a){a={bundleType:a.bundleType,version:a.version,rendererPackageName:a.rendererPackageName,rendererConfig:a.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Sa.ReactCurrentDispatcher,findHostInstanceByFiber:Xk,
findFiberByHostInstance:a.findFiberByHostInstance||Yk,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:"18.3.1"};if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)a=!1;else{var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)a=!0;else{try{Uc=b.inject(a),Ca=b}catch(c){}a=b.checkDCE?!0:!1}}return a})({findFiberByHostInstance:ob,bundleType:0,version:"18.3.1-next-f1338f8080-20240426",
rendererPackageName:"react-dom"});Q.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ol;Q.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Yf(b))throw Error(m(200));return Wk(a,b,null,c)};Q.createRoot=function(a,b){if(!Yf(a))throw Error(m(299));var c=!1,d="",e=aj;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=Vf(a,1,!1,null,null,
c,!1,d,e);a[Ja]=b.current;sc(8===a.nodeType?a.parentNode:a);return new Xf(b)};Q.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if("function"===typeof a.render)throw Error(m(188));a=Object.keys(a).join(",");throw Error(m(268,a));}a=Bg(b);a=null===a?null:a.stateNode;return a};Q.flushSync=function(a){return yb(a)};Q.hydrate=function(a,b,c){if(!Vd(b))throw Error(m(200));return Wd(null,a,b,!0,c)};Q.hydrateRoot=function(a,b,c){if(!Yf(a))throw Error(m(405));
var d=null!=c&&c.hydratedSources||null,e=!1,f="",g=aj;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=Wi(b,null,a,1,null!=c?c:null,e,!1,f,g);a[Ja]=b.current;sc(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,e);return new Ud(b)};Q.render=
function(a,b,c){if(!Vd(b))throw Error(m(200));return Wd(null,a,b,!1,c)};Q.unmountComponentAtNode=function(a){if(!Vd(a))throw Error(m(40));return a._reactRootContainer?(yb(function(){Wd(null,null,a,!1,function(){a._reactRootContainer=null;a[Ja]=null})}),!0):!1};Q.unstable_batchedUpdates=Tf;Q.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!Vd(c))throw Error(m(200));if(null==a||void 0===a._reactInternals)throw Error(m(38));return Wd(a,b,c,!1,d)};Q.version="18.3.1-next-f1338f8080-20240426"});
})();

31
vendor/react.production.min.js vendored Normal file
View File

@ -0,0 +1,31 @@
/**
* @license React
* react.production.min.js
*
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
(function(){'use strict';(function(c,x){"object"===typeof exports&&"undefined"!==typeof module?x(exports):"function"===typeof define&&define.amd?define(["exports"],x):(c=c||self,x(c.React={}))})(this,function(c){function x(a){if(null===a||"object"!==typeof a)return null;a=V&&a[V]||a["@@iterator"];return"function"===typeof a?a:null}function w(a,b,e){this.props=a;this.context=b;this.refs=W;this.updater=e||X}function Y(){}function K(a,b,e){this.props=a;this.context=b;this.refs=W;this.updater=e||X}function Z(a,b,
e){var m,d={},c=null,h=null;if(null!=b)for(m in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(c=""+b.key),b)aa.call(b,m)&&!ba.hasOwnProperty(m)&&(d[m]=b[m]);var l=arguments.length-2;if(1===l)d.children=e;else if(1<l){for(var f=Array(l),k=0;k<l;k++)f[k]=arguments[k+2];d.children=f}if(a&&a.defaultProps)for(m in l=a.defaultProps,l)void 0===d[m]&&(d[m]=l[m]);return{$$typeof:y,type:a,key:c,ref:h,props:d,_owner:L.current}}function oa(a,b){return{$$typeof:y,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}
function M(a){return"object"===typeof a&&null!==a&&a.$$typeof===y}function pa(a){var b={"=":"=0",":":"=2"};return"$"+a.replace(/[=:]/g,function(a){return b[a]})}function N(a,b){return"object"===typeof a&&null!==a&&null!=a.key?pa(""+a.key):b.toString(36)}function B(a,b,e,m,d){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;var h=!1;if(null===a)h=!0;else switch(c){case "string":case "number":h=!0;break;case "object":switch(a.$$typeof){case y:case qa:h=!0}}if(h)return h=a,d=d(h),a=""===m?"."+
N(h,0):m,ca(d)?(e="",null!=a&&(e=a.replace(da,"$&/")+"/"),B(d,b,e,"",function(a){return a})):null!=d&&(M(d)&&(d=oa(d,e+(!d.key||h&&h.key===d.key?"":(""+d.key).replace(da,"$&/")+"/")+a)),b.push(d)),1;h=0;m=""===m?".":m+":";if(ca(a))for(var l=0;l<a.length;l++){c=a[l];var f=m+N(c,l);h+=B(c,b,e,f,d)}else if(f=x(a),"function"===typeof f)for(a=f.call(a),l=0;!(c=a.next()).done;)c=c.value,f=m+N(c,l++),h+=B(c,b,e,f,d);else if("object"===c)throw b=String(a),Error("Objects are not valid as a React child (found: "+
("[object Object]"===b?"object with keys {"+Object.keys(a).join(", ")+"}":b)+"). If you meant to render a collection of children, use an array instead.");return h}function C(a,b,e){if(null==a)return a;var c=[],d=0;B(a,c,"","",function(a){return b.call(e,a,d++)});return c}function ra(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=
0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}function O(a,b){var e=a.length;a.push(b);a:for(;0<e;){var c=e-1>>>1,d=a[c];if(0<D(d,b))a[c]=b,a[e]=d,e=c;else break a}}function p(a){return 0===a.length?null:a[0]}function E(a){if(0===a.length)return null;var b=a[0],e=a.pop();if(e!==b){a[0]=e;a:for(var c=0,d=a.length,k=d>>>1;c<k;){var h=2*(c+1)-1,l=a[h],f=h+1,g=a[f];if(0>D(l,e))f<d&&0>D(g,l)?(a[c]=g,a[f]=e,c=f):(a[c]=l,a[h]=e,c=h);else if(f<d&&0>D(g,e))a[c]=g,a[f]=e,c=f;else break a}}return b}
function D(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}function P(a){for(var b=p(r);null!==b;){if(null===b.callback)E(r);else if(b.startTime<=a)E(r),b.sortIndex=b.expirationTime,O(q,b);else break;b=p(r)}}function Q(a){z=!1;P(a);if(!u)if(null!==p(q))u=!0,R(S);else{var b=p(r);null!==b&&T(Q,b.startTime-a)}}function S(a,b){u=!1;z&&(z=!1,ea(A),A=-1);F=!0;var c=k;try{P(b);for(n=p(q);null!==n&&(!(n.expirationTime>b)||a&&!fa());){var m=n.callback;if("function"===typeof m){n.callback=null;
k=n.priorityLevel;var d=m(n.expirationTime<=b);b=v();"function"===typeof d?n.callback=d:n===p(q)&&E(q);P(b)}else E(q);n=p(q)}if(null!==n)var g=!0;else{var h=p(r);null!==h&&T(Q,h.startTime-b);g=!1}return g}finally{n=null,k=c,F=!1}}function fa(){return v()-ha<ia?!1:!0}function R(a){G=a;H||(H=!0,I())}function T(a,b){A=ja(function(){a(v())},b)}function ka(a){throw Error("act(...) is not supported in production builds of React.");}var y=Symbol.for("react.element"),qa=Symbol.for("react.portal"),sa=Symbol.for("react.fragment"),
ta=Symbol.for("react.strict_mode"),ua=Symbol.for("react.profiler"),va=Symbol.for("react.provider"),wa=Symbol.for("react.context"),xa=Symbol.for("react.forward_ref"),ya=Symbol.for("react.suspense"),za=Symbol.for("react.memo"),Aa=Symbol.for("react.lazy"),V=Symbol.iterator,X={isMounted:function(a){return!1},enqueueForceUpdate:function(a,b,c){},enqueueReplaceState:function(a,b,c,m){},enqueueSetState:function(a,b,c,m){}},la=Object.assign,W={};w.prototype.isReactComponent={};w.prototype.setState=function(a,
b){if("object"!==typeof a&&"function"!==typeof a&&null!=a)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,a,b,"setState")};w.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,"forceUpdate")};Y.prototype=w.prototype;var t=K.prototype=new Y;t.constructor=K;la(t,w.prototype);t.isPureReactComponent=!0;var ca=Array.isArray,aa=Object.prototype.hasOwnProperty,L={current:null},
ba={key:!0,ref:!0,__self:!0,__source:!0},da=/\/+/g,g={current:null},J={transition:null};if("object"===typeof performance&&"function"===typeof performance.now){var Ba=performance;var v=function(){return Ba.now()}}else{var ma=Date,Ca=ma.now();v=function(){return ma.now()-Ca}}var q=[],r=[],Da=1,n=null,k=3,F=!1,u=!1,z=!1,ja="function"===typeof setTimeout?setTimeout:null,ea="function"===typeof clearTimeout?clearTimeout:null,na="undefined"!==typeof setImmediate?setImmediate:null;"undefined"!==typeof navigator&&
void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);var H=!1,G=null,A=-1,ia=5,ha=-1,U=function(){if(null!==G){var a=v();ha=a;var b=!0;try{b=G(!0,a)}finally{b?I():(H=!1,G=null)}}else H=!1};if("function"===typeof na)var I=function(){na(U)};else if("undefined"!==typeof MessageChannel){t=new MessageChannel;var Ea=t.port2;t.port1.onmessage=U;I=function(){Ea.postMessage(null)}}else I=function(){ja(U,0)};t={ReactCurrentDispatcher:g,
ReactCurrentOwner:L,ReactCurrentBatchConfig:J,Scheduler:{__proto__:null,unstable_ImmediatePriority:1,unstable_UserBlockingPriority:2,unstable_NormalPriority:3,unstable_IdlePriority:5,unstable_LowPriority:4,unstable_runWithPriority:function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=k;k=a;try{return b()}finally{k=c}},unstable_next:function(a){switch(k){case 1:case 2:case 3:var b=3;break;default:b=k}var c=k;k=b;try{return a()}finally{k=c}},unstable_scheduleCallback:function(a,
b,c){var e=v();"object"===typeof c&&null!==c?(c=c.delay,c="number"===typeof c&&0<c?e+c:e):c=e;switch(a){case 1:var d=-1;break;case 2:d=250;break;case 5:d=1073741823;break;case 4:d=1E4;break;default:d=5E3}d=c+d;a={id:Da++,callback:b,priorityLevel:a,startTime:c,expirationTime:d,sortIndex:-1};c>e?(a.sortIndex=c,O(r,a),null===p(q)&&a===p(r)&&(z?(ea(A),A=-1):z=!0,T(Q,c-e))):(a.sortIndex=d,O(q,a),u||F||(u=!0,R(S)));return a},unstable_cancelCallback:function(a){a.callback=null},unstable_wrapCallback:function(a){var b=
k;return function(){var c=k;k=b;try{return a.apply(this,arguments)}finally{k=c}}},unstable_getCurrentPriorityLevel:function(){return k},unstable_shouldYield:fa,unstable_requestPaint:function(){},unstable_continueExecution:function(){u||F||(u=!0,R(S))},unstable_pauseExecution:function(){},unstable_getFirstCallbackNode:function(){return p(q)},get unstable_now(){return v},unstable_forceFrameRate:function(a){0>a||125<a?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):
ia=0<a?Math.floor(1E3/a):5},unstable_Profiling:null}};c.Children={map:C,forEach:function(a,b,c){C(a,function(){b.apply(this,arguments)},c)},count:function(a){var b=0;C(a,function(){b++});return b},toArray:function(a){return C(a,function(a){return a})||[]},only:function(a){if(!M(a))throw Error("React.Children.only expected to receive a single React element child.");return a}};c.Component=w;c.Fragment=sa;c.Profiler=ua;c.PureComponent=K;c.StrictMode=ta;c.Suspense=ya;c.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=
t;c.act=ka;c.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error("React.cloneElement(...): The argument must be a React element, but you passed "+a+".");var e=la({},a.props),d=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=L.current);void 0!==b.key&&(d=""+b.key);if(a.type&&a.type.defaultProps)var l=a.type.defaultProps;for(f in b)aa.call(b,f)&&!ba.hasOwnProperty(f)&&(e[f]=void 0===b[f]&&void 0!==l?l[f]:b[f])}var f=arguments.length-2;if(1===f)e.children=c;else if(1<f){l=
Array(f);for(var g=0;g<f;g++)l[g]=arguments[g+2];e.children=l}return{$$typeof:y,type:a.type,key:d,ref:k,props:e,_owner:h}};c.createContext=function(a){a={$$typeof:wa,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:va,_context:a};return a.Consumer=a};c.createElement=Z;c.createFactory=function(a){var b=Z.bind(null,a);b.type=a;return b};c.createRef=function(){return{current:null}};c.forwardRef=function(a){return{$$typeof:xa,
render:a}};c.isValidElement=M;c.lazy=function(a){return{$$typeof:Aa,_payload:{_status:-1,_result:a},_init:ra}};c.memo=function(a,b){return{$$typeof:za,type:a,compare:void 0===b?null:b}};c.startTransition=function(a,b){b=J.transition;J.transition={};try{a()}finally{J.transition=b}};c.unstable_act=ka;c.useCallback=function(a,b){return g.current.useCallback(a,b)};c.useContext=function(a){return g.current.useContext(a)};c.useDebugValue=function(a,b){};c.useDeferredValue=function(a){return g.current.useDeferredValue(a)};
c.useEffect=function(a,b){return g.current.useEffect(a,b)};c.useId=function(){return g.current.useId()};c.useImperativeHandle=function(a,b,c){return g.current.useImperativeHandle(a,b,c)};c.useInsertionEffect=function(a,b){return g.current.useInsertionEffect(a,b)};c.useLayoutEffect=function(a,b){return g.current.useLayoutEffect(a,b)};c.useMemo=function(a,b){return g.current.useMemo(a,b)};c.useReducer=function(a,b,c){return g.current.useReducer(a,b,c)};c.useRef=function(a){return g.current.useRef(a)};
c.useState=function(a){return g.current.useState(a)};c.useSyncExternalStore=function(a,b,c){return g.current.useSyncExternalStore(a,b,c)};c.useTransition=function(){return g.current.useTransition()};c.version="18.3.1"});
})();

418
参考(仅表格).HTML Normal file
View File

@ -0,0 +1,418 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG Drawing Table Generator Workbench</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Inter', 'Helvetica Neue', 'Arial', sans-serif;
background-color: #f1f5f9;
}
svg text {
font-family: 'KaiTi', 'SimSun', sans-serif;
}
.form-input {
@apply w-full p-2 border border-slate-300 rounded-md shadow-sm focus:ring-indigo-500 focus:border-indigo-500 text-sm;
}
.sidebar-item {
@apply block w-full text-left px-4 py-2.5 text-sm font-medium text-slate-700 rounded-md hover:bg-slate-200 transition-colors;
}
.sidebar-item.active {
@apply bg-indigo-600 text-white hover:bg-indigo-700;
}
.data-table th, .data-table td {
@apply px-3 py-2 text-left text-sm whitespace-nowrap;
}
.data-table thead {
@apply bg-slate-100;
}
</style>
</head>
<body class="h-screen w-screen overflow-hidden flex flex-col">
<header class="bg-white border-b border-slate-200 shadow-sm z-10">
<div class="max-w-full mx-auto px-6 py-3">
<h1 class="text-xl font-bold text-slate-800">图纸物料清单工作台</h1>
</div>
</header>
<div class="flex flex-grow overflow-hidden">
<!-- Left Sidebar: Table List -->
<aside class="w-64 bg-white border-r border-slate-200 p-4 flex flex-col">
<h2 class="text-sm font-semibold text-slate-500 uppercase tracking-wider mb-3">我的表格</h2>
<div id="table-list" class="flex-grow space-y-1 overflow-y-auto">
<!-- Table list items will be injected here -->
</div>
<button id="add-table-btn" class="mt-4 w-full flex items-center justify-center px-4 py-2 border border-dashed border-slate-300 text-sm font-medium rounded-md text-slate-700 hover:bg-slate-100 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
+ 新建表格
</button>
</aside>
<!-- Center: SVG Preview -->
<main class="flex-grow bg-slate-50 p-6 overflow-auto">
<div id="svg-container" class="bg-white w-full h-full rounded-lg shadow-inner border border-slate-200 p-4">
<svg id="drawing-svg" width="100%" height="100%"></svg>
</div>
</main>
<!-- Right Sidebar: Editor -->
<aside id="editor-sidebar" class="w-96 bg-white border-l border-slate-200 p-6 flex flex-col overflow-y-auto">
<!-- Form for adding/editing a row -->
<div id="editor-form-container">
<h2 id="editor-title" class="text-lg font-semibold text-slate-800 mb-4">添加新物料行</h2>
<form id="entry-form" class="grid grid-cols-2 gap-4 text-sm">
<div>
<label for="input-jianhao" class="block text-xs font-medium text-slate-600">件号</label>
<input type="text" id="input-jianhao" class="form-input mt-1">
</div>
<div class="col-span-2">
<label for="input-tuhao" class="block text-xs font-medium text-slate-600">图号或标准号</label>
<input type="text" id="input-tuhao" class="form-input mt-1">
</div>
<div>
<label for="input-chinese-name" class="block text-xs font-medium text-slate-600">中文名称</label>
<input type="text" id="input-chinese-name" class="form-input mt-1">
</div>
<div>
<label for="input-english-name" class="block text-xs font-medium text-slate-600">英文名称</label>
<input type="text" id="input-english-name" class="form-input mt-1">
</div>
<div>
<label for="input-shuliang" class="block text-xs font-medium text-slate-600">数量</label>
<input type="text" id="input-shuliang" class="form-input mt-1">
</div>
<div>
<label for="input-cailiao" class="block text-xs font-medium text-slate-600">材料</label>
<input type="text" id="input-cailiao" class="form-input mt-1">
</div>
<div>
<label for="input-dan" class="block text-xs font-medium text-slate-600">单重 (kg)</label>
<input type="text" id="input-dan" class="form-input mt-1">
</div>
<div>
<label for="input-zong" class="block text-xs font-medium text-slate-600">总重 (kg)</label>
<input type="text" id="input-zong" class="form-input mt-1">
</div>
<div class="col-span-2">
<label for="input-beizhu" class="block text-xs font-medium text-slate-600">备注</label>
<input type="text" id="input-beizhu" class="form-input mt-1">
</div>
<div class="col-span-2">
<button type="submit" id="form-submit-btn" class="mt-2 w-full inline-flex justify-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
添加行
</button>
<button type="button" id="form-cancel-btn" class="mt-2 w-full hidden inline-flex justify-center px-4 py-2 border border-slate-300 text-sm font-medium rounded-md shadow-sm text-slate-700 bg-white hover:bg-slate-50">
取消编辑
</button>
</div>
</form>
</div>
<!-- Data Management Table -->
<div class="mt-8 flex-grow flex flex-col overflow-hidden">
<h2 class="text-lg font-semibold text-slate-800 mb-4">当前数据</h2>
<div class="overflow-y-auto border border-slate-200 rounded-lg">
<table class="w-full data-table">
<thead class="sticky top-0">
<tr>
<th>件号</th>
<th>名称</th>
<th>数量</th>
<th>操作</th>
</tr>
</thead>
<tbody id="data-table-body" class="divide-y divide-slate-200">
</tbody>
</table>
</div>
</div>
</aside>
</div>
<script>
const headerTemplate = { "template_name": "标准物料清单-底部表头", "row_height": 8.0, "header_height": 14.0, "column_boundaries": [0.0, 15.0, 45.0, 100.0, 110.0, 140.0, 150.0, 160.0, 185.0], "header_definition": { "lines": [ {"start": [0.0, 14.0], "end": [185.0, 14.0]}, {"start": [160.0, 6.5], "end": [140.0, 6.5]}, {"start": [110.0, 0.0], "end": [110.0, 14.0]}, {"start": [15.0, 14.0], "end": [15.0, 0.0]}, {"start": [45.0, 0.0], "end": [45.0, 14.0]}, {"start": [100.0, 0.0], "end": [100.0, 14.0]}, {"start": [140.0, 0.0], "end": [140.0, 14.0]}, {"start": [160.0, 0.0], "end": [160.0, 14.0]}, {"start": [150.0, 6.5], "end": [150.0, 14.0]}, {"start": [0.0, 0.0], "end": [185.0, 0.0]}, {"start": [185.0, 0.0], "end": [185.0, 14.0]}], "texts": [ {"content": "总", "relative_pos": [153.62, 10.23], "height": 3.5}, {"content": "单", "relative_pos": [143.79, 10.02], "height": 3.5}, {"content": "TOTAL", "relative_pos": [152.64, 7.45], "height": 2.0}, {"content": "SINGLE", "relative_pos": [141.89, 7.45], "height": 2.0}, {"content": "备 注", "relative_pos": [169.33, 6.8], "height": 3.5, "alignment": "BOTTOM_CENTER"}, {"content": "材 料", "relative_pos": [121.56, 6.56], "height": 3.5}, {"content": "数量", "relative_pos": [102.5, 6.56], "height": 3.5}, {"content": "名 称", "relative_pos": [67.3, 6.56], "height": 3.5}, {"content": "件 号", "relative_pos": [4.43, 6.56], "height": 3.5}, {"content": "图号或标准号", "relative_pos": [22.43, 6.53], "height": 3.5}, {"content": "MAT'L", "relative_pos": [122.94, 2.33], "height": 2.0}, {"content": "QTY.", "relative_pos": [102.89, 2.33], "height": 2.0}, {"content": "REMARKS", "relative_pos": [165.48, 2.3], "height": 2.0}, {"content": "PARTS. NAME.", "relative_pos": [65.06, 1.76], "height": 2.0}, {"content": "DWG NO. OR STD. NO.", "relative_pos": [19.43, 1.76], "height": 2.0}, {"content": "PARTS .NO.", "relative_pos": [7.77, 1.76], "height": 2.0, "alignment": "BOTTOM_CENTER"}, {"content": "MASSkg", "relative_pos": [148.32, 1.7], "height": 2.0}, {"content": "质量", "relative_pos": [142.49, 0.87], "height": 3.5}] } };
const columnsTemplate = { "row_height": 8.0, "column_definitions": [ {"name": "件号", "relative_x_start": 0.0, "text_definitions": [{"data_key": "main", "relative_pos": [5.82, 1.46], "height": 3.5, "alignment": "BOTTOM_LEFT"}]}, {"name": "图号或标准号", "relative_x_start": 15.0, "text_definitions": [{"data_key": "main", "relative_pos": [14.77, 1.15], "height": 3.0, "alignment": "BOTTOM_CENTER"}]}, {"name": "名称", "relative_x_start": 45.0, "text_definitions": [{"data_key": "chinese_name", "relative_pos": [1.76, 3.88], "height": 3.5}, {"data_key": "english_name", "relative_pos": [1.79, 1.0], "height": 2.0}, {"data_key": "specification", "relative_pos": [18.68, 3.9], "height": 3.0}]}, {"name": "数量", "relative_x_start": 100.0, "text_definitions": [{"data_key": "main", "relative_pos": [4.97, 1.37], "height": 3.0, "alignment": "BOTTOM_CENTER"}]}, {"name": "材料", "relative_x_start": 110.0, "text_definitions": [{"data_key": "main", "relative_pos": [15.16, 1.12], "height": 3.5, "alignment": "BOTTOM_CENTER"}]}, {"name": "单", "relative_x_start": 140.0, "text_definitions": [{"data_key": "main", "relative_pos": [5.06, 1.42], "height": 3.0, "alignment": "BOTTOM_CENTER"}]}, {"name": "总", "relative_x_start": 150.0, "text_definitions": [{"data_key": "main", "relative_pos": [5.06, 1.42], "height": 3.0, "alignment": "BOTTOM_CENTER"}]}, {"name": "备注", "relative_x_start": 160.0, "text_definitions": [{"data_key": "main", "relative_pos": [12.06, 1.42], "height": 3.0, "alignment": "BOTTOM_CENTER"}]}] };
// --- Application State ---
let state = {
tables: [
{
id: Date.now(),
name: "主装配图物料清单",
data: [
{"件号": {"main": "1"}, "图号或标准号": {"main": "JB/T 1001"}, "名称": {"chinese_name": "轴承座", "english_name": "Bearing Seat"}, "数量": {"main": "2"}, "材料": {"main": "HT200"}, "单": {"main": "15.5"}, "总": {"main": "31.0"}, "备注": {"main": "外购"}},
{"件号": {"main": "2"}, "图号或标准号": {"main": "GB/T 5783"}, "名称": {"chinese_name": "六角螺栓", "english_name": "Hex Bolt"}, "数量": {"main": "8"}, "材料": {"main": "Q235"}, "单": {"main": "0.5"}, "总": {"main": "4.0"}, "备注": {"main": "M8x20"}}
]
}
],
activeTableId: null,
editingRowIndex: null
};
state.activeTableId = state.tables[0].id;
// --- DOM Elements ---
const tableList = document.getElementById('table-list');
const addTableBtn = document.getElementById('add-table-btn');
const entryForm = document.getElementById('entry-form');
const editorSidebar = document.getElementById('editor-sidebar');
const dataTableBody = document.getElementById('data-table-body');
const editorTitle = document.getElementById('editor-title');
const formSubmitBtn = document.getElementById('form-submit-btn');
const formCancelBtn = document.getElementById('form-cancel-btn');
// --- Main App Logic ---
document.addEventListener('DOMContentLoaded', () => {
addTableBtn.addEventListener('click', addNewTable);
entryForm.addEventListener('submit', handleFormSubmit);
formCancelBtn.addEventListener('click', cancelEdit);
renderApp();
});
function getActiveTable() {
return state.tables.find(t => t.id === state.activeTableId);
}
function renderApp() {
if (!getActiveTable() && state.tables.length > 0) {
state.activeTableId = state.tables[0].id;
}
renderTableList();
const activeTable = getActiveTable();
if (activeTable) {
editorSidebar.classList.remove('hidden');
renderEditor(activeTable.data);
renderSVG(activeTable.data);
} else {
editorSidebar.classList.add('hidden');
document.getElementById('drawing-svg').innerHTML = '';
}
}
// --- Left Sidebar Logic ---
function renderTableList() {
tableList.innerHTML = '';
state.tables.forEach(table => {
const button = document.createElement('button');
button.className = `sidebar-item ${table.id === state.activeTableId ? 'active' : ''}`;
button.textContent = table.name;
button.dataset.id = table.id;
button.addEventListener('click', () => {
state.activeTableId = table.id;
state.editingRowIndex = null; // Reset editing state when switching tables
renderApp();
});
tableList.appendChild(button);
});
}
function addNewTable() {
const newName = prompt("请输入新表格的名称:", `新物料清单 ${state.tables.length + 1}`);
if (newName) {
const newTable = {
id: Date.now(),
name: newName,
data: []
};
state.tables.push(newTable);
state.activeTableId = newTable.id;
renderApp();
}
}
// --- Right Sidebar Logic ---
function renderEditor(data) {
renderManagementTable(data);
if (state.editingRowIndex !== null) {
const rowData = data[state.editingRowIndex];
populateForm(rowData);
editorTitle.textContent = `编辑行: ${rowData['件号'].main}`;
formSubmitBtn.textContent = '更新行';
formCancelBtn.classList.remove('hidden');
} else {
entryForm.reset();
editorTitle.textContent = '添加新物料行';
formSubmitBtn.textContent = '添加行';
formCancelBtn.classList.add('hidden');
}
}
function handleFormSubmit(e) {
e.preventDefault();
const activeTable = getActiveTable();
if (!activeTable) return;
const newRow = {
"件号": { "main": document.getElementById('input-jianhao').value },
"图号或标准号": { "main": document.getElementById('input-tuhao').value },
"名称": { "chinese_name": document.getElementById('input-chinese-name').value, "english_name": document.getElementById('input-english-name').value },
"数量": { "main": document.getElementById('input-shuliang').value },
"材料": { "main": document.getElementById('input-cailiao').value },
"单": { "main": document.getElementById('input-dan').value },
"总": { "main": document.getElementById('input-zong').value },
"备注": { "main": document.getElementById('input-beizhu').value },
};
if (state.editingRowIndex !== null) {
activeTable.data[state.editingRowIndex] = newRow;
state.editingRowIndex = null;
} else {
activeTable.data.push(newRow);
}
renderApp();
}
function populateForm(rowData) {
document.getElementById('input-jianhao').value = rowData['件号'].main || '';
document.getElementById('input-tuhao').value = rowData['图号或标准号'].main || '';
document.getElementById('input-chinese-name').value = rowData['名称'].chinese_name || '';
document.getElementById('input-english-name').value = rowData['名称'].english_name || '';
document.getElementById('input-shuliang').value = rowData['数量'].main || '';
document.getElementById('input-cailiao').value = rowData['材料'].main || '';
document.getElementById('input-dan').value = rowData['单'].main || '';
document.getElementById('input-zong').value = rowData['总'].main || '';
document.getElementById('input-beizhu').value = rowData['备注'].main || '';
}
function cancelEdit() {
state.editingRowIndex = null;
renderApp();
}
function renderManagementTable(data) {
dataTableBody.innerHTML = '';
if(!data) return;
data.forEach((rowData, index) => {
const tr = document.createElement('tr');
tr.className = "hover:bg-slate-50";
tr.innerHTML = `
<td class="font-medium text-slate-800">${rowData['件号'].main}</td>
<td>${rowData['名称'].chinese_name || ''}</td>
<td>${rowData['数量'].main}</td>
<td class="flex items-center space-x-2">
<button class="text-indigo-600 hover:text-indigo-800 text-xs" data-index="${index}">编辑</button>
<button class="text-red-600 hover:text-red-800 text-xs" data-index="${index}">删除</button>
</td>
`;
dataTableBody.appendChild(tr);
});
dataTableBody.querySelectorAll('button').forEach(button => {
button.addEventListener('click', (e) => {
const index = parseInt(e.target.dataset.index, 10);
if (e.target.textContent === '删除') {
if(confirm(`确定要删除 件号 ${data[index]['件号'].main} 吗?`)) {
getActiveTable().data.splice(index, 1);
renderApp();
}
} else if (e.target.textContent === '编辑') {
state.editingRowIndex = index;
renderApp();
editorSidebar.scrollTop = 0; // scroll to top
}
});
});
}
// --- Center SVG Logic ---
function renderSVG(drawingData) {
const svgNS = "http://www.w3.org/2000/svg";
const svg = document.getElementById('drawing-svg');
svg.innerHTML = '';
if (!drawingData) return;
const strokeColor = "#334155", strokeWidth = 0.3, textColor = "#0f172a", margin = 10;
const { header_height, row_height } = headerTemplate;
const totalRows = drawingData.length;
const tableWidth = Math.max(...headerTemplate.column_boundaries);
const tableHeight = header_height + (totalRows * row_height);
svg.setAttribute('viewBox', `0 0 ${tableWidth + 2 * margin} ${tableHeight + 2 * margin}`);
const mainGroup = document.createElementNS(svgNS, 'g');
mainGroup.setAttribute('transform', `translate(${margin}, ${tableHeight + margin}) scale(1, -1)`);
svg.appendChild(mainGroup);
const bodyGroup = document.createElementNS(svgNS, 'g');
mainGroup.appendChild(bodyGroup);
drawingData.forEach((rowData, rowIndex) => {
const rowY = header_height + ((totalRows - 1 - rowIndex) * row_height);
const rowGroup = document.createElementNS(svgNS, 'g');
rowGroup.setAttribute('transform', `translate(0, ${rowY})`);
bodyGroup.appendChild(rowGroup);
const lineEl = document.createElementNS(svgNS, 'line');
lineEl.setAttribute('x1', headerTemplate.column_boundaries[0]);
lineEl.setAttribute('y1', 0);
lineEl.setAttribute('x2', tableWidth);
lineEl.setAttribute('y2', 0);
lineEl.setAttribute('stroke', strokeColor);
lineEl.setAttribute('stroke-width', strokeWidth);
rowGroup.appendChild(lineEl);
columnsTemplate.column_definitions.forEach(colDef => {
colDef.text_definitions.forEach(textDef => {
const dataItem = rowData[colDef.name];
if (dataItem && dataItem[textDef.data_key] != null) {
const content = dataItem[textDef.data_key];
const x = colDef.relative_x_start + textDef.relative_pos[0];
const y = textDef.relative_pos[1];
const textEl = createSvgText(content, x, y, textDef.height, textColor, textDef.alignment);
rowGroup.appendChild(textEl);
}
});
});
});
headerTemplate.column_boundaries.forEach(xPos => {
if (xPos <= tableWidth) {
const lineEl = document.createElementNS(svgNS, 'line');
lineEl.setAttribute('x1', xPos);
lineEl.setAttribute('y1', header_height);
lineEl.setAttribute('x2', xPos);
lineEl.setAttribute('y2', tableHeight);
lineEl.setAttribute('stroke', strokeColor);
lineEl.setAttribute('stroke-width', strokeWidth);
bodyGroup.appendChild(lineEl);
}
});
const headerGroup = document.createElementNS(svgNS, 'g');
headerGroup.setAttribute('transform', 'translate(0, 0)');
mainGroup.appendChild(headerGroup);
headerTemplate.header_definition.lines.forEach(line => {
const lineEl = document.createElementNS(svgNS, 'line');
lineEl.setAttribute('x1', line.start[0]);
lineEl.setAttribute('y1', line.start[1]);
lineEl.setAttribute('x2', line.end[0]);
lineEl.setAttribute('y2', line.end[1]);
lineEl.setAttribute('stroke', strokeColor);
lineEl.setAttribute('stroke-width', strokeWidth);
headerGroup.appendChild(lineEl);
});
headerTemplate.header_definition.texts.forEach(text => {
const textEl = createSvgText(text.content, text.relative_pos[0], text.relative_pos[1], text.height, textColor, text.alignment);
headerGroup.appendChild(textEl);
});
}
function createSvgText(content, x, y, height, color, alignment = 'BOTTOM_LEFT') {
const svgNS = "http://www.w3.org/2000/svg";
const textEl = document.createElementNS(svgNS, 'text');
textEl.setAttribute('x', x);
textEl.setAttribute('y', y);
textEl.setAttribute('font-size', height);
textEl.setAttribute('fill', color);
textEl.setAttribute('transform', 'scale(1, -1)');
textEl.setAttribute('y', -y);
textEl.setAttribute('text-anchor', (alignment === 'BOTTOM_CENTER') ? 'middle' : (alignment === 'BOTTOM_RIGHT' ? 'end' : 'start'));
textEl.textContent = content;
return textEl;
}
</script>
</body>
</html>

79
图片/pictureinfore.json Normal file
View File

@ -0,0 +1,79 @@
[
{
"图片名": "图1",
"图片世界id": "A$C2EB80DB8",
"图片图号": "NCY24-S008-00",
"世界坐标": [
{ "x": 559.314, "y": -2484.602 },
{ "x": 1153.314, "y": -2484.602 },
{ "x": 1153.314, "y": -1643.602 },
{ "x": 559.314, "y": -1643.602 }
]
},
{
"图片名": "图2-1",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1288.8, "y": -2458.3 },
{ "x": 1691.8, "y": -2458.3 },
{ "x": 1691.8, "y": -1884.3 },
{ "x": 1288.8, "y": -1884.3 }
]
},
{
"图片名": "图2-2",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1691.8, "y": -2171.3 },
{ "x": 1893.3, "y": -2171.3 },
{ "x": 1893.3, "y": -1884.3 },
{ "x": 1691.8, "y": -1884.3 }
]
},
{
"图片名": "图2-3",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1893.3, "y": -2171.3 },
{ "x": 2094.8, "y": -2171.3 },
{ "x": 2094.8, "y": -1884.3 },
{ "x": 1893.3, "y": -1884.3 }
]
},
{
"图片名": "图2-4",
"图片世界id": "A$C1CC9093B_1",
"图片图号": "NCY24-S008-01",
"世界坐标": [
{ "x": 1691.8, "y": -2458.3 },
{ "x": 2094.8, "y": -2458.3 },
{ "x": 2094.8, "y": -2171.3 },
{ "x": 1691.8, "y": -2171.3 }
]
},
{
"图片名": "图3-1",
"图片世界id": "A$C1CC9093B_2",
"图片图号": "NCY24-S008-02",
"世界坐标": [
{ "x": 2237.5, "y": -2458.3 },
{ "x": 2640.5, "y": -2458.3 },
{ "x": 2640.5, "y": -1884.3 },
{ "x": 2237.5, "y": -1884.3 }
]
},
{
"图片名": "图3-2",
"图片世界id": "A$C1CC9093B_2",
"图片图号": "NCY24-S008-02",
"世界坐标": [
{ "x": 2640.5, "y": -2458.3 },
{ "x": 3043.5, "y": -2458.3 },
{ "x": 3043.5, "y": -1884.3 },
{ "x": 2640.5, "y": -1884.3 }
]
}
]

BIN
图片/图1_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 MiB

BIN
图片/图2-1_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 785 KiB

BIN
图片/图2-2_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

BIN
图片/图2-3_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 157 KiB

BIN
图片/图2-4_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

BIN
图片/图3-1_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

BIN
图片/图3-2_01.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 KiB

View File

@ -0,0 +1,170 @@
{
"row_height": 8.0,
"column_definitions": [
{
"name": "件号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.82,
1.46
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
{
"name": "图号或标准号",
"relative_x_start": 15.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
14.77,
1.15
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名称",
"relative_x_start": 45.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [
1.76,
3.88
],
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"data_key": "english_name",
"relative_pos": [
1.79,
1.0
],
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [
18.68,
3.9
],
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "数量",
"relative_x_start": 100.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
4.97,
1.37
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材料",
"relative_x_start": 110.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
15.16,
1.12
],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "单",
"relative_x_start": 140.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "总",
"relative_x_start": 150.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "备注",
"relative_x_start": 160.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
12.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
}
]
}

View File

@ -0,0 +1,13 @@
[
{"件号": {"main": "1"}, "图号或标准号": {"main": "JB/T 1001"}, "名称": {"chinese_name": "轴承座", "english_name": "Bearing Seat"}, "数量": {"main": "2"}, "材料": {"main": "HT200"}, "单": {"main": "15.5"}, "总": {"main": "31.0"}, "备注": {"main": "外购"}},
{"件号": {"main": "2"}, "图号或标准号": {"main": "GB/T 5783"}, "名称": {"chinese_name": "六角螺栓", "english_name": "Hex Bolt"}, "数量": {"main": "8"}, "材料": {"main": "Q235"}, "单": {"main": "0.5"}, "总": {"main": "4.0"}, "备注": {"main": "M8x20"}},
{"件号": {"main": "3"}, "图号或标准号": {"main": "GB/T 93"}, "名称": {"chinese_name": "弹簧垫圈", "english_name": "Spring Washer"}, "数量": {"main": "8"}, "材料": {"main": "65Mn"}, "单": {"main": "0.1"}, "总": {"main": "0.8"}, "备注": {"main": "d8"}},
{"件号": {"main": "4"}, "图号或标准号": {"main": "JB/T 2002"}, "名称": {"chinese_name": "齿轮", "english_name": "Gear"}, "数量": {"main": "1"}, "材料": {"main": "40Cr"}, "单": {"main": "25.0"}, "总": {"main": "25.0"}, "备注": {"main": "调质"}},
{"件号": {"main": "5"}, "图号或标准号": {"main": "HG/T 3030"}, "名称": {"chinese_name": "密封圈", "english_name": "Seal Ring"}, "数量": {"main": "2"}, "材料": {"main": "NBR"}, "单": {"main": "2.3"}, "总": {"main": "4.6"}, "备注": {"main": ""}},
{"件号": {"main": "6"}, "图号或标准号": {"main": "JB/T 3003"}, "名称": {"chinese_name": "键", "english_name": "Key"}, "数量": {"main": "1"}, "材料": {"main": "45#"}, "单": {"main": "0.2"}, "总": {"main": "0.2"}, "备注": {"main": "A型"}},
{"件号": {"main": "7"}, "图号或标准号": {"main": "GB/T 119"}, "名称": {"chinese_name": "圆柱销", "english_name": "Dowel Pin"}, "数量": {"main": "4"}, "材料": {"main": "35#"}, "单": {"main": "0.3"}, "总": {"main": "1.2"}, "备注": {"main": ""}},
{"件号": {"main": "8"}, "图号或标准号": {"main": "JB/T 4004"}, "名称": {"chinese_name": "轴", "english_name": "Shaft"}, "数量": {"main": "1"}, "材料": {"main": "40CrNiMo"}, "单": {"main": "50.0"}, "总": {"main": "50.0"}, "备注": {"main": "精加工"}},
{"件号": {"main": "9"}, "图号或标准号": {"main": "GB/T 276"}, "名称": {"chinese_name": "深沟球轴承", "english_name": "Deep Groove Ball Bearing"}, "数量": {"main": "2"}, "材料": {"main": "GCr15"}, "单": {"main": "18.0"}, "总": {"main": "36.0"}, "备注": {"main": "外购"}},
{"件号": {"main": "10"}, "图号或标准号": {"main": "JB/T 5005"}, "名称": {"chinese_name": "端盖", "english_name": "End Cap"}, "数量": {"main": "1"}, "材料": {"main": "ZG270-500"}, "单": {"main": "8.5"}, "总": {"main": "8.5"}, "备注": {"main": ""}}
]

View File

@ -0,0 +1,485 @@
{
"template_name": "标准物料清单-底部表头",
"row_height": 8.0,
"header_height": 14.0,
"column_boundaries": [
0.0,
15.0,
45.0,
100.0,
110.0,
140.0,
150.0,
160.0,
185.0
],
"header_definition": {
"lines": [
{
"start": [
0.0,
14.0
],
"end": [
185.0,
14.0
]
},
{
"start": [
160.0,
6.5
],
"end": [
140.0,
6.5
]
},
{
"start": [
110.0,
0.0
],
"end": [
110.0,
14.0
]
},
{
"start": [
15.0,
14.0
],
"end": [
15.0,
0.0
]
},
{
"start": [
45.0,
0.0
],
"end": [
45.0,
14.0
]
},
{
"start": [
100.0,
0.0
],
"end": [
100.0,
14.0
]
},
{
"start": [
140.0,
0.0
],
"end": [
140.0,
14.0
]
},
{
"start": [
160.0,
0.0
],
"end": [
160.0,
14.0
]
},
{
"start": [
150.0,
6.5
],
"end": [
150.0,
14.0
]
},
{
"start": [
0.0,
0.0
],
"end": [
185.0,
0.0
]
},
{
"start": [
185.0,
0.0
],
"end": [
185.0,
14.0
]
}
],
"texts": [
{
"content": "总",
"relative_pos": [
153.62,
10.23
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "单",
"relative_pos": [
143.79,
10.02
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "TOTAL",
"relative_pos": [
152.64,
7.45
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "SINGLE",
"relative_pos": [
141.89,
7.45
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "备 注",
"relative_pos": [
169.33,
6.8
],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "材 料",
"relative_pos": [
121.56,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "数量",
"relative_pos": [
102.5,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "名 称",
"relative_pos": [
67.3,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "件 号",
"relative_pos": [
4.43,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "图号或标准号",
"relative_pos": [
22.43,
6.53
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "MAT'L",
"relative_pos": [
122.94,
2.33
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "QTY.",
"relative_pos": [
102.89,
2.33
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "REMARKS",
"relative_pos": [
165.48,
2.3
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "PARTS. NAME.",
"relative_pos": [
65.06,
1.76
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "DWG NO. OR STD. NO.",
"relative_pos": [
19.43,
1.76
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "PARTS .NO.",
"relative_pos": [
7.77,
1.76
],
"alignment": "BOTTOM_CENTER",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "MASSkg",
"relative_pos": [
148.32,
1.7
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "质量",
"relative_pos": [
142.49,
0.87
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
"column_definitions": [
{
"name": "件号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.82, 1.46],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
{
"name": "图号或标准号",
"relative_x_start": 15.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [14.77, 1.15],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名称",
"relative_x_start": 45.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [1.76, 3.88],
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"data_key": "english_name",
"relative_pos": [1.79, 1.0],
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [18.68, 3.9],
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "数量",
"relative_x_start": 100.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [4.97, 1.37],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材料",
"relative_x_start": 110.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [15.16, 1.12],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "单",
"relative_x_start": 140.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "总",
"relative_x_start": 150.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "备注",
"relative_x_start": 160.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [12.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
}
]
}

View File

@ -0,0 +1,170 @@
{
"row_height": 8.0,
"column_definitions": [
{
"name": "件 号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.82,
1.46
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
{
"name": "图号或标准号",
"relative_x_start": 15.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
14.77,
1.15
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名 称",
"relative_x_start": 45.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [
1.76,
3.88
],
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"data_key": "english_name",
"relative_pos": [
1.79,
1.0
],
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [
18.68,
3.9
],
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "数量",
"relative_x_start": 100.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
4.97,
1.37
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材 料",
"relative_x_start": 110.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
15.16,
1.12
],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "单",
"relative_x_start": 140.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "总",
"relative_x_start": 150.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
5.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "备 注",
"relative_x_start": 160.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [
10.06,
1.42
],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
}
]
}

View File

@ -0,0 +1,13 @@
[
{"件 号": {"main": "1"}, "图号或标准号": {"main": "JB/T 1001"}, "名 称": {"chinese_name": "轴承座", "english_name": "Bearing Seat"}, "数量": {"main": "2"}, "材 料": {"main": "HT200"}, "单": {"main": "15.5"}, "总": {"main": "31.0"}, "备 注": {"main": "外购"}},
{"件 号": {"main": "2"}, "图号或标准号": {"main": "GB/T 5783"}, "名 称": {"chinese_name": "六角螺栓", "english_name": "Hex Bolt"}, "数量": {"main": "8"}, "材 料": {"main": "Q235"}, "单": {"main": "0.5"}, "总": {"main": "4.0"}, "备 注": {"main": "M8x20"}},
{"件 号": {"main": "3"}, "图号或标准号": {"main": "GB/T 93"}, "名 称": {"chinese_name": "弹簧垫圈", "english_name": "Spring Washer"}, "数量": {"main": "8"}, "材 料": {"main": "65Mn"}, "单": {"main": "0.1"}, "总": {"main": "0.8"}, "备 注": {"main": "d8"}},
{"件 号": {"main": "4"}, "图号或标准号": {"main": "JB/T 2002"}, "名 称": {"chinese_name": "齿轮", "english_name": "Gear"}, "数量": {"main": "1"}, "材 料": {"main": "40Cr"}, "单": {"main": "25.0"}, "总": {"main": "25.0"}, "备 注": {"main": "调质"}},
{"件 号": {"main": "5"}, "图号或标准号": {"main": "HG/T 3030"}, "名 称": {"chinese_name": "密封圈", "english_name": "Seal Ring"}, "数量": {"main": "2"}, "材 料": {"main": "NBR"}, "单": {"main": "2.3"}, "总": {"main": "4.6"}, "备 注": {"main": ""}},
{"件 号": {"main": "6"}, "图号或标准号": {"main": "JB/T 3003"}, "名 称": {"chinese_name": "键", "english_name": "Key"}, "数量": {"main": "1"}, "材 料": {"main": "45#"}, "单": {"main": "0.2"}, "总": {"main": "0.2"}, "备 注": {"main": "A型"}},
{"件 号": {"main": "7"}, "图号或标准号": {"main": "GB/T 119"}, "名 称": {"chinese_name": "圆柱销", "english_name": "Dowel Pin"}, "数量": {"main": "4"}, "材 料": {"main": "35#"}, "单": {"main": "0.3"}, "总": {"main": "1.2"}, "备 注": {"main": ""}},
{"件 号": {"main": "8"}, "图号或标准号": {"main": "JB/T 4004"}, "名 称": {"chinese_name": "轴", "english_name": "Shaft"}, "数量": {"main": "1"}, "材 料": {"main": "40CrNiMo"}, "单": {"main": "50.0"}, "总": {"main": "50.0"}, "备 注": {"main": "精加工"}},
{"件 号": {"main": "9"}, "图号或标准号": {"main": "GB/T 276"}, "名 称": {"chinese_name": "深沟球轴承", "english_name": "Deep Groove Ball Bearing"}, "数量": {"main": "2"}, "材 料": {"main": "GCr15"}, "单": {"main": "18.0"}, "总": {"main": "36.0"}, "备 注": {"main": "外购"}},
{"件 号": {"main": "10"}, "图号或标准号": {"main": "JB/T 5005"}, "名 称": {"chinese_name": "端盖", "english_name": "End Cap"}, "数量": {"main": "1"}, "材 料": {"main": "ZG270-500"}, "单": {"main": "8.5"}, "总": {"main": "8.5"}, "备 注": {"main": ""}}
]

View File

@ -0,0 +1,485 @@
{
"template_name": "标准物料清单-底部表头",
"row_height": 8.0,
"header_height": 14.0,
"column_boundaries": [
0.0,
15.0,
45.0,
100.0,
110.0,
140.0,
150.0,
160.0,
180.0
],
"header_definition": {
"lines": [
{
"start": [
0.0,
14.0
],
"end": [
185.0,
14.0
]
},
{
"start": [
160.0,
6.5
],
"end": [
140.0,
6.5
]
},
{
"start": [
110.0,
0.0
],
"end": [
110.0,
14.0
]
},
{
"start": [
15.0,
14.0
],
"end": [
15.0,
0.0
]
},
{
"start": [
45.0,
0.0
],
"end": [
45.0,
14.0
]
},
{
"start": [
100.0,
0.0
],
"end": [
100.0,
14.0
]
},
{
"start": [
140.0,
0.0
],
"end": [
140.0,
14.0
]
},
{
"start": [
160.0,
0.0
],
"end": [
160.0,
14.0
]
},
{
"start": [
150.0,
6.5
],
"end": [
150.0,
14.0
]
},
{
"start": [
0.0,
0.0
],
"end": [
185.0,
0.0
]
},
{
"start": [
180.0,
0.0
],
"end": [
180.0,
14.0
]
}
],
"texts": [
{
"content": "总",
"relative_pos": [
153.62,
10.23
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "单",
"relative_pos": [
143.79,
10.02
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "TOTAL",
"relative_pos": [
152.64,
7.45
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "SINGLE",
"relative_pos": [
141.89,
7.45
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "备 注",
"relative_pos": [
169.33,
6.8
],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "材 料",
"relative_pos": [
121.56,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "数量",
"relative_pos": [
102.5,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "名 称",
"relative_pos": [
67.3,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "件 号",
"relative_pos": [
4.43,
6.56
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "图号或标准号",
"relative_pos": [
22.43,
6.53
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "MAT'L",
"relative_pos": [
122.94,
2.33
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "QTY.",
"relative_pos": [
102.89,
2.33
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "REMARKS",
"relative_pos": [
165.48,
2.3
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "PARTS. NAME.",
"relative_pos": [
65.06,
1.76
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "DWG NO. OR STD. NO.",
"relative_pos": [
19.43,
1.76
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "PARTS .NO.",
"relative_pos": [
7.77,
1.76
],
"alignment": "BOTTOM_CENTER",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "MASSkg",
"relative_pos": [
148.32,
1.7
],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"content": "质量",
"relative_pos": [
142.49,
0.87
],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
"column_definitions": [
{
"name": "件 号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.82, 1.46],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
}
]
},
{
"name": "图号或标准号",
"relative_x_start": 15.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [14.77, 1.15],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名 称",
"relative_x_start": 45.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [1.76, 3.88],
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 3
},
{
"data_key": "english_name",
"relative_pos": [1.79, 1.0],
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [18.68, 3.9],
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "数量",
"relative_x_start": 100.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [4.97, 1.37],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材 料",
"relative_x_start": 110.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [15.16, 1.12],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "单",
"relative_x_start": 140.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "总",
"relative_x_start": 150.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [5.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "备 注",
"relative_x_start": 160.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [10.06, 1.42],
"alignment": "BOTTOM_CENTER",
"height": 3.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
}
]
}

View File

@ -0,0 +1,146 @@
{
"row_height": 8.0,
"column_definitions": [
{
"name": "件号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [7.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名称",
"relative_x_start": 20.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [2.0, 3.58],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "english_name",
"relative_pos": [2.0, 1.0],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [20.0, 4.1],
"alignment": "BOTTOM_LEFT",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材料",
"relative_x_start": 65.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [15.0, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "chinese_name",
"relative_pos": [15.0, 3.58],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "english_name",
"relative_pos": [15.0, 1.0],
"alignment": "BOTTOM_CENTER",
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
}
]
},
{
"name": "质量",
"relative_x_start": 95.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [10.0, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "比例",
"relative_x_start": 115.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [7.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "所在图号",
"relative_x_start": 130.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [12.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "装配图号",
"relative_x_start": 155.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [12.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
}
]
}

View File

@ -0,0 +1,255 @@
[
{
"件号": {
"main": "11"
},
"名称": {
"chinese_name": "螺栓",
"english_name": "Bolt",
"specification": "M10x30"
},
"材料": {
"main": "ML35"
},
"质量": {
"main": "0.02"
},
"比例": {
"main": "1:1"
},
"所在图号": {
"main": "A-001-11"
},
"装配图号": {
"main": "A-001"
}
},
{
"件号": {
"main": "12"
},
"名称": {
"chinese_name": "外壳",
"english_name": "Housing",
"specification": ""
},
"材料": {
"chinese_name": "铸铁",
"english_name": "Cast Iron"
},
"质量": {
"main": "5.2"
},
"比例": {
"main": "1:2"
},
"所在图号": {
"main": "B-002-01"
},
"装配图号": {
"main": "B-002"
}
},
{
"件号": {
"main": "13"
},
"名称": {
"chinese_name": "齿轮轴",
"english_name": "Gear Shaft",
"specification": "m=2, z=30"
},
"材料": {
"main": "40Cr"
},
"质量": {
"main": "1.8"
},
"比例": {
"main": "1:1"
},
"所在图号": {
"main": "B-002-02"
},
"装配图号": {
"main": "B-002"
}
},
{
"件号": {
"main": "14"
},
"名称": {
"chinese_name": "盖板",
"english_name": "Cover Plate",
"specification": ""
},
"材料": {
"main": "Q235-A"
},
"质量": {
"main": "0.75"
},
"比例": {
"main": "1:2"
},
"所在图号": {
"main": "C-003-01"
},
"装配图号": {
"main": "C-003"
}
},
{
"件号": {
"main": "15"
},
"名称": {
"chinese_name": "轴承",
"english_name": "Bearing",
"specification": "6204"
},
"材料": {
"main": "GCr15"
},
"质量": {
"main": "0.1"
},
"比例": {
"main": ""
},
"所在图号": {
"main": ""
},
"装配图号": {
"main": "B-002"
}
},
{
"件号": {
"main": "16"
},
"名称": {
"chinese_name": "密封垫",
"english_name": "Gasket",
"specification": "DN100"
},
"材料": {
"chinese_name": "石棉橡胶板",
"english_name": "Asbestos Rubber"
},
"质量": {
"main": "0.05"
},
"比例": {
"main": ""
},
"所在图号": {
"main": ""
},
"装配图号": {
"main": "C-003"
}
},
{
"件号": {
"main": "17"
},
"名称": {
"chinese_name": "联轴器",
"english_name": "Coupling",
"specification": "HL3"
},
"材料": {
"main": "HT200"
},
"质量": {
"main": "3.5"
},
"比例": {
"main": "1:2.5"
},
"所在图号": {
"main": "D-004-01"
},
"装配图号": {
"main": "D-004"
}
},
{
"件号": {
"main": "18"
},
"名称": {
"chinese_name": "电机支架",
"english_name": "Motor Bracket",
"specification": ""
},
"材料": {
"main": "SS304"
},
"质量": {
"main": "2.1"
},
"比例": {
"main": "1:2"
},
"所在图号": {
"main": "D-004-02"
},
"装配图号": {
"main": "D-004"
}
},
{
"件号": {
"main": "19"
},
"名称": {
"chinese_name": "观察窗",
"english_name": "Sight Glass",
"specification": "DN50"
},
"材料": {
"chinese_name": "有机玻璃",
"english_name": "Plexiglass"
},
"质量": {
"main": "0.3"
},
"比例": {
"main": ""
},
"所在图号": {
"main": ""
},
"装配图号": {
"main": "C-003"
}
},
{
"件号": {
"main": "20"
},
"名称": {
"chinese_name": "活塞",
"english_name": "Piston",
"specification": "D=80"
},
"材料": {
"main": "ZL101"
},
"质量": {
"main": "0.9"
},
"比例": {
"main": "1:1"
},
"所在图号": {
"main": "E-005-01"
},
"装配图号": {
"main": "E-005"
}
}
]

View File

@ -0,0 +1,320 @@
{
"template_name": "标准物料清单-底部表头",
"row_height": 12.0,
"header_height": 12.0,
"column_boundaries": [
0.0,
20.0,
65.0,
95.0,
115.0,
130.0,
155.0,
180.0
],
"header_definition": {
"lines": [
{
"start": [0.0, 0.0],
"end": [180.0, 0.0]
},
{
"start": [0.0, 0.0],
"end": [0.0, 12.0]
},
{
"start": [20.0, 0.0],
"end": [20.0, 12.0]
},
{
"start": [65.0, 0.0],
"end": [65.0, 12.0]
},
{
"start": [95.0, 0.0],
"end": [95.0, 12.0]
},
{
"start": [115.0, 0.0],
"end": [115.0, 12.0]
},
{
"start": [130.0, 0.0],
"end": [130.0, 12.0]
},
{
"start": [155.0, 0.0],
"end": [155.0, 12.0]
},
{
"start": [180.0, 0.0],
"end": [180.0, 12.0]
}
],
"texts": [
{
"content": "件 号",
"relative_pos": [6.16, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "PART NO.",
"relative_pos": [5.29, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "名 称",
"relative_pos": [35.60, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "PARTS. NAME.",
"relative_pos": [35.45, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "材 料",
"relative_pos": [75.65, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "MAT'L",
"relative_pos": [76.19, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "质量",
"relative_pos": [98.70, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "(kg)",
"relative_pos": [104.32, 6.25],
"height": 3,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "MASS",
"relative_pos": [102.15, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "比 例",
"relative_pos": [119.09, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "SCALE",
"relative_pos": [119.04, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "所在图号",
"relative_pos": [137.23, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "DWG. NO.",
"relative_pos": [138.16, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "装配图号",
"relative_pos": [162.59, 6.25],
"height": 3.5,
"style": "HZ",
"layer": "6文字层",
"color": 256
},
{
"content": "ASSY. DWG. NO.",
"relative_pos": [160.50, 1.89],
"height": 2.0,
"style": "HZ",
"layer": "6文字层",
"color": 256
}
]
},
"column_definitions": [
{
"name": "件号",
"relative_x_start": 0.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [7.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "名称",
"relative_x_start": 20.0,
"text_definitions": [
{
"data_key": "chinese_name",
"relative_pos": [2.0, 3.58],
"alignment": "BOTTOM_LEFT",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "english_name",
"relative_pos": [2.0, 1.0],
"alignment": "BOTTOM_LEFT",
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
},
{
"data_key": "specification",
"relative_pos": [20.0, 4.1],
"alignment": "BOTTOM_LEFT",
"height": 3.0,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "材料",
"relative_x_start": 65.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [15.0, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "chinese_name",
"relative_pos": [15.0, 3.58],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
},
{
"data_key": "english_name",
"relative_pos": [15.0, 1.0],
"alignment": "BOTTOM_CENTER",
"height": 2.0,
"style": "HZTXT",
"layer": "2",
"color": 256
}
]
},
{
"name": "质量",
"relative_x_start": 95.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [10.0, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "比例",
"relative_x_start": 115.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [7.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "所在图号",
"relative_x_start": 130.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [12.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
},
{
"name": "装配图号",
"relative_x_start": 155.0,
"text_definitions": [
{
"data_key": "main",
"relative_pos": [12.5, 2.17],
"alignment": "BOTTOM_CENTER",
"height": 3.5,
"style": "HZTXT",
"layer": "6文字层",
"color": 256
}
]
}
]
}