diff --git a/zh-cn/assets/cover-4e3a952e.webp b/zh-cn/assets/cover-4e3a952e.webp new file mode 100644 index 0000000..3b8754f Binary files /dev/null and b/zh-cn/assets/cover-4e3a952e.webp differ diff --git a/zh-cn/assets/cover-c8ddd07b.webp b/zh-cn/assets/cover-c8ddd07b.webp new file mode 100644 index 0000000..35137cf Binary files /dev/null and b/zh-cn/assets/cover-c8ddd07b.webp differ diff --git a/zh-cn/assets/cover54-00d520f8.jpg b/zh-cn/assets/cover54-00d520f8.jpg deleted file mode 100644 index 54a1e7f..0000000 Binary files a/zh-cn/assets/cover54-00d520f8.jpg and /dev/null differ diff --git a/zh-cn/assets/cover55-a634f887.jpg b/zh-cn/assets/cover55-a634f887.jpg new file mode 100644 index 0000000..817dff1 Binary files /dev/null and b/zh-cn/assets/cover55-a634f887.jpg differ diff --git a/zh-cn/assets/image1-66970db4.png b/zh-cn/assets/image1-66970db4.png new file mode 100644 index 0000000..0c3e27b Binary files /dev/null and b/zh-cn/assets/image1-66970db4.png differ diff --git a/zh-cn/assets/image1-68a1977a.webp b/zh-cn/assets/image1-68a1977a.webp new file mode 100644 index 0000000..fa3f4cc Binary files /dev/null and b/zh-cn/assets/image1-68a1977a.webp differ diff --git a/zh-cn/assets/image1-d5c7d3eb.webp b/zh-cn/assets/image1-d5c7d3eb.webp new file mode 100644 index 0000000..6571425 Binary files /dev/null and b/zh-cn/assets/image1-d5c7d3eb.webp differ diff --git a/zh-cn/assets/image1-ec71eac6.webp b/zh-cn/assets/image1-ec71eac6.webp new file mode 100644 index 0000000..1a33e06 Binary files /dev/null and b/zh-cn/assets/image1-ec71eac6.webp differ diff --git a/zh-cn/assets/image2-4eebd69c.webp b/zh-cn/assets/image2-4eebd69c.webp new file mode 100644 index 0000000..fcf8fce Binary files /dev/null and b/zh-cn/assets/image2-4eebd69c.webp differ diff --git a/zh-cn/assets/image2-e552170a.png b/zh-cn/assets/image2-e552170a.png new file mode 100644 index 0000000..53307be Binary files /dev/null and b/zh-cn/assets/image2-e552170a.png differ diff --git a/zh-cn/assets/image2-f875fe8b.webp b/zh-cn/assets/image2-f875fe8b.webp new file mode 100644 index 0000000..b6cb2ee Binary files /dev/null and b/zh-cn/assets/image2-f875fe8b.webp differ diff --git a/zh-cn/assets/image3-11daa3fe.webp b/zh-cn/assets/image3-11daa3fe.webp new file mode 100644 index 0000000..e011921 Binary files /dev/null and b/zh-cn/assets/image3-11daa3fe.webp differ diff --git a/zh-cn/assets/image3-2010f131.webp b/zh-cn/assets/image3-2010f131.webp new file mode 100644 index 0000000..484323c Binary files /dev/null and b/zh-cn/assets/image3-2010f131.webp differ diff --git a/zh-cn/assets/image4-30403828.webp b/zh-cn/assets/image4-30403828.webp new file mode 100644 index 0000000..2e0a27d Binary files /dev/null and b/zh-cn/assets/image4-30403828.webp differ diff --git a/zh-cn/assets/image4-6a30f302.png b/zh-cn/assets/image4-6a30f302.png new file mode 100644 index 0000000..5e5663e Binary files /dev/null and b/zh-cn/assets/image4-6a30f302.png differ diff --git a/zh-cn/assets/image5-7c696faa.webp b/zh-cn/assets/image5-7c696faa.webp new file mode 100644 index 0000000..1168cbe Binary files /dev/null and b/zh-cn/assets/image5-7c696faa.webp differ diff --git a/zh-cn/assets/image6-a778303e.webp b/zh-cn/assets/image6-a778303e.webp new file mode 100644 index 0000000..7c2bd30 Binary files /dev/null and b/zh-cn/assets/image6-a778303e.webp differ diff --git a/zh-cn/assets/image7-ba335a80.webp b/zh-cn/assets/image7-ba335a80.webp new file mode 100644 index 0000000..3eaf10f Binary files /dev/null and b/zh-cn/assets/image7-ba335a80.webp differ diff --git a/zh-cn/assets/image8-6a8e4dea.webp b/zh-cn/assets/image8-6a8e4dea.webp new file mode 100644 index 0000000..28169aa Binary files /dev/null and b/zh-cn/assets/image8-6a8e4dea.webp differ diff --git a/zh-cn/assets/image9-9202db97.webp b/zh-cn/assets/image9-9202db97.webp new file mode 100644 index 0000000..0eaa340 Binary files /dev/null and b/zh-cn/assets/image9-9202db97.webp differ diff --git a/zh-cn/assets/index-a1bcce61.js b/zh-cn/assets/index-043be87f.js similarity index 87% rename from zh-cn/assets/index-a1bcce61.js rename to zh-cn/assets/index-043be87f.js index 1fe8407..cdbb6b7 100644 --- a/zh-cn/assets/index-a1bcce61.js +++ b/zh-cn/assets/index-043be87f.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",s="/zh-cn/assets/image2-4624885a.gif",p="/zh-cn/assets/image3-ea54df7e.jpg",a=[t,e,s,p],l={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},c=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],n=`

嘉宾介绍

+const s="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg",t="/zh-cn/assets/image2-4624885a.gif",p="/zh-cn/assets/image3-ea54df7e.jpg",a=[s,e,t,p],c={label:"直播预告 | RDMA软件接口高层封装",description:"RDMA 作为高速通信协议被数据中心广泛使用,但是因为底层接口设计得过于繁复,对使用者造成了很大的不便,因此我们使用 Rust 语言对 RDMA 进行了一层高层封装。这次分享将介绍这层封装的做法和原理。",cover:"./cover.png",location:"香港",date:"2022-05-17",title:"RDMA Software Interface High Level Package"},l=[{label:"嘉宾介绍",level:2},{label:"讨论内容",level:2},{label:"观看方式",level:2},{label:"特别鸣谢",level:2}],n=`

嘉宾介绍

施继成

达坦科技联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选 2022 年度 6 氪 S 级创业者名册,荣获中国“企业工具与底层软件”领域 “36 位 36 岁以下创业者“称号。

讨论内容

@@ -13,8 +13,8 @@ const t="/zh-cn/assets/cover-39643179.png",e="/zh-cn/assets/image1-a93ba076.jpg"

本次直播我们将在【腾讯会议】进行,欢迎大家观看,没时间观看直播的同学可以关注回放,会议结束后回放在阅码场官网上传,年卡阅码场会员和其他阅码场训练营专业群资深用户免费点播。

图片

特别鸣谢

-

图片

+

图片

转发本文,文末留言提问、加群提问、或者现场提问,我们将赠送 1 本书,数量有限,送完为止。

↓ 扫码加入本次直播交流群;

图片

-

咨询的小伙伴,可添加小月@阅码场的微信 Linuxer2016 咨询

`;export{a as assetURLs,n as default,l as metadata,c as toc}; +

咨询的小伙伴,可添加小月@阅码场的微信 Linuxer2016 咨询

`;export{a as assetURLs,n as default,c as metadata,l as toc}; diff --git a/zh-cn/assets/index-e2a1595e.js b/zh-cn/assets/index-047539e4.js similarity index 91% rename from zh-cn/assets/index-e2a1595e.js rename to zh-cn/assets/index-047539e4.js index c1a6320..333cd8a 100644 --- a/zh-cn/assets/index-e2a1595e.js +++ b/zh-cn/assets/index-047539e4.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],s={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},n=[],p=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

+const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg",e=[o,t],n={label:"硬件敏捷开发与验证方法学研讨",description:"作为2022年第二届RISC-V中国峰会的同期活动,8月27日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。",cover:"./cover.png",location:"新加坡",date:"2022-08-23",title:"Hardware Agile Development and Verification Methodology Workshop"},s=[],l=`

作为 2022 年第二届 RISC-V 中国峰会的同期活动,8 月 27 日下午,达坦科技将在线上举办硬件敏捷开发与验证方法学研讨。

如何提升数字芯片的开发和验证效率一直是业界关注的焦点。近年来随着 Chisel、SpinalHDL 等等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HLS。此外,基于 Python,以 Cocotb 和 pyuvm 为代表的新一代验证框架的推出,使得验证的周期得到一定程度的缩减,特别是基于 Python 的验证框架可以复用 Python 生态丰富的已有工具和模型,大大减少了 Golden Reference 的工作量。

更重要的是,这些新一代 HDL 打开了全新的数字芯片敏捷设计和验证的方法学大门。本次研讨将邀请业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。

参与本次研讨的听众可以深入了解业界关于硬件敏捷开发与验证的最前沿探索,诸如:

@@ -11,4 +11,4 @@ const o="/zh-cn/assets/cover-9c53ea5f.png",t="/zh-cn/assets/imgae1-084eb861.jpg"

活动时间:8 月 27 日,13:15-17:15
活动链接:https://t.elecfans.com/live/2113.html
感兴趣的听众可以添加海报中的群主二维码加入讨论群,添加时请注明硬件敏捷开发和验证方法学研讨。

-

图片

`;export{e as assetURLs,p as default,s as metadata,n as toc}; +

图片

`;export{e as assetURLs,l as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-96aee43d.js b/zh-cn/assets/index-0850e6f5.js similarity index 96% rename from zh-cn/assets/index-96aee43d.js rename to zh-cn/assets/index-0850e6f5.js index 750a395..ec0052b 100644 --- a/zh-cn/assets/index-96aee43d.js +++ b/zh-cn/assets/index-0850e6f5.js @@ -1,4 +1,4 @@ -const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg",t=[p,o],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],i=`

喷泉码简介

+const o="/zh-cn/assets/image1-f1a8209b.jpg",p="/zh-cn/assets/image2-f5de5635.jpg",t=[o,p],l={label:"喷泉码浅谈",description:"喷泉码(Fountain Code)是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。",location:"新疆",author:["施继成"],tags:["RDMA"],date:"2023-08-31",title:"Fountain Code"},a=[{label:"喷泉码简介",level:2},{label:"LT 编码",level:2},{label:"Raptor 算法",level:2},{label:"总结",level:2}],r=`

喷泉码简介

**喷泉码(Fountain Code)**是一种在无线通信、数据传输和网络编码领域中使用的错误纠正技术。它与传统的纠错码和编码方法有所不同,喷泉码被设计用于在不确定信道条件下的高效数据传输。

传统的纠错码(如海明码、RS 码等)通常需要在发送方对数据进行编码,接收方则使用相同的编码进行解码和纠错。这些方法一般具有固定的码率(Code Rate),即针对一定长度的原始数据,编码后的长度是固定的,这些方法在面对不稳定的信道或严重的信道丢失时可能效果不佳。相比之下,喷泉码通过在发送方生成随机的冗余数据,然后将其注入到原始数据中,以创造出一个“喷泉”流——相应的码率也也就不固定了。接收方可以从这个流中采样任意数量的数据包,并将它们合并以恢复原始数据。

喷泉码的一种常见应用是在无线传感器网络中,其中网络节点之间的通信可能受到弱信号、干扰和多径传播等因素的影响。通过使用喷泉码,节点可以在较差的通信条件下实现可靠的数据传输。

@@ -30,11 +30,11 @@ const p="/zh-cn/assets/image1-f1a8209b.jpg",o="/zh-cn/assets/image2-f5de5635.jpg

上述所说的局限性是受到信息论的约束的,无法进一步降低。那么我们有没有办法实现一种方式来降低计算资源的消耗呢?比如我们如果不需要恢复出全部的原始数据呢?受到这个思路的启发 Raptor 算法应运而生。

Raptor 算法

Raptor 本质上是一类混合编码方式,结合 LT 编码和 LDPC 编码,同时获取了两种编码的好处。如下图所示:

-

图片

-

Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

图片

+

Raptor 编码首先通过 LDPC 编码进行一次固定码率编码,形成一个中间编码层,然后再对该编码层进行 LT 编码,生成最终的编码数据块。当然 Raptor 编码也会有其他变种,不过原理大同小异,例如下图所示:

+

图片

该编码具有三层结构,中间编码结果经过了两层固定码率编码,分别是 Hamming 编码LDPC 编码,然后再进行 LT 编码生成最终的编码块。

针对 Raptor 编码的解码方式一般有两种。第一种和编码方式完全相反,首先利用 LT 编码的解码方式恢复出部分的中间编码块,然后利用固定编码的解码方式恢复出原始的数据块。第二种方式则是将上述所有的多层编码方式都变成一种矩阵运算,针对收到数据后利用矩阵的高斯消元方法解出原始的数据块。

现有为人所熟知的 Raptor 编码主要有 RFC 5053 和 RFC 6330 RaptorQ 编码。两者的实现细节有诸多区别,但是内在的思路和上述的方法是类似的,有兴趣的读者可以进一步进行阅读和学习。

总结

-

喷泉码是一种无固定码率的编码方式,其中比较著名的有 LT 编码和 Raptor 编码。LT 编码算法简单,实现也简单,但是算法效率不高。Raptor 算法结合了 LT 编码和一些固定码率编码,利用混合编码的方式实现了高效的喷泉码。

`;export{t as assetURLs,i as default,l as metadata,a as toc}; +

喷泉码是一种无固定码率的编码方式,其中比较著名的有 LT 编码和 Raptor 编码。LT 编码算法简单,实现也简单,但是算法效率不高。Raptor 算法结合了 LT 编码和一些固定码率编码,利用混合编码的方式实现了高效的喷泉码。

`;export{t as assetURLs,r as default,l as metadata,a as toc}; diff --git a/zh-cn/assets/index-17fcbde5.js b/zh-cn/assets/index-0a77c99b.js similarity index 95% rename from zh-cn/assets/index-17fcbde5.js rename to zh-cn/assets/index-0a77c99b.js index 10a4eb3..edec2b3 100644 --- a/zh-cn/assets/index-17fcbde5.js +++ b/zh-cn/assets/index-0a77c99b.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",o=[s,t,n],p={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},r=[],a=`

封面

+const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg",n="/zh-cn/assets/image1-f46bfcc6.jpg",o=[s,t,n],p={label:"当RDMA遇到Rust",description:"2022年8月5日-6日,一年一度的中国开源基础设施活动日(OpenInfra Days China)即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。",cover:"./cover.png",location:"新加坡",date:"2022-08-04",title:"When RDMA meets Rust"},r=[],e=`

封面

2022 年 8 月 5 日-6 日,**一年一度的中国开源基础设施活动日(OpenInfra Days China)**即将在线上举行。本次会议没有限定一个统一的主题,主要聚焦云计算基础设施、云原生技术与应用实践、开源治理、5G、算力网络与边缘计算五大主题方向。

云计算基础设施分论坛主要聚焦云计算基础设施领域的前沿技术和优秀实践,围绕多硬件架构和多操作系统支持、人工智能技术应用、网络与存储,数据处理 DPU 及其他加速硬件、硬件自动化和智能运维等方面展开技术分享和探讨。达坦科技联合创始人施继成将在这一分论坛做题为当 RDMA 遇到 Rust 的专题分享。

图片

@@ -10,4 +10,4 @@ const s="/zh-cn/assets/cover-48216986.png",t="/zh-cn/assets/image1-02771bf0.jpg"

参会方式

想要了解更多达坦科技为什么选择 Rust 做 RDMA 库,以及开发设计背后的理念、逻辑、和实践经验,欢迎扫描海报二维码,免费注册报名。

有意加入 Rust 前沿交流讨论群,请添加小助手微信:

-

图片

`;export{o as assetURLs,a as default,p as metadata,r as toc}; +

图片

`;export{o as assetURLs,e as default,p as metadata,r as toc}; diff --git a/zh-cn/assets/index-38e8d7df.js b/zh-cn/assets/index-0bd243e2.js similarity index 92% rename from zh-cn/assets/index-38e8d7df.js rename to zh-cn/assets/index-0bd243e2.js index 1f4cf8f..460e0be 100644 --- a/zh-cn/assets/index-38e8d7df.js +++ b/zh-cn/assets/index-0bd243e2.js @@ -1,6 +1,6 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",s="/zh-cn/assets/image1-b73fb0ee.jpg",e=[t,s],n={label:"Rust唠嗑室:Xline-跨数据中心一致性管理",description:"随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-11",title:"Rust Chat Room: Xline Cross Data Center Consistency Management"},o=[{label:"内容简介",level:2}],a=`

图片

+const t="/zh-cn/assets/cover-3674aa81.jpg",s="/zh-cn/assets/image1-b73fb0ee.jpg",n=[t,s],e={label:"Rust唠嗑室:Xline-跨数据中心一致性管理",description:"随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。",cover:"./cover.jpg",location:"中国香港",tags:["Xline"],date:"2022-10-11",title:"Rust Chat Room: Xline Cross Data Center Consistency Management"},o=[{label:"内容简介",level:2}],a=`

图片

内容简介

随着互联网和云计算的业务规模越来越大,单个数据中心已经无法满足业务的需求,业务系统从单数据中心向多数据中心发展,多地多中心多活部署的需求也越来越普遍。多数据中心架构最大的挑战是,如何保证数据跨数据中心访问的一致性和性能。比如索引、权限、配置等这类需要跨数据中心共享访问的元数据,如何在多中心竞争修改的场景下,仍然能保持一致性,并且保证访问性能。

传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord 推出开源的分布式 KV 存储 Xline,就是针对多数据中心场景,实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性,方便业务系统实现多地多中心多活部署。

本周六(10 月 15 日)下午 3 点,达坦科技和 Rust 语言中文社区合作,由达坦科技的联合创始人施继成在 Rust 唠嗑室做开源分布式存储技术的分享,介绍 Xline 是如何实现高性能跨数据中心的数据一致性管理。欢迎大家预约收看!

-

图片

`;export{e as assetURLs,a as default,n as metadata,o as toc}; +

图片

`;export{n as assetURLs,a as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-4e03f569.js b/zh-cn/assets/index-1179d885.js similarity index 97% rename from zh-cn/assets/index-4e03f569.js rename to zh-cn/assets/index-1179d885.js index e782740..b0b0d1b 100644 --- a/zh-cn/assets/index-4e03f569.js +++ b/zh-cn/assets/index-1179d885.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png",e=[t,l],r={label:"欢迎加入达坦科技硬件设计学习社区",description:"近年来随着Bluespec、Chisel、SpinalHDL、PyMTL等一众新一代HDL的推出,业界逐步感受到新一代HDL在数字芯片设计效率方面的提升。相比Verilog和VHDL,这些新一代HDL在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合HLS,这些新一代HDL支持RTL级描述能力,在芯片性能的把控方面远超HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究CPU设计,而CPU是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。",cover:"./cover.png",location:"新加坡",date:"2023-01-12",title:"Welcome to join Datan Technology hardware design learning community"},s=[{label:"学习目的",level:2},{label:"学习内容",level:2},{label:"适合人群",level:2},{label:"学习方式",level:2},{label:"学习规划",level:2},{label:"参与方式",level:2}],o=`

近年来随着 Bluespec、Chisel、SpinalHDL、PyMTL 等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究 CPU 设计,而 CPU 是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。

+const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png",e=[t,l],s={label:"欢迎加入达坦科技硬件设计学习社区",description:"近年来随着Bluespec、Chisel、SpinalHDL、PyMTL等一众新一代HDL的推出,业界逐步感受到新一代HDL在数字芯片设计效率方面的提升。相比Verilog和VHDL,这些新一代HDL在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合HLS,这些新一代HDL支持RTL级描述能力,在芯片性能的把控方面远超HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究CPU设计,而CPU是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。",cover:"./cover.png",location:"新加坡",date:"2023-01-12",title:"Welcome to join Datan Technology hardware design learning community"},r=[{label:"学习目的",level:2},{label:"学习内容",level:2},{label:"适合人群",level:2},{label:"学习方式",level:2},{label:"学习规划",level:2},{label:"参与方式",level:2}],o=`

近年来随着 Bluespec、Chisel、SpinalHDL、PyMTL 等一众新一代 HDL 的推出,业界逐步感受到新一代 HDL 在数字芯片设计效率方面的提升。相比 Verilog 和 VHDL,这些新一代 HDL 在语法表达能力、代码简洁程度、错误检查等方面有不小的提升;相比高阶综合 HLS,这些新一代 HDL 支持 RTL 级描述能力,在芯片性能的把控方面远超 HSL。数字芯片的敏捷设计,其目的就是为了提升硬件设计效率,减少人为错误。无论用哪一种语言进行硬件设计,背后扎实的硬件设计相关知识是必不可少的,特别是体系结构,因为体系结构专门研究 CPU 设计,而 CPU 是当今最复杂的数字芯片之一,各种常见的数字芯片设计问题在体系结构领域都能找到对应的参照,诸如流水线、缓存、内存管理、缓存一致性、异常处理等等。

虽然国内大专院校计算机科学和电子工程专业都有开设体系结构或组成原理等相关课程,但是在实操环节缺失很多内容,特别是 CPU 里缓存、内存管理、异常处理相关的部分,基本上都不涉及。但是随着数字芯片的规模越来越大,芯片设计的复杂度指数级上升,对数字芯片的设计人员有很高的要求。当有志从事数字芯片设计的同学从学校走向社会,如何理解数字芯片设计的精髓,提升设计能力,成为能否胜任数字芯片设计工作的关键。

为此,达坦科技在 2023 年始,发起成立硬件设计学习社区,诚邀所有对硬件敏捷开发设计感兴趣的同学加入我们的学习社区。这里有志同道合的小伙伴,共同学习目标的互助自学小组,有耐心答疑的助教。我们一起花一个月的时间,系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。

学习目的

@@ -42,4 +42,4 @@ const t="/zh-cn/assets/cover-9c53ea5f.png",l="/zh-cn/assets/image1-0a18e154.png"
  • 准备好个人的简历,内容包括但不局限于:学校/专业、过往学术/项目经验
  • 扫码联系小助手报名邮箱info@datenlord.io注册学习档案,通过后加入硬件设计学习社区群即参与成功。
  • -

    图片

    `;export{e as assetURLs,o as default,r as metadata,s as toc}; +

    图片

    `;export{e as assetURLs,o as default,s as metadata,r as toc}; diff --git a/zh-cn/assets/index-8c16a843.js b/zh-cn/assets/index-1dde53bb.js similarity index 97% rename from zh-cn/assets/index-8c16a843.js rename to zh-cn/assets/index-1dde53bb.js index 529f710..23a48ca 100644 --- a/zh-cn/assets/index-8c16a843.js +++ b/zh-cn/assets/index-1dde53bb.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",l="/zh-cn/assets/image3-204919ac.png",p="/zh-cn/assets/image4-e50f112d.png",t="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,l,p,t],o={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},n=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

    数据库隔离级别介绍

    +const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png",l="/zh-cn/assets/image3-204919ac.png",p="/zh-cn/assets/image4-e50f112d.png",t="/zh-cn/assets/image5-cdb8d1de.png",i=[e,a,l,p,t],n={label:"数据库隔离级别及MVCC",description:"数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:",location:"中国香港",tags:["Xline"],date:"2023-02-16",title:"Database isolation level and MVCC"},o=[{label:"数据库隔离级别介绍",level:2},{label:"Read uncommitted",level:3},{label:"Repeatable read",level:3},{label:"Serializable",level:3},{label:"Snapshot 隔离级别及 MVCC",level:2},{label:"一点联想",level:2},{label:"总结",level:2}],s=`

    数据库隔离级别介绍

    数据库在同时处理多个事务时需要决定事务之间能否看到对方的修改,能看到多少等等。根据隔离的严格程度,从严到松可以分为 Serializable, Repeatable reads, Read committed, Read uncommitted。我们用下面这个 KV 存储的例子来解释这四个隔离级别。KV 存储的初始状态如下:

    Table 1:

    图片

    @@ -43,4 +43,4 @@ const e="/zh-cn/assets/image1-145af1bc.png",a="/zh-cn/assets/image2-b5b0ee19.png

    本文为大家介绍了数据库的四种隔离级别,分别用例子介绍了不同隔离级别之间的区别。然后详细介绍了 Snapshot 这个使用最广泛的隔离级别,并且说明了其最长用的实现方式 MVCC。最后结合了 MVCC 和 无锁数据结构的内存管理机制进行了对比和探讨。

    达坦科技 Xline 项目专注于跨云元数据管理 KV 存储,并且目前正在实践应用 MVCC 做数据库隔离。如果您想了解更多相关信息,请参考 Xline GitHub 链接:
    https://github.com/datenlord/Xline

    -

    本周次条是 Xline 最新版本的发布,请阅读《Xline v.0.2.0:一个用于元数据管理的分布式 KV 存储》。

    `;export{i as assetURLs,s as default,o as metadata,n as toc}; +

    本周次条是 Xline 最新版本的发布,请阅读《Xline v.0.2.0:一个用于元数据管理的分布式 KV 存储》。

    `;export{i as assetURLs,s as default,n as metadata,o as toc}; diff --git a/zh-cn/assets/index-62952ba7.js b/zh-cn/assets/index-1f712296.js similarity index 91% rename from zh-cn/assets/index-62952ba7.js rename to zh-cn/assets/index-1f712296.js index 80aafce..966fd1e 100644 --- a/zh-cn/assets/index-62952ba7.js +++ b/zh-cn/assets/index-1f712296.js @@ -1,9 +1,9 @@ -const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",a="/zh-cn/assets/image2-ee430ce0.png",e=[t,o,a],n={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},s=[],c=`

    封面

    +const t="/zh-cn/assets/cover-0645adbc.jpg",o="/zh-cn/assets/image1-4a25d469.jpg",e="/zh-cn/assets/image2-ee430ce0.png",s=[t,o,e],a={label:"达坦科技受邀在2022中国计算机学会芯片大会做硬件加速研究分享",description:"2022年7月29日至7月30日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。",cover:"./cover.jpg",location:"新加坡",date:"2022-08-04",title:"Dartan Technology Invited to Do Hardware Acceleration Research Sharing at 2022 China Computer Society Chip Conference"},n=[],i=`

    封面

    2022 年 7 月 29 日至 7 月 30 日,由中国计算机学会(CCF)集成电路设计专业委员会、容错计算专业委员会、体系结构专业委员会和信息存储技术专业委员会联合举办的学术大会中国计算机学会芯片大会在江苏南京如期圆满举行。

    2022 年 CCF 芯片大会由中科院计算所孙凝晖院士、中科院微电子所刘明院士担任大会主席,集结国内外知名专家学者,围绕智能化时代的芯片技术主题,论述芯片领域国际最前沿、权威和新颖的学术观点,包括芯片设计与 EDA、新型体系架构、前沿存储技术、容错计算应用等方面的关键技术和应用前景。

    达坦科技致力于软硬件深度融合的跨云存储平台,其硬件负责人吴迪带领研发团队在今年的Xilinx 全球自适应计算挑战赛上刚获得Big Data Analytics 赛道一等奖。此次,达坦科技提交的论文“基于 SpinalHDL 和 Cocotb 的 Poseidon 哈希算法硬件加速器的敏捷开发”也成功入选,并受邀在大会做分享。达坦科技的翁万正在 30 日下午领域专用架构与敏捷设计论文分组,向与会者介绍了研究背景、方法技术和实验结果。

    图片

    Poseidon 是一种全新的面向零知识证明的(ZKP:Zero-Knowledge Proof)密码学协议设计的哈希算法。相比经典的 SHA-256 和 Keccak 哈希函数, 在零知识证明的应用场景下, Poseidon 能够显著地减少哈希函数的约束条件进而降低证明的计算复杂度, 极大提升零知识证明系统的运行效率。Poseidon 哈希函数的计算涉及高位宽模乘和矩阵乘法运算, 需要消耗大量计算资源。为了提升哈希计算的效率, 达坦基于流水线和折叠技术提出了一种面向 FPGA 平台的 Poseidon 硬件加速器架构。

    在该整体架构下, 针对高位宽模乘, 达坦科技基于 Karatsuba 乘法拆分算法实现了一种高性能蒙哥马利模乘器。针对函数中的向量—矩阵乘法计算, 达坦科技基于脉动矩阵结构提出了一种高吞吐率的硬件实现。最终, 在搭载有 Xilinx Virtex Ultrascale+ FPGA 芯片的 Varium C1100 加速卡上, 硬件加速器每秒最高能完成 0.99M 次哈希计算, 达到 AMD Ryzen 5900X 处理器 Poseidon 计算速度的两倍。

    -

    图片

    -

    除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

    `;export{e as assetURLs,c as default,n as metadata,s as toc}; +

    图片

    +

    除了打造全新的广域网共识算法,达坦科技专注于自研面向存储网络的硬件加速,以期软硬件的深度融合能提升存储的性能。目前达坦科技的硬件项目 TRIDENT,已经在 Github 上开源,欢迎参与讨论:https://github.com/datenlord/TRIDENT。

    `;export{s as assetURLs,i as default,a as metadata,n as toc}; diff --git a/zh-cn/assets/index-daed041b.js b/zh-cn/assets/index-25293c60.js similarity index 99% rename from zh-cn/assets/index-daed041b.js rename to zh-cn/assets/index-25293c60.js index 6fecd90..57921fe 100644 --- a/zh-cn/assets/index-daed041b.js +++ b/zh-cn/assets/index-25293c60.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",S="/zh-cn/assets/image16-2de227b5.png",m="/zh-cn/assets/image17-ecbf7b1e.png",F="/zh-cn/assets/image18-88f5d1b8.png",R="/zh-cn/assets/image19-5df924ff.png",D="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",A=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,S,m,F,R,D,b],u={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},T=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

    本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

    +const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png",e="/zh-cn/assets/image3-b15b4acb.png",n="/zh-cn/assets/image4-e5ed8af3.png",l="/zh-cn/assets/image5-74f0a1a0.png",t="/zh-cn/assets/image6-5ab2a1df.png",a="/zh-cn/assets/image7-bfc65522.png",p="/zh-cn/assets/image8-462cfa81.png",s="/zh-cn/assets/image9-ecae19a3.png",d="/zh-cn/assets/image10-1092617f.png",P="/zh-cn/assets/image11-2508217f.png",c="/zh-cn/assets/image12-69f6226d.png",r="/zh-cn/assets/image13-62fe53ff.png",h="/zh-cn/assets/image14-048f6e24.png",g="/zh-cn/assets/image15-c04accbc.png",m="/zh-cn/assets/image16-2de227b5.png",D="/zh-cn/assets/image17-ecbf7b1e.png",F="/zh-cn/assets/image18-88f5d1b8.png",S="/zh-cn/assets/image19-5df924ff.png",R="/zh-cn/assets/image20-5dfde1d6.png",b="/zh-cn/assets/image21-90c388d7.png",A=[i,o,e,n,l,t,a,p,s,d,P,c,r,h,g,m,D,F,S,R,b],u={label:"万字长文,详述TRIDENT:Poseidon 哈希算法的硬件加速与实现!",description:"本文主要介绍了DatenLord团队在今年的Xilinx全球自适应计算挑战赛上获得 Big Data Analytics赛道一等奖的作品——TRIDENT:Poseidon哈希算法的硬件实现与加速。该项目基于Xilinx Varium C1100 FPGA加速卡,为 Filecoin 区块链应用中的Poseidon哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT基于 SpinalHDL 设计了Poseidon加速器 IP 并基于 Vivado中Block Design 工具搭建完整的FPGA硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为Filecoin应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从Poseidon哈希算法概述、基于SpinalHDL和Cocotb的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个TRIDENT项目进行详细的介绍。",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2022-06-30",title:"Ten thousand words long article, detailing the hardware acceleration and implementation of TRIDENT: Poseidon hash algorithm!"},T=[{label:"引言",level:2},{label:"0.1 Poseidon 与零知识证明",level:3},{label:"0.2 Filecoin 分布式存储网络",level:3},{label:"Poseidon 哈希算法概述",level:2},{label:"1.1Poseidon 参数",level:3},{label:"1.2 Poseidon 详细计算流程",level:3},{label:"1.3Poseidon 算法特点",level:3},{label:"基于 SpinalHDL 和 Cocotb 的硬件设计与验证",level:2},{label:"2.1 SpinalHDL 和 Cocotb 概述",level:3},{label:"2.2 SpinalHDL 在硬件设计中的优势",level:3},{label:"2.3Cocotb 在验证中的优势",level:3},{label:"总体方案设计",level:2},{label:"3.1 开发平台",level:3},{label:"3.2 加速系统设计",level:3},{label:"加速器 IP 设计",level:2},{label:"4.1 模加电路的设计",level:3},{label:"4.2 模乘电路的设计",level:3},{label:"4.3 加速器架构设计",level:3},{label:"性能测试",level:2},{label:"5.1 Vivado Implementation 报告",level:3},{label:"总结",level:2}],C=`

    本文主要介绍了 DatenLord 团队在今年的 Xilinx 全球自适应计算挑战赛上获得 Big Data Analytics 赛道一等奖的作品——TRIDENT: Poseidon 哈希算法的硬件实现与加速。该项目基于 Xilinx Varium C1100 FPGA 加速卡,为 Filecoin 区块链应用中的 Poseidon 哈希算法提供了一套完整的硬件加速方案。在硬件方面,TRIDENT 基于 SpinalHDL 设计了 Poseidon 加速器 IP 并基于 Vivado 中 Block Design 工具搭建完整的 FPGA 硬件系统。在软件方面,我们为 Filecoin 软件实现 Lotus 提供了访问 FPGA 硬件加速器的接口。最终,TRIDENT 能够为 Filecoin 应用提供两倍于 AMD Ryzen 5900X 处理器的 Poseidon 计算加速效果。下文将主要从 Poseidon 哈希算法概述、基于 SpinalHDL 和 Cocotb 的硬件设计、总体方案设计、加速器 IP 设计和性能测试等方面对整个 TRIDENT 项目进行详细的介绍。

    引言

    Poseidon 是一种全新的面向零知识证明(ZKP: Zero-Knowledge Proof)密码学协议设计的哈希算法。相比同类算法,包括经典的 SHA-256、SHA-3 以及 Pedersen 哈希函数,在零知识证明的应用场景下,Poseidon 能够显著地降低证明生成和验证的计算复杂度,极大地提升零知识证明系统整体的运行效率。基于上述优点,Poseidon 目前已被广泛应用在了各种区块链项目当中,包括去中心化存储系统 Filecoin、加密货币 Mina Protocol 和 Dusk Network 等,主要用于加速其中的零知识证明系统。

    0.1 Poseidon 与零知识证明

    @@ -210,9 +210,9 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

    在上述单元运算电路的基础上,实现高性能算法加速器的另一个关键在于设计一个高效的电路架构,即如何组织好每一个运算器,最大化每个单元的利用率

    由本文第二部分的介绍可知,TRIDENT 所加速的 Filecoin Poseidon 哈希实例的输入为个有限域元素,每个元素的位宽为 255 比特。具体的计算流程由

    RF 次 Full Round 循环和 RP 次 Partial Round 循环组成。两种循环的计算流程基本相似,都依次包括 AddRoundConstant、SBox 和 MDSMixing 三个阶段,在这三个阶段分别完成常数模加、五次方模幂和向量—矩阵乘法,两者唯一的区别在于 Partial Round 在 Sbox 阶段只需要完成中间状态第一个元素的计算。Full Round 和 Partial Round 每次循环/迭代的计算流程如下图(a)和(b)所示。如果将 Poseidon 哈希函数的所有循环都依次展开,可以将其看成是一条单向的数据流,在该数据流上不断地进行模加、模幂和矩阵运算。

    -

    图片

    -

    基于上述算法流程的定义,本次课题中实现的 Poseidon 加速器的具体硬件架构如下图所示。在 Poseidon 单次迭代的算法流程的基础上, 加速器的实现针对具体的 FPGA 架构特点和硬件资源限制做了如下几点优化:

    图片

    +

    基于上述算法流程的定义,本次课题中实现的 Poseidon 加速器的具体硬件架构如下图所示。在 Poseidon 单次迭代的算法流程的基础上, 加速器的实现针对具体的 FPGA 架构特点和硬件资源限制做了如下几点优化:

    +

    图片

    @@ -256,13 +256,13 @@ const i="/zh-cn/assets/image1-9e1613a7.png",o="/zh-cn/assets/image2-7b7b20fc.png

    各项 FPGA 资源中 DSP Slices(70.01%)和 LUT(61.15%)的消耗最多, 主要用于 255-Bit Montgomery 模乘电路的实现上。这两项资源的不足也限制了在加速器中配置更多模乘器来提升计算并行度和整体的加速性能。

    在时序上,实现(Implementation)后 Poseidon 加速器刚好能够满足 100MHz 工作频率的要求。关键路径上,建立(set up)时间的余量为 0.069ns,保持(hold)时间的余量为 0.01ns。

    除了资源和时序外,FPGA 实现后的功耗信息如下图所示。由下图可见,在运行我们设计的加速器硬件时,FPGA 芯片的整体功耗在 24.7W 左右。而我们在性能测试中使用的 RTX 3070 GPU 加速卡的运行功耗在 120W 左右。

    -

    图片

    +

    图片

    ###  5.2 计算性能测试

    TRIDENT 项目中设计了两种方式测试 Poseidon 加速器的计算性能:

    1. C 语言程序测试结果:在 Xilinx 提供的 XDMA 驱动的基础上使用 C 语言编写简单的性能测试程序。该测试程序向 FPGA 加速器写入一定数量的输入数据,并记录加速器完成所有数据哈希运算所需要的时间。基于该测试程序,我们分别测试了 Poseidon 加速器在三种长度输入数据下的性能表现。当输入数据的大小为 arity2, 即中间状态向量元素个数 时,加速器在 0.877 秒内完成了 850000 次的哈希运算,数据吞吐率可达到 29.1651MB/s, 即每秒大约能够完成 1M 次哈希运算
    -

    图片

    +

    图片

    1. Lotus-Bench 测试结果:Lotus 中提供了计算机硬件在 Filecoin 计算负载下性能表现的基准测试程序 Lotus-Bench;与自己实现的 C 语言测试程序相比,Lotus-Bench 的测试更加接近实际的工作负载,能够得到更加准确的测试结果。在 Lotus-Bench 的基础上,我们分别测试了 CPU, GPU 和 FPGA 在 preCommit 阶段(该阶段主要完成 Poseidon 哈希函数的计算)处理 512MB 数据所需要的时间。FPGA 在 Lotus-Bench 测试下的算力可达到 15.65MB/s,大约是 AMD Ryzen 5900X CPU 实现的 2 倍,但和 RTX 3070 GPU 的加速性能相比仍有很大的提升空间.
    diff --git a/zh-cn/assets/index-067c93db.js b/zh-cn/assets/index-28199dec.js similarity index 94% rename from zh-cn/assets/index-067c93db.js rename to zh-cn/assets/index-28199dec.js index 1445393..f78ee0d 100644 --- a/zh-cn/assets/index-067c93db.js +++ b/zh-cn/assets/index-28199dec.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-6865ae02.png",i=[l],t={label:"Xline v0.6.1: 一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"新疆",author:["准备开社区会议的"],tags:["Xline"],date:"2024-01-18",title:"Xline v0.6.1: a distributed KV store for metadata management"},e=[{label:"Xline是什么?我们为什么要做Xline?",level:2},{label:"V0.6.1版本有什么新功能?",level:2},{label:"社区会议",level:2}],n=`

    封面

    +const l="/zh-cn/assets/cover-6865ae02.png",i=[l],e={label:"Xline v0.6.1: 一个用于元数据管理的分布式KV存储",description:"Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。",cover:"./cover.png",location:"新疆",author:["准备开社区会议的"],tags:["Xline"],date:"2024-01-18",title:"Xline v0.6.1: a distributed KV store for metadata management"},t=[{label:"Xline是什么?我们为什么要做Xline?",level:2},{label:"V0.6.1版本有什么新功能?",level:2},{label:"社区会议",level:2}],n=`

    封面

    Xline是什么?我们为什么要做Xline?

    Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。 现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低,因此不会对性能产生大的影响。

    但是,当跨数据中心部署时,节点之间的延迟可能是几十或几百毫秒,此时 Raft 协议将成为性能瓶颈。Curp 协议就是为了解决这个问题而设计的。它可以在命令不冲突的情况下减少一个RTT,从而提高性能。因此,Xline旨在实现高性能的数据访问和跨数据中心场景下的强一致性。

    @@ -36,4 +36,4 @@ const l="/zh-cn/assets/cover-6865ae02.png",i=[l],t={label:"Xline v0.6.1: 一 会议号: 874 4309 5241 密码: 124294 会议链接: -https://zoom.us/j/87443095241?pwd=r3uJhJ9cb0caovHRsi1ay2pFuhBA1Q.1

    `;export{i as assetURLs,n as default,t as metadata,e as toc}; +https://zoom.us/j/87443095241?pwd=r3uJhJ9cb0caovHRsi1ay2pFuhBA1Q.1

    `;export{i as assetURLs,n as default,e as metadata,t as toc}; diff --git a/zh-cn/assets/index-15895cd6.js b/zh-cn/assets/index-28613687.js similarity index 93% rename from zh-cn/assets/index-15895cd6.js rename to zh-cn/assets/index-28613687.js index 0cdacf3..e1be927 100644 --- a/zh-cn/assets/index-15895cd6.js +++ b/zh-cn/assets/index-28613687.js @@ -1,4 +1,4 @@ -const o="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",t="/zh-cn/assets/image1-0a18e154.png",s=[o,n,t],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},r=[{label:"线上研讨会",level:2}],p=`

    新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

    +const t="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg",s="/zh-cn/assets/image1-0a18e154.png",o=[t,n,s],a={label:"SpinalHDL应用前景探索线上研讨会",description:"新一代硬件描述语言SpinalHDL的发明人Charles Papon说,SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么SpinalHDL有哪些最新的进展和落地实践呢?",cover:"./cover.png",location:"中国香港",date:"2022-12-08",title:"SpinalHDL Application Prospect Exploration Online Seminar"},r=[{label:"线上研讨会",level:2}],p=`

    新一代硬件描述语言 SpinalHDL 的发明人 Charles Papon 说,SpinalHDL 始于 2014 年,最初是作为 VHDL/Verilog 的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注,那么 SpinalHDL 有哪些最新的进展和落地实践呢?

    线上研讨会

    达坦科技(DatenLord) 致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。达坦科技采用硬件加速提升存储性能,目前采用 FPGA、ASIC 实现存储相关场景的性能加速。SpinalHDL 是达坦科技在产品中使用的硬件描述语言之一,达坦科技也一直热心于推广 SpinalHDL 在业界的落地应用。

    为了让对开源硬件感兴趣的朋友进一步了解 SpinalHDL,在北京时间 2022 年 12 月 16 日下午 17:00-21:00,达坦科技联合 SpinalHDL 社区举办一场题为《SpinalHDL 应用前景探索》的线上研讨会(Webinar),本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程 (Flow)。

    @@ -11,4 +11,4 @@ const o="/zh-cn/assets/cover-9c53ea5f.png",n="/zh-cn/assets/image1-52cf1c3c.jpg" 会议号:830 6630 7799
    密码:1216

    对开源硬件感兴趣的朋友,可以添加小助手微信,加入达坦科技硬件群

    -

    图片

    `;export{s as assetURLs,p as default,a as metadata,r as toc}; +

    图片

    `;export{o as assetURLs,p as default,a as metadata,r as toc}; diff --git a/zh-cn/assets/index-ddfbefca.js b/zh-cn/assets/index-29c0b7ce.js similarity index 99% rename from zh-cn/assets/index-ddfbefca.js rename to zh-cn/assets/index-29c0b7ce.js index c1f1943..1b821d3 100644 --- a/zh-cn/assets/index-ddfbefca.js +++ b/zh-cn/assets/index-29c0b7ce.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},i=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],n=`

    图片

    +const e="/zh-cn/assets/cover-1329fc54.png",a="/zh-cn/assets/image1-b7df4899.png",s="/zh-cn/assets/image2-a77c94e1.jpg",t=[e,a,s],r={label:"计算机体系结构 | MIT Training Q&A及小贴士",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175和6.375的课程和Lab学习都有一定的难度,要求采用Bluespec语言实现RISC-V处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab环节还涉及软硬件联合开发,要求基于所实现的RISC-V处理器运行真实的RISC-V程序,并给出性能评估。",cover:"./cover.png",location:"中国香港",author:["达坦科技"],tags:["硬件加速"],date:"2022-06-11",title:"Computer Architecture l MIT Training Q&A and Tips"},i=[{label:"MIT Training Q & A",level:2},{label:"MIT Training 小贴士",level:2},{label:"Related Resources",level:2}],c=`

    图片

    在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。

    继 MIT6.175 和 MIT6.375 学习笔记之后,我们又整理了到目前为止,硬件设计学习社区里大家碰到的一些共同问题,希望我们的回复以及学习贴士对于想啃下这两门高难度课程,并想从事数字芯片设计的工程师或同学有所帮助。

    MIT Training Q & A

    @@ -76,4 +76,4 @@ A:我目前是用 docker 做的实验,6175 的 lab1-6 和 6375 的 lab1-4

    计算机体系结构| MIT6.175 和 MIT6.375 学习笔记

    达坦科技硬件设计学习社区持续开放,若想询问加入细节,请添加下方小助手微信号或邮件info@datenlord.com

    -

    图片

    `;export{t as assetURLs,n as default,r as metadata,i as toc}; +

    图片

    `;export{t as assetURLs,c as default,r as metadata,i as toc}; diff --git a/zh-cn/assets/index-69f9dfbf.js b/zh-cn/assets/index-2a54f9b1.js similarity index 99% rename from zh-cn/assets/index-69f9dfbf.js rename to zh-cn/assets/index-2a54f9b1.js index c42f625..0130661 100644 --- a/zh-cn/assets/index-69f9dfbf.js +++ b/zh-cn/assets/index-2a54f9b1.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",i="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",d="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",m="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",u="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,i,d,o,m,u,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],A=`

    +const e="/zh-cn/assets/07123c0a1614c5c0256c2c44fccab7ad-82d2cfc4.jpeg",a="/zh-cn/assets/dbb615367665aefe1e8dc131faf7135d-ab0138b7.png",t="/zh-cn/assets/7e55ab5e49360b59ae14ad51bd9f8266-a3540f96.png",p="/zh-cn/assets/50e844cef87960be41630d431f7dba76-74a09282.png",s="/zh-cn/assets/da011de83bcdac4720de4265f06487fa-a09f8943.png",r="/zh-cn/assets/ab91fcebd0198e3ba3e68a1f0ede0dcb-2954efad.png",n="/zh-cn/assets/d6753cc7dafac128a184192d73a671d0-cbc3aa8e.png",l="/zh-cn/assets/8140b483b2b9992795a40af43149d92e-6324a4f1.png",c="/zh-cn/assets/261faba035c5925dd1bf0052673a2819-65bae75e.png",d="/zh-cn/assets/7ccbe7094043e218ad241cc3c2e3c871-e3e8431a.png",i="/zh-cn/assets/7a18e9fc6512a89b6e74a92a92580823-5ee6182a.png",o="/zh-cn/assets/3df9c5c4ff35c6cde20f54a80ed5bb0d-6b5bfe86.png",m="/zh-cn/assets/03beb98ee570de53f1aa4b866838924b-60f7cb4e.jpeg",u="/zh-cn/assets/13065eb252d78f86c7d84a7537e730d7-9522963a.png",h="/zh-cn/assets/0f55765329135bae263d77175baf52b7-2df179ec.png",I=[e,a,t,p,s,r,n,l,c,d,i,o,m,u,h],P={label:"blue-ethernet 高性能FPGA网络数据包处理项目详解",description:"blue-ethernet项目使用Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在FPGA上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析Ethernet/IP/UDP网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的APR报文处理单元,用于自动解析设备的物理MAC地址。",cover:"./07123c0a1614c5c0256c2c44fccab7ad.jpeg",location:"中国香港",author:["翁万正"],tags:["硬件加速"],date:"2023-11-02",title:"blue ethernet High Performance FPGA Network Packet Processing Project Details"},D=[{label:"简介",level:2},{label:"文件目录概览",level:2},{label:"组件",level:2},{label:"数据流处理模块",level:3},{label:"UdpIpLayer",level:3},{label:"UdpIpLayerForRdma",level:3},{label:"MacLayer",level:2},{label:"ARP Processor",level:3},{label:"UdpIpEthRx",level:3},{label:"UdpIpEthTx",level:3},{label:"UdpIpArpEthRxTx",level:3},{label:"PriorityFlowContro",level:3},{label:"性能和面积",level:2},{label:"入门教程",level:2},{label:"仿真测试",level:3},{label:"使用方法",level:3},{label:"相关链接",level:2}],b=`

    简介

    blue-ethernet 项目使用 Bluespec SystemVerilog(BSV)硬件描述语言实现了一系列在 FPGA 上加速网络数据包处理的硬件模块。具体来说,其提供了用于生成和解析 Ethernet/IP/UDP 网络报文的硬件模块。此外,还提供了一个具有非阻塞高速缓存的 APR 报文处理单元,用于自动解析设备的物理 MAC 地址。

    除了构建标准的 UDP/IP/Ethernet 协议栈,blue-ethernet 还增加了对 RoCE(RDMA over Converged Ethernet)协议的支持,具体包括:

    @@ -201,7 +201,7 @@ module mkMacMetaDataAndUdpIpStream#(

    mkArpProcessor

    mkArpProcessor 集成了 MAC 地址信息缓存单元 mkArpCache 以及对 ARP 报文的解析和生成模块。在处理 ARP 请求和响应时,mkArpProcessor 既可作为请求端,在 Cache Miss 时发出 ARP 请求报文并接收从目标设备返回的 ARP 响应报文。同时也可作为被请求端,接收其他设备发出的 ARP 请求报文并将自己的 MAC 地址信息通过 ARP 响应返回给请求端。

    -

    +

    interface ArpProcessor;
         interface PipeOut#(DataStream) arpStreamOut;
         interface PipeOut#(MacMetaData) macMetaDataOut;
    @@ -231,7 +231,7 @@ endinterface
     
     module mkGenericUdpIpEthRx#(Bool isSupportRdma)(UdpIpEthRx)
     
    -

    +

    @@ -413,4 +413,4 @@ make verilog TARGET=UdpIpEthTx SUPPORT_RDMA=TRUE
  • blue-wrapper: https://github.com/wengwz/blue-wrapper
  • 关于项目更多的详细信息可关注链接:

    -

    https://github.com/wengwz/blue-ethernet

    `;export{I as assetURLs,A as default,P as metadata,D as toc}; +

    https://github.com/wengwz/blue-ethernet

    `;export{I as assetURLs,b as default,P as metadata,D as toc}; diff --git a/zh-cn/assets/index-f819e53e.js b/zh-cn/assets/index-303605cc.js similarity index 98% rename from zh-cn/assets/index-f819e53e.js rename to zh-cn/assets/index-303605cc.js index 4677a7b..683d5c1 100644 --- a/zh-cn/assets/index-f819e53e.js +++ b/zh-cn/assets/index-303605cc.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",p="/zh-cn/assets/image4-5841c9d6.png",a="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",t="/zh-cn/assets/image7-97920b5a.png",i="/zh-cn/assets/image8-ecf5c6f3.png",r="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,p,a,d,t,i,r,n,l],h={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},g=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

    封面

    +const e="/zh-cn/assets/cover-c17c52cc.png",s="/zh-cn/assets/image1-0dff4570.png",c="/zh-cn/assets/image2-e09cfdc8.png",o="/zh-cn/assets/image3-2b589463.png",p="/zh-cn/assets/image4-5841c9d6.png",a="/zh-cn/assets/image5-92344f1d.png",d="/zh-cn/assets/image6-b429f851.png",r="/zh-cn/assets/image7-97920b5a.png",i="/zh-cn/assets/image8-ecf5c6f3.png",t="/zh-cn/assets/image9-f47bad66.png",n="/zh-cn/assets/image10-b50adc27.png",l="/zh-cn/assets/image11-99ec2a51.png",m=[e,s,c,o,p,a,d,r,i,t,n,l],g={label:"从数学角度思考程序与验证正确性",description:"本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。",cover:"./cover.png",location:"中国香港",author:["田野"],tags:["Xline"],date:"2023-03-02",title:"Thinking about programs mathematically and verifying correctness"},h=[{label:"我们该如何写出正确的程序?",level:2},{label:"程序中会有什么样错误?",level:3},{label:"经验",level:3},{label:"形式化方法",level:3},{label:"TLA+",level:2},{label:"简单的例子",level:3},{label:"Two-Phase Commit",level:2},{label:"总结",level:2},{label:"我们的项目:Xline",level:2}],A=`

    封面

    本文旨在为没有接触过形式化方法的读者提供一种新的视角看待计算机系统与算法,而非形式化方法或 TLA+ 教程。因此本文的重点是如何从数学角度思考程序,不会使用大篇幅讲解 TLA+ 的语法。

    我们该如何写出正确的程序?

    程序设计的目标永远是写出正确的程序。随着时间的推移,我们的程序越来越复杂,其中可能存在的错误也越来越多。想要写出正确的程序,首先应该了解程序中可能出现的错误有哪些。

    @@ -105,7 +105,7 @@ Next 用于定义状态转换关系。

  • 变量 msgs 作为消息池,用于记录所有正在传输的消息,初始值是一个空集。
  • 下面我们来定义系统做可能发生的动作。

    -

    图片

    +

    图片

    `;export{e as assetURLs,n as default,i as metadata,t as toc}; diff --git a/zh-cn/assets/index-e7ccea1d.js b/zh-cn/assets/index-78a34e98.js similarity index 89% rename from zh-cn/assets/index-e7ccea1d.js rename to zh-cn/assets/index-78a34e98.js index 0c3885e..aa88b97 100644 --- a/zh-cn/assets/index-e7ccea1d.js +++ b/zh-cn/assets/index-78a34e98.js @@ -1,4 +1,4 @@ -const t="/zh-cn/assets/cover-3674aa81.jpg",e=[t],n={label:"Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的",cover:"./cover.jpg",location:"香港",date:"2022-10-20",title:"Rust Chatterbox: Xline Cross Data Center Consistency Management"},s=[{label:"内容介绍",level:2}],a=`

    封面

    +const t="/zh-cn/assets/cover-3674aa81.jpg",e=[t],s={label:"Rust唠嗑室:Xline跨数据中心一致性管理",description:"2022年10月15日,达坦科技和Rust语言中文社区合作,在Rust唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目Xline,这一跨云的metadata(元数据)KV存储的产品是如何实现高性能跨数据中心的数据一致性管理的",cover:"./cover.jpg",location:"香港",date:"2022-10-20",title:"Rust Chatterbox: Xline Cross Data Center Consistency Management"},a=[{label:"内容介绍",level:2}],n=`

    封面

    2022 年 10 月 15 日,达坦科技和 Rust 语言中文社区合作,在 Rust 唠嗑室活动中,由达坦科技(DatenLord)联合创始人施继成做了关于开源分布式存储技术的分享,着重介绍了达坦科技新的开源项目 Xline,这一跨云的 metadata(元数据)KV 存储的产品是如何实现高性能跨数据中心的数据一致性管理的。

    内容介绍

    -

    施继成首先介绍了做Xline这个产品的动机。最初2021年UCBerkeley 提出了Sky Computing(“天空计算”)的概念。与我们都熟知的cloud computing(“云计算”)不同的是,sky computing,如其表面意义所讲,是天空中有很多的云,是解决跨云的问题。如何打破不同云之间的隔阂,或者打通和最大化利用跨云数据是当前面临的一个难题,也是我们的目标所在。如今谈论云计算时,我们不需要考虑云资源的部署,可扩展性等问题,因为云厂商已经都帮忙做了。但是,一旦跨云,则无论算力的迁移,或数据的迁移,都是摆在我们眼前要攻克的难题。达坦科技在做的就是解决“如何做跨云数据交互”的问题,我们致力于将分布式系统从数据中心范围扩散至全球范围,这样即使单个数据中心宕机,却仍不影响用户使用数据。

    `;export{e as assetURLs,a as default,n as metadata,s as toc}; +

    施继成首先介绍了做Xline这个产品的动机。最初2021年UCBerkeley 提出了Sky Computing(“天空计算”)的概念。与我们都熟知的cloud computing(“云计算”)不同的是,sky computing,如其表面意义所讲,是天空中有很多的云,是解决跨云的问题。如何打破不同云之间的隔阂,或者打通和最大化利用跨云数据是当前面临的一个难题,也是我们的目标所在。如今谈论云计算时,我们不需要考虑云资源的部署,可扩展性等问题,因为云厂商已经都帮忙做了。但是,一旦跨云,则无论算力的迁移,或数据的迁移,都是摆在我们眼前要攻克的难题。达坦科技在做的就是解决“如何做跨云数据交互”的问题,我们致力于将分布式系统从数据中心范围扩散至全球范围,这样即使单个数据中心宕机,却仍不影响用户使用数据。

    `;export{e as assetURLs,n as default,s as metadata,a as toc}; diff --git a/zh-cn/assets/index-836388b4.js b/zh-cn/assets/index-836388b4.js new file mode 100644 index 0000000..9db138a --- /dev/null +++ b/zh-cn/assets/index-836388b4.js @@ -0,0 +1,188 @@ +const s="/zh-cn/assets/image1-66970db4.png",e="/zh-cn/assets/image2-e552170a.png",n="/zh-cn/assets/image3-2010f131.webp",a="/zh-cn/assets/image4-6a30f302.png",l=[s,e,n,a],p={label:"Membership Change 源码解读",description:"在分布式系统的应用场景中,难免会出现增删节点或者替换节点的需求,最简单的解决方式就是临时关闭集群,然后直接修改配置文件添加新的节点,完成后再将集群重新启动,这样的方式的确能达成我们的目的,但是其存在的问题也很明显,变更期间集群是不可用的状态,这对需要高可用性的系统来说是无法接受的,并且手动操作的过程还可能引发其他的错误,这也会降低系统的稳定性。因此,如何才能高效且安全的完成集群成员变更,也就成为了分布式系统开发过程中的关键问题。对于 Xline 来说,不仅要处理常规的变更流程,还要将其与 Curp 协议相结合,保证引入集群成员变更不会导致前端协议出错",location:"中国香港",author:["关宇"],date:"2024-03-07",title:"Membership Change Source Code Interpretation"},t=[{label:"背景",level:2},{label:"动态成员变更的问题以及解决方案",level:2},{label:"Joint Consensus",level:3},{label:"单步节点变更",level:3},{label:"Curp 协议的融合",level:2},{label:"源码解读",level:2},{label:"Leader 发起成员变更",level:3},{label:"Follower 处理成员变更",level:3},{label:"成员变更日志的 commit",level:3},{label:"New Node 加入集群",level:3},{label:"Node remove",level:3},{label:"总结",level:2}],o=`

    背景

    +

    在分布式系统的应用场景中,难免会出现增删节点或者替换节点的需求,最简单的解决方式就是临时关闭集群,然后直接修改配置文件添加新的节点,完成后再将集群重新启动,这样的方式的确能达成我们的目的,但是其存在的问题也很明显,变更期间集群是不可用的状态,这对需要高可用性的系统来说是无法接受的,并且手动操作的过程还可能引发其他的错误,这也会降低系统的稳定性。因此,如何才能高效且安全的完成集群成员变更,也就成为了分布式系统开发过程中的关键问题。对于 Xline 来说,不仅要处理常规的变更流程,还要将其与 Curp 协议相结合,保证引入集群成员变更不会导致前端协议出错。

    +

    动态成员变更的问题以及解决方案

    +

    由于 Xline 使用 Raft 作为后端协议,因此想要为 Xline 添加动态变更成员的能力,就需要解决 Raft 协议自身会遇到的问题。Raft 协议能够正常工作的一个重要前提是,同一时间只能有一个 Leader,如果不加任何限制,直接向集群添加节点,那么就有可能破坏这个前提,具体情况如下图所示:

    +

    图片

    +

    由于网络延迟等原因,无法保证各节点从 $$C_{old}$$ 切换到 $$C_{new}$$ 的时间相同,就有可能出现图中的情况,假设此时 Server 1 和 Server 5 同时开始选举,Server 1 获得了 Server 2 的投票,满足 $$C_{old}$$ 中的 quorum 需求,成为 Leader,Server 5 获得了 Server 3 和 Server 4 的投票,满足 $$C_{new}$$ 中的 quorum 需求,Server 5 也成为 Leader,此时集群就会同时有两个 Leader,产生一致性问题。

    +

    为了解决这个问题,Raft 的作者提供了两种解决思路。

    +
      +
    1. Joint Consensus
    2. +
    3. 单步成员变更
    4. +
    +

    Joint Consensus

    +

    Joint Consensus 本质上就是在成员变更过程中添加一个中间状态。

    +

    图片

    +

    Leader 收到成员变更请求时,会创建一条一个 $$C_{old,new}$$ 配置并通过 AppendEntries 同步到 Follower,收到 $$C_{old,new}$$ 的节点会同时使用两个配置做决策,也就是选举等操作需要 $$C_{old}$$ 和 $$C_{new}$$ 都同意才视为成功 ,等到 $$C_{old,new}$$ commit 之后,Leader 会再创建 $$C_{new}$$ 配置并同步给 Follower。

    +

    在这种方案下,集群成员变更的中间状态有以下几种可能:

    +
      +
    1. $$C_{old,new}$$ 创建之后提交之前,这个阶段集群中可能同时存在 $$C_{old}$$,$$C_{old,new}$$ 两种配置,在此阶段内任意节点想要成为 Leader 都需要 $$C_{old}$$ 配置同意,因此不会出现两个 Leader。
    2. +
    3. $$C_{old,new}$$ 提交之后,$$C_{old,new}$$ 创建之前,这个阶段集群中可能同时存在 $$C_{old}$$, $$C_{old,new}$$ 两种配置,但只有使用 $$C_{old,new}$$ 的节点才能够成为 Leader,因为此阶段 $$C_{old}$$ 中的多数节点已经切换到了 $$C_{old,new}$$ 配置,剩余还未切换的节点不足以选出新 Leader。
    4. +
    5. $$C_{new}$$ 创建之后提交之前,这个阶段集群中可能同时存在 $$C_{old}$$ $$C_{old,new}$$ $$C_{new}$$ 三种配置,其中 图片 配置无法选出 Leader,原因如上,$$C_{old,new}$$ 和 $$C_{new}$$ 中要选出 Leader,就需要 $$C_{new}$$ 同意,此情况也不会出现两个 Leader。
    6. +
    7. $$C_{new}$$ commit 之后,由 $$C_{new}$$ 独立决策,不会出现两个 Leader。
    8. +
    +

    单步节点变更

    +

    除了 Joint Consensus 以外,还有一种方法可以安全的完成集群成员变更,那就是单步节点变更。该方法每次只会增加或减少一个节点,这种情况下,新旧配置的 majority 中必然有重叠节点,重叠的节点只能给一个节点投票,这样就保证了不会同时存在两个 Leader。复杂的变更行为就需要转换成多次单步节点变更来完成。

    +

    图片

    +

    这种方案没有中间状态,只需要一步操作就可以完成变更,逻辑上比 Joint Consensus 更加简洁,没有那么多复杂的中间状态,实现起来也会简单一点,当然它的功能也没有 Joint Consensus 强大

    +

    Xline 目前采用的方法就是单步成员变更,未来我们也会添加对 Joint Consensus 的支持。

    +

    Curp 协议的融合

    +

    Membership change 的主要流程,只通过后端的 Raft 就能够完成,但是这个过程可能会扰乱前端 Curp 协议的流程。正常处理时,Curp client 会向集群中所有节点广播 Propose 请求,并根据成功相应的数量是否大于当前集群成员数量的 superquorum 来判断本次 propose 是否在 curp 中 commit,实现 membership change 以前,所有成员都在创建 client 时确定,但是引入了 membership change 之后,就需要有一种机制能够保证 Client 在使用旧的配置时,也能够探测到服务端使用的新配置,并且使用新配置重试当前的请求,否则可能导致 Curp 协议无法正常工作。

    +

    图片

    +

    如图所示,假设 Client 向一个三节点集群广播 Propose,那么 Client 收到 3(3 节点的 superquorum) 个成功响应后就会认为这一次 Propose 已经在 Curp 中 commit,在此次 Propose 过程中,集群成员发生了变更,Server4 加入了集群,然而 4 节点的 superquorum 是 4,也就是说刚刚在 3 节点集群中被 curp commit 的请求,在成员变更之后就不再满足 Curp 的 commit 条件了,这可能会导致已经返回给 Client 的请求丢失。

    +

    为了解决这个问题,我们为外部 client 发送的请求引入了一个新的字段 cluster_version ,这个字段表示集群当前使用配置的版本,每次执行成员变更,都会增加这个值,这样 Server 端就能够通过这个字段来判断发送请求的 Client 是否在使用最新配置,并且直接拒绝使用旧配置的请求,Client 探测到 cluster_version 不一致后,就会主动拉取 Server 端的最新配置,并以最新配置发起新一轮的请求。在上述实例中,Propose 和成员变更同时发生时,Server1、2、3 中一定有节点已经在使用新配置了,那么该节点就会使用更大的 cluster_version 拒绝本次 Propose,Client 检测到更大的 cluster_version 后,会重新向集群拉取当前的成员配置,然后以新配置重试整个请求。

    +

    源码解读

    +

    Leader 发起成员变更

    +

    开始变更成员的第一步,就是向 Leader 发送 ProposeConfChangeRequest,这个请求包含了本次 propose 要变更的节点信息和一些其他的辅助字段。

    +

    Server 端收到该请求后,首先会检查请求携带的 cluster_version 是否和集群当前 cluster_version 匹配,不匹配的请求直接拒绝,然后才会进入 Server 端的处理逻辑:

    +
        /// Handle propose_conf_change request
    +    pub(super) fn handle_propose_conf_change(
    +        &self,
    +        propose_id: ProposeId,
    +        conf_changes: Vec<ConfChange>,
    +    ) -> Result<(), CurpError> {
    +        // ...
    +        self.check_new_config(&conf_changes)?;
    +        let entry = log_w.push(st_r.term, propose_id, conf_changes.clone())?;
    +        debug!("{} gets new log[{}]", self.id(), entry.index);
    +        let (addrs, name, is_learner) = self.apply_conf_change(conf_changes);
    +        self.ctx
    +            .last_conf_change_idx
    +            .store(entry.index, Ordering::Release);
    +        let _ig = log_w.fallback_contexts.insert(
    +            entry.index,
    +            FallbackContext::new(Arc::clone(&entry), addrs, name, is_learner),
    +        );
    +        // ...
    +    }
    +
    +

    Leader 节点在处理时,会通过 check_new_config 方法检查本次 conf change 的有效性,提前拒绝一些无法处理的变更,比如插入一个已经存在的节点或者移除一个不存在的节点。检查通过之后,就会进入和常规请求相同的流程,通过共识将其同步到所有 Follower 上,除了这部分相同流程以外, conf change 还需要做一些特殊处理,在其插入 log 之后,就会立刻应用新配置,并且记录用于回退配置的上下文。这里和 Raft 论文中提到的方式相同,在节点拥有这条日志之后,不需要等待它 commit,就让它立刻生效,在 Raft 中没有 commit 的日志是有被覆盖的可能的,因此才需要记录上下文,如果日志被覆盖,就能够通过这个上下文来回退本次修改。

    +

    Follower 处理成员变更

    +

    对于 Follower 节点,成员变革的主要逻辑发生在 handle_append_entries 中,这个方法被用来处理 Leader 发送的日志,其中就包括 conf change

    +
        pub(super) fn handle_append_entries(
    +        &self,
    +        term: u64,
    +        leader_id: ServerId,
    +        prev_log_index: LogIndex,
    +        prev_log_term: u64,
    +        entries: Vec<LogEntry<C>>,
    +        leader_commit: LogIndex,
    +    ) -> Result<u64, (u64, LogIndex)> {
    +        // ...
    +        // append log entries
    +        let mut log_w = self.log.write();
    +        let (cc_entries, fallback_indexes) = log_w
    +            .try_append_entries(entries, prev_log_index, prev_log_term)
    +            .map_err(|_ig| (term, log_w.commit_index + 1))?;
    +        // fallback overwritten conf change entries
    +        for idx in fallback_indexes.iter().sorted().rev() {
    +            let info = log_w.fallback_contexts.remove(idx).unwrap_or_else(|| {
    +                unreachable!("fall_back_infos should contain the entry need to fallback")
    +            });
    +            let EntryData::ConfChange(ref conf_change) = info.origin_entry.entry_data else {
    +                unreachable!("the entry in the fallback_info should be conf change entry");
    +            };
    +            let changes = conf_change.clone();
    +            self.fallback_conf_change(changes, info.addrs, info.name, info.is_learner);
    +        }
    +        // apply conf change entries
    +        for e in cc_entries {
    +            let EntryData::ConfChange(ref cc) = e.entry_data else {
    +                unreachable!("cc_entry should be conf change entry");
    +            };
    +            let (addrs, name, is_learner) = self.apply_conf_change(cc.clone());
    +            let _ig = log_w.fallback_contexts.insert(
    +                e.index,
    +                FallbackContext::new(Arc::clone(&e), addrs, name, is_learner),
    +            );
    +        }
    +        // ...
    +    }
    +
    +

    对于常规日志的处理此处直接省略,不再赘述。Follower 在尝试追加 Leader 发来的日志时,会判断当前节点上有哪些新的 conf change 日志,以及哪些没有被 commit 的 conf change 会被覆盖,然后通过预先记录的上下文,将被覆盖的变更逆序回退,并且应用新的变更,在应用新变更时,也需要在此处记录新变更的上下文。

    +

    成员变更日志的 commit

    +
    async fn worker_as<C: Command, CE: CommandExecutor<C>, RC: RoleChange>(
    +    entry: Arc<LogEntry<C>>,
    +    prepare: Option<C::PR>,
    +    ce: &CE,
    +    curp: &RawCurp<C, RC>,
    +) -> bool {
    +    // ...
    +    let success = match entry.entry_data {
    +        EntryData::ConfChange(ref conf_change) => {
    +            // ...
    +            let shutdown_self =
    +                change.change_type() == ConfChangeType::Remove && change.node_id == id;
    +            // ...
    +            if shutdown_self {
    +                curp.shutdown_trigger().self_shutdown();
    +            }
    +            true
    +        }
    +        _ => // ...
    +    };
    +    ce.trigger(entry.inflight_id(), entry.index);
    +    success
    +}
    +
    +

    在 Conf change 被 commit 之后的 after sync 阶段,除了一些常规操作以外,还需要判断被 commit 的 conf change 是否将当前节点 remove,如果这个节点被 remove 的话,就需要在此处开始 shutdown 当前节点,一般只有 leader 节点会执行到此处并将 remove 自身的日志 commit,在其 shutdown 自身后,剩余节点会选出一个拥有最新日志的 leader。

    +

    New Node 加入集群

    +

    为了区分创建新集群运行的节点,和新启动的需要加入现有集群的节点,需要在启动时传入一个新的参数 InitialClusterState,这是一个枚举类型,只有两个成员, InitialClusterState::New 表示本次启动的节点是新启动集群的成员之一;InitialClusterState::Existing 表示本次启动的节点是要加入已有集群的新节点。

    +
    let cluster_info = match *cluster_config.initial_cluster_state() {
    +    InitialClusterState::New => init_cluster_info,
    +    InitialClusterState::Existing => get_cluster_info_from_remote(
    +        &init_cluster_info,
    +        server_addr_str,
    +        &name,
    +        Duration::from_secs(3),
    +    )
    +    .await
    +    .ok_or_else(|| anyhow!("Failed to get cluster info from remote"))?,
    +    _ => unreachable!("xline only supports two initial cluster states: new, existing"),
    +};
    +
    +

    这两种方式的本质区别在于,新建集群是各节点初始的集群成员是相同的,可以直接通过这部分初始信息各自计算出一个全局统一的节点 ID,保证每个节点都有一个唯一 ID,而加入现有集群时,新节点不能自己计算节点的 ID,需要通过 get_cluster_info_from_remote 方法去拉取现有集群的信息,直接继承现有集群正在使用的 ID 和其他信息,以保证集群内 ID 和节点的对应关系,避免出现 ID 重复或一个节点有多个 ID 的情况。

    +

    为保证与 etcd 接口的兼容,新节点开始运行前时没有 name 的,etcdctl 中会根据 name 是否为空来判断相应节点是否已启动,在新节点启动并加入集群后,会向 Leader 发送一个 Publish Rpc,用来在集群内发布自己的 name。

    +

    Node remove

    +

    假设我们在 remove 一个节点之后,不将其关闭,那么它将会选举超时并向其余节点发送 Vote 请求,浪费其他节点的网络和 CPU 资源,想要解决这个问题,首先能想到的有两个办法:

    +
      +
    1. +

      在节点应用会 remove 自身的新配置后,立刻关闭自身节点。很明显,这种方案一定是不可行的,因为在应用新配置时,这一条日志还没有被 commit,还有被回退的可能,如果在此处关闭自身,那假如配置变更发生了回退,被 remove 的这个节点就已经被关闭无法直接回复了,这不是我们想看到的结果。

      +
    2. +
    3. +

      在节点 commit 会 remove 自身的日志后,立刻关闭自身节点。因为已经被 commit,所以这种方法时没有上述问题的,但是据此实现后就会发现,被 remove 的节点有时还是不能自动关闭。因为被 remove 的节点可能根本不会 commit 新配置,假设我们要 remove 一个 Follower 节点,Leader 讲这一条 remove 记录添加到自己的日志之后,立刻开始使用新日志,此时 Leader 已经不会向这个 Follower 发送任何请求了,Follower 自然也不可能 commit 这条日志并关闭自身。这个问题在 Leader 上是不存在的,Leader 将会临时管理不包含自己的集群,直到日志被 commit。

      +
    4. +
    +

    最直接的方法都不能使用,那被 remove 的节点应该如何关闭自身呢?假设我们不添加这里的关闭逻辑,会发生什么事?Leader 向集群同步 conf change 日志,新集群的所有成员都会正常处理并 commit 这条日志,被 remove 的节点会在自己不知情的请款下离开原集群,收不到 Leader 的心跳,这个节点就会超时并开始选举,这里也就是我们最终我们决定修改的位置。

    +
    pub(super) fn handle_pre_vote(
    +    &self,
    +    term: u64,
    +    candidate_id: ServerId,
    +    last_log_index: LogIndex,
    +    last_log_term: u64,
    +) -> Result<(u64, Vec<PoolEntry<C>>), Option<u64>> {
    +    // ...
    +    let contains_candidate = self.cluster().contains(candidate_id);
    +    let remove_candidate_is_not_committed =
    +        log_r
    +            .fallback_contexts
    +            .iter()
    +            .any(|(_, ctx)| match ctx.origin_entry.entry_data {
    +                EntryData::ConfChange(ref cc) => cc.iter().any(|c| {
    +                    matches!(c.change_type(), ConfChangeType::Remove)
    +                        && c.node_id == candidate_id
    +                }),
    +                _ => false,
    +            });
    +    // extra check to shutdown removed node
    +    if !contains_candidate && !remove_candidate_is_not_committed {
    +        return Err(None);
    +    }
    +    // ...
    +}
    +
    +

    我们在 ProVote 阶段加入了额外的检查逻辑,收到 pre-vote 的节点会检查 candidate 是否已经被 Remove,假设 candidate 不在当前节点的配置中,并且可能会进行的回退操作,也不会让这个节点重新加入集群,那就说明这是一个已经被 Remove 的 candidate,此时处理请求的节点将会给 Follower 回复一个带有 shutdown_candidate 字段的特殊 VoteResponse。Candidate 在收到该响应后,会判断 shutdown_candidate 是否为 true,为 true 则开始关闭自身,不为 true 则继续选举流程。

    +

    总结

    +

    本篇文章我们深入探讨了在分布式系统中如何进行集群成员变更,简单介绍了两种主要的解决方案:Joint Consensus 和单步成员变更,Joint Consensus 通过引入中间状态来保证变更期间不会出现两个 Leader,单步集群变更则是牺牲了一定的功能,通过逐个变更节点来简化实现逻辑。并且对 Xline 目前使用的单步成员变更方案进行了源码级的分析,展示了 Leader 和 Follower 都是如何处理变更的,以及引入集群变更之后,会有哪些新逻辑需要处理。

    +

    目前 Xline 对集群成员变更的处理仅使用了单步集群变更这一种方法,提供了基本的变更能力,未来我们还会尝试支持 Joint Consensus,增强 Xline 的功能。

    +

    关于 Xline 的 Membership change 就介绍到这里,如果对更多实现细节感兴趣,欢迎大家直接参考我们的开源仓库:https://github.com/xline-kv/Xline ,也可以在 Xline 的官网上了解更多信息:https://xline.cloud

    +
    `;export{l as assetURLs,o as default,p as metadata,t as toc}; diff --git a/zh-cn/assets/index-c29dde05.js b/zh-cn/assets/index-884e893f.js similarity index 98% rename from zh-cn/assets/index-c29dde05.js rename to zh-cn/assets/index-884e893f.js index b9e6aaf..9e68d26 100644 --- a/zh-cn/assets/index-c29dde05.js +++ b/zh-cn/assets/index-884e893f.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",D="/zh-cn/assets/image13-d816729e.png",H="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",V="/zh-cn/assets/image19-dfed79f8.png",C="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",y="/zh-cn/assets/image22-27167bbd.png",d="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",z="/zh-cn/assets/image26-a854b9f0.png",v="/zh-cn/assets/image27-5b3ff402.png",I="/zh-cn/assets/image28-f02ef5c0.png",R="/zh-cn/assets/image29-44cafcf0.png",A=[l,p,i,a,e,o,n,t,s,c,r,g,D,H,h,L,S,m,V,C,b,y,d,P,f,z,v,I,R],u={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},T=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],x=`

    封面

    +const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png",i="/zh-cn/assets/image2-1161bb88.png",a="/zh-cn/assets/image3-136f9458.png",e="/zh-cn/assets/image4-75f70bf1.png",o="/zh-cn/assets/image5-64f0abbf.png",n="/zh-cn/assets/image6-29b079bb.png",t="/zh-cn/assets/image7-f8d2626b.png",s="/zh-cn/assets/image8-d242f7b7.png",c="/zh-cn/assets/image9-5e691a52.png",r="/zh-cn/assets/image10-b3a0ad40.png",g="/zh-cn/assets/image11-98ffaf6b.png",H="/zh-cn/assets/image13-d816729e.png",D="/zh-cn/assets/image14-20340934.png",h="/zh-cn/assets/image15-512cff4d.png",L="/zh-cn/assets/image16-ee33a0ea.png",S="/zh-cn/assets/image17-e2c28396.png",m="/zh-cn/assets/image18-69fe4409.png",C="/zh-cn/assets/image19-dfed79f8.png",V="/zh-cn/assets/image20-a636b8b5.png",b="/zh-cn/assets/image21-487e6dd2.png",y="/zh-cn/assets/image22-27167bbd.png",d="/zh-cn/assets/image23-8660cc2c.png",P="/zh-cn/assets/image24-4d2461fd.png",f="/zh-cn/assets/image25-3af02a99.png",v="/zh-cn/assets/image26-a854b9f0.png",z="/zh-cn/assets/image27-5b3ff402.png",I="/zh-cn/assets/image28-f02ef5c0.png",A="/zh-cn/assets/image29-44cafcf0.png",T=[l,p,i,a,e,o,n,t,s,c,r,g,H,D,h,L,S,m,C,V,b,y,d,P,f,v,z,I,A],u={label:"使用SpinalHDL和Cocotb进行敏捷数字芯片设计和验证",description:"领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。",cover:"./cover.jpg",location:"新疆",author:["翁万正等"],date:"2024-01-25",title:"Agile Digital Chip Design and Verification with SpinalHDL and Cocotb"},R=[{label:"引言",level:2},{label:"1.1 背景",level:3},{label:"1.2 HDL的演变",level:3},{label:"SpinalHDL",level:2},{label:"2.1 SpinalHDL简介",level:3},{label:"2.2 与传统HDL相同的描述粒度",level:3},{label:"2.3 SpinalHDL相比传统HDL的优势",level:3},{label:"基于元语言构建数字逻辑电路",level:2},{label:"3.1 元语言的概念",level:3},{label:"3.2 硬件设计中的高级类型系统",level:3},{label:"3.3 SpinalHDL之外",level:3},{label:"3.4 HCL的编译流程",level:3},{label:"基于Cocotb的验证",level:2},{label:"4.1 Cocotb简介",level:3},{label:"4.2 基于Cocotb硬件验证的优势",level:3},{label:"4.3 基于Cocotb的验证示例",level:3},{label:"4.3.3 启动仿真",level:3},{label:"结论",level:2},{label:"参考文章",level:2}],x=`

    封面

    摘要:
    领域特定架构已成为计算机发展的一种趋势。在提供更高效算力的同时,它也给底层硬件的开发带来了更大的挑战。传统的芯片设计和验证技术已越来越无法应对这些新的要求和挑战。在芯片设计上,本文将介绍如何使用SpinalHDL,一种基于Scala的新型硬件描述语言(HDL),或者更准确地说是硬件构造语言,提高硬件设计的效率和质量。对于SpinalHDL,本文还介绍了如何利用Scala的类型系统高效地进行复杂硬件的设计。对于验证,本文将介绍基于Python的验证环境Cocotb,以及如何利用Python简洁高效的语言特性及其繁荣的开源社区,提升芯片验证的效率。

    引言

    @@ -118,11 +118,11 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    和类型,也称为标记联合,是一种可以容纳来自固定数量的不同类型之一的单个值并保留所容纳值的类型的数据结构。虽然Verilog和传统软件编程语言如C都没有直接支持和类型,但我们可以在C中模拟其行为:

    图片

    一个简单但广为人知的和类型的例子是'Option'类型:

    -

    图片

    +

    图片

    表2:从SpinalHDL到Verilog的映射。

    当存在和类型和产品类型时,可以对可表示值的集合施加约束。例如,在深度嵌入式HCL中,由“VALID”信号门控的数据信号可以使用“Option”类型表示,这样在检查“VALID”是否为“高”之前,无法读取该值。

    在浅度嵌入式HCL中,和类型只能用于电路结构而不能用于数据,但我们仍然可以使用新类型模式模拟“Option[T]”的行为。我们创建一个函数:

    -

    图片

    +

    图片

    根据值选择onSome或onNone。由于DynamicOption类型构造器是私有的,所以只需要保护值免受未经意访问的影响而不必检查VALID。

    图片

    子类型和参数化多态:子类型(最常见的形式是继承)是一种构建类型层级结构的机制。参数化多态,也称为泛型,是一种编写以类型为输入并以单态类型或函数为输出的类型级别函数的机制。

    @@ -150,7 +150,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"
  • 类型检查和IR编译。
  • 生成IR到Verilog代码。(一些深度嵌入式HCL,如Clash,也可以通过面向软件的编译器编译为模拟电路行为的可执行程序)。
  • -

    图片

    +

    图片

    图11:基于Scala的浅嵌入式HCL需要,而基于Haskell的深嵌入式HCL Clash

    基于Cocotb的验证

    4.1 Cocotb简介

    @@ -160,7 +160,7 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    除了支持不同类型的模拟器外,Cocotb相对于使用Verilog、System Verilog或VHDL进行验证具有各种优势,这些优势可以加速整个硬件设计过程。以下是Cocotb的一些显著优势:

    4.2.1 简洁高效的语言特性

    比传统的用于验证的语言如Verilog、VHDL和System Verilog更高效、更具表现力和更简洁。与使用这些传统语言编码相比,使用Python来实现复杂功能需要更少的代码。

    -

    图片

    +

    图片

    图12: 基于Cocotb的验证框架

    与此同时,Python拥有简单的语法和丰富的在线学习资料,使初学者更容易掌握。此外,Python是一种高级编程语言,具有诸多高级特性,如面向对象编程,可以帮助程序员编写更可重用的代码。

    在大多数硬件验证的情况下,C/C++被用于构建DUT的参考模型,参考模型的代码通过DPI集成到SV(System Verilog)的测试代码中。Python比其他语言(如C/C++)在构建参考模型方面更高效的一个编程场景是涉及超过64位的大整数的算术运算。密码学算法如ECC和RSA以及哈希函数通常涉及128位到2048位范围内宽度的大整数运算。C/C++中的原始类型仅支持最大64位的数字。如果使用C/C++构建您的参考模型,处理这些大整数将会很麻烦。下面的C程序实现了两个超过64位宽度的大整数的加法运算:

    @@ -187,16 +187,16 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png"

    表4:被测试矩阵乘法器的接口

    4.3.1 构建参考模型

    矩阵乘法器的参考模型可以基于numpy实现,它是一个广泛应用的Python包,提供了丰富的矩阵运算功能。利用numpy,可以直接使用方法“matmul”来实现矩阵乘法,无需使用循环语法。参考模型的具体Python实现如下:

    -

    图片

    +

    图片

    4.3.2 搭建验证平台

    基于Cocotb构建的简单验证平台结构如下图所示。验证平台主要包括四个部分:1)驱动器;2)监控器;3)参考模型;4)缓冲区。驱动器使用Python包random生成随机的输入信号,包括“valid i”、“a i”和“b i”。当“valid i”为高电平时,生成的“a i”和“b i”被发送到参考模型,并获取相应的参考输出。参考输出通过Python包Queue实现的缓冲区存储,一旦输出信号“valid o”为高电平,监控器会抓取DUT的输出端口,并将其值与从缓冲区中取出的参考输出进行比较。驱动器和监控器的功能都是通过Python的协程实现的,类似于多线程,并且可以并行执行。

    -

    图片

    +

    图片

    图14:基于Cocotb的验证平台结构

    4.3.3 启动仿真

    基于Cocotb的验证代码可以通过Makefile在仿真器上启动,而无需直接与仿真器进行交互。此外,使用cocotb-test包中提供的“simulator.run”方法,可以直接在Python函数中启动验证过程。然后可以直接运行该函数,或者使用pytest,一个成熟的Python测试框架,来管理所有测试的执行。

    图片

    一些pytest命令来管理测试单元的执行:

    -

    图片

    +

    图片

    结论

    本文主要讨论了基于新兴的开源工具SpinalHDL和Cocotb的数字硬件设计和验证,我们相信这些工具可以改变传统芯片开发过程。硬件设计的需求越来越多样化,但设计语言和工具并未明显改进。SpinalHDL和Cocotb试图将一些先进和高效的软件设计概念和方法引入到硬件开发流程中。与基于System Verilog或VHDL的传统设计和验证方法相比,SpinalHDL和Cocotb可以显著提高硬件开发的效率和质量。

    值得注意的是,SpinalHDL不是一种新的高级综合(HLS)工具,而是与Verilog或VHDL具有相同的描述层次。结合我们使用Spinal的开发经验,总结了它相对于Verilog和VHDL的三个主要优势,包括可靠性、表达性和可重用性。关于可靠性,Spinal可以提供更精确的基本电路元素抽象,在编译过程中提前检查一些设计规则,并分离设计和仿真元素。在表达性方面,SpinalHDL建立在Scala上,这是一种高级编程语言。基于Scala的特性,包括面向对象、函数式编程、递归和丰富的集合类型,更容易让硬件开发人员实现和参数化他们的设计。在可重用性方面,SpinalHDL本身提供了对常用电路元素的丰富封装来实现重用。对于设计师来说,使用Scala及其相关工具链更容易生成更具可重用性的代码和构建自己的代码库。

    @@ -209,4 +209,4 @@ const l="/zh-cn/assets/cover-78ccac63.jpg",p="/zh-cn/assets/image1-bf7fa473.png" [4] B. J. Rosser, “Cocotb: a python-based digital logic verification framework,” 2018. [5] Cocotb, -“https://github.com/cocotb/cocotb.”

    `;export{A as assetURLs,x as default,u as metadata,T as toc}; +“https://github.com/cocotb/cocotb.”

    `;export{T as assetURLs,x as default,u as metadata,R as toc}; diff --git a/zh-cn/assets/index-0e3994dc.js b/zh-cn/assets/index-951bfe33.js similarity index 99% rename from zh-cn/assets/index-0e3994dc.js rename to zh-cn/assets/index-951bfe33.js index 854ed97..ea56875 100644 --- a/zh-cn/assets/index-0e3994dc.js +++ b/zh-cn/assets/index-951bfe33.js @@ -1,4 +1,4 @@ -const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",u="/zh-cn/assets/image14-d780d4f2.png",d="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",b="/zh-cn/assets/image20-ef5a452f.png",P="/zh-cn/assets/image21-ebff1568.png",j="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,u,d,h,k,f,g,b,P,j,F],T={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},y=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

    数据流式编程的思想

    +const v="/zh-cn/assets/cover-92745c95.jpg",e="/zh-cn/assets/image1-638abd39.png",s="/zh-cn/assets/image2-2a8f796e.gif",p="/zh-cn/assets/image3-ae1841b7.png",a="/zh-cn/assets/image4-5bf432ec.png",n="/zh-cn/assets/image5-81eb5b8d.png",l="/zh-cn/assets/image6-537c8738.png",o="/zh-cn/assets/image7-b58de99e.png",i="/zh-cn/assets/image8-c6334c83.png",t="/zh-cn/assets/image9-6340ddaa.png",c="/zh-cn/assets/image10-ac1b70de.png",r="/zh-cn/assets/image11-1f1870d2.png",_="/zh-cn/assets/image12-01c249ea.png",m="/zh-cn/assets/image13-a48112ad.png",u="/zh-cn/assets/image14-d780d4f2.png",d="/zh-cn/assets/image15-f58a4d86.png",h="/zh-cn/assets/image16-79c3985b.png",k="/zh-cn/assets/image17-863e7adb.png",f="/zh-cn/assets/image18-931263d9.png",g="/zh-cn/assets/image19-8f35c101.png",P="/zh-cn/assets/image20-ef5a452f.png",b="/zh-cn/assets/image21-ebff1568.png",j="/zh-cn/assets/image22-b3b3dbaa.png",F="/zh-cn/assets/image23-12fff2c5.png",w=[v,e,s,p,a,n,l,o,i,t,c,r,_,m,u,d,h,k,f,g,P,b,j,F],y={label:"数据流式编程在硬件设计中的应用",description:"数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到19世纪60年代,由MIT的Jack Dennis教授开创。",cover:"./cover.jpg",location:"中国香港",author:["米明恒"],tags:["硬件加速"],date:"2023-10-26",title:"Application of data flow programming in hardware design"},T=[{label:"数据流式编程的思想",level:2},{label:"数据流式编程思想简介",level:3},{label:"软件开发中的数据流式编程思想",level:3},{label:"软件数据流 vs 硬件数据流",level:3},{label:"数据流思想与状态机思想的对比",level:3},{label:"Bluespec 语言及其流式编程框架 PAClib",level:2},{label:"Bluespec SystemVerilog(BSV)和 PAClib 简介",level:3},{label:"PAClib 中的基础开发组件",level:3},{label:"IFFT 应用实例",level:2},{label:"需求背景",level:3},{label:"代码实现",level:3},{label:"写在最后",level:2}],I=`

    数据流式编程的思想

    数据流式编程思想简介

    数据流式编程(Dataflow Programming)是一种存在已久的程序设计范式,可以追溯到 19 世纪 60 年代,由 MIT 的 Jack Dennis 教授开创。

    图片

    @@ -261,12 +261,12 @@ endfunction f_radix4 (stagenum), param_buf_unfunnel); -

    图片

    +

    图片

    如上述代码片段和图 20 所示,通过 mkMap_fn_with_funnel_indexed 函数的第一个参数来决定实例化多少个 f_radix4 计算单元,从而改变计算的并行度。

        let permuter = mkFn_to_Pipe_Buffered (False, f_permute,
                                                 param_buf_permuter_output);
     
    -

    图片

    +

    图片

    图 21 在不同位置插入流水线寄存器

    如上述代码片段和图 21 所示,通过 mkFn_to_Pipe_Buffered 函数的两个输入参数来控制是否加入 FIFO,从而实现在流水线或组合逻辑之间的切换,使得程序可以在时序上做出简单的调整。

    return mkCompose (grouper,
    @@ -286,4 +286,4 @@ endfunction
     

    参考资料:

    [1] https://en.wikipedia.org/wiki/Dataflow_programming

    [2] Rishiyur S. Nikhil. Two uses of FP techniques in HW design[EB/OL]. 2010[].

    -

    http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/27/slides/rishiyur2.pdf.

    `;export{w as assetURLs,I as default,T as metadata,y as toc}; +

    http://www.cs.ox.ac.uk/ralf.hinze/WG2.8/27/slides/rishiyur2.pdf.

    `;export{w as assetURLs,I as default,y as metadata,T as toc}; diff --git a/zh-cn/assets/index-af67bb35.js b/zh-cn/assets/index-a5a18b84.js similarity index 76% rename from zh-cn/assets/index-af67bb35.js rename to zh-cn/assets/index-a5a18b84.js index 57ae9fd..190822d 100644 --- a/zh-cn/assets/index-af67bb35.js +++ b/zh-cn/assets/index-a5a18b84.js @@ -1,4 +1,4 @@ -var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var iQ=CE((aQ,ou)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var Go=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Cx(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function DE(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){if(this instanceof n){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var l={},jE={get exports(){return l},set exports(e){l=e}},id={},I={},EE={get exports(){return I},set exports(e){I=e}},ke={};/** +var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var aQ=CE((uQ,ou)=>{(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const a of o.addedNodes)a.tagName==="LINK"&&a.rel==="modulepreload"&&n(a)}).observe(document,{childList:!0,subtree:!0});function r(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=r(i);fetch(i.href,o)}})();var Go=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function C2(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function DE(e){if(e.__esModule)return e;var t=e.default;if(typeof t=="function"){var r=function n(){if(this instanceof n){var i=[null];i.push.apply(i,arguments);var o=Function.bind.apply(t,i);return new o}return t.apply(this,arguments)};r.prototype=t.prototype}else r={};return Object.defineProperty(r,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var i=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:function(){return e[n]}})}),r}var l={},jE={get exports(){return l},set exports(e){l=e}},id={},I={},EE={get exports(){return I},set exports(e){I=e}},ke={};/** * @license React * react.production.min.js * @@ -6,7 +6,7 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var iQ=CE((aQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var kl=Symbol.for("react.element"),AE=Symbol.for("react.portal"),TE=Symbol.for("react.fragment"),RE=Symbol.for("react.strict_mode"),OE=Symbol.for("react.profiler"),PE=Symbol.for("react.provider"),ME=Symbol.for("react.context"),LE=Symbol.for("react.forward_ref"),IE=Symbol.for("react.suspense"),NE=Symbol.for("react.memo"),zE=Symbol.for("react.lazy"),Zv=Symbol.iterator;function YE(e){return e===null||typeof e!="object"?null:(e=Zv&&e[Zv]||e["@@iterator"],typeof e=="function"?e:null)}var Dx={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},jx=Object.assign,Ex={};function Ys(e,t,r){this.props=e,this.context=t,this.refs=Ex,this.updater=r||Dx}Ys.prototype.isReactComponent={};Ys.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)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,e,t,"setState")};Ys.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function Ax(){}Ax.prototype=Ys.prototype;function s0(e,t,r){this.props=e,this.context=t,this.refs=Ex,this.updater=r||Dx}var a0=s0.prototype=new Ax;a0.constructor=s0;jx(a0,Ys.prototype);a0.isPureReactComponent=!0;var Jv=Array.isArray,Tx=Object.prototype.hasOwnProperty,l0={current:null},Rx={key:!0,ref:!0,__self:!0,__source:!0};function Ox(e,t,r){var n,i={},o=null,a=null;if(t!=null)for(n in t.ref!==void 0&&(a=t.ref),t.key!==void 0&&(o=""+t.key),t)Tx.call(t,n)&&!Rx.hasOwnProperty(n)&&(i[n]=t[n]);var c=arguments.length-2;if(c===1)i.children=r;else if(1()=>(t||e((t={exports:{}}).exports,t),t.exports);var iQ=CE((aQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var $E=I,BE=Symbol.for("react.element"),WE=Symbol.for("react.fragment"),GE=Object.prototype.hasOwnProperty,KE=$E.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,XE={key:!0,ref:!0,__self:!0,__source:!0};function Px(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)GE.call(t,n)&&!XE.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:BE,type:e,key:o,ref:a,props:i,_owner:KE.current}}id.Fragment=WE;id.jsx=Px;id.jsxs=Px;(function(e){e.exports=id})(jE);var Cm={},su={},QE={get exports(){return su},set exports(e){su=e}},Sr={},Dm={},qE={get exports(){return Dm},set exports(e){Dm=e}},Mx={};/** + */var $E=I,BE=Symbol.for("react.element"),WE=Symbol.for("react.fragment"),GE=Object.prototype.hasOwnProperty,KE=$E.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,XE={key:!0,ref:!0,__self:!0,__source:!0};function P2(e,t,r){var n,i={},o=null,a=null;r!==void 0&&(o=""+r),t.key!==void 0&&(o=""+t.key),t.ref!==void 0&&(a=t.ref);for(n in t)GE.call(t,n)&&!XE.hasOwnProperty(n)&&(i[n]=t[n]);if(e&&e.defaultProps)for(n in t=e.defaultProps,t)i[n]===void 0&&(i[n]=t[n]);return{$$typeof:BE,type:e,key:o,ref:a,props:i,_owner:KE.current}}id.Fragment=WE;id.jsx=P2;id.jsxs=P2;(function(e){e.exports=id})(jE);var Cm={},su={},QE={get exports(){return su},set exports(e){su=e}},Sr={},Dm={},qE={get exports(){return Dm},set exports(e){Dm=e}},M2={};/** * @license React * scheduler.production.min.js * @@ -22,7 +22,7 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var iQ=CE((aQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */(function(e){function t($,le){var Q=$.length;$.push(le);e:for(;0>>1,he=$[ue];if(0>>1;uei(K,Q))zti(rr,K)?($[ue]=rr,$[zt]=Q,ue=zt):($[ue]=K,$[Ve]=Q,ue=Ve);else if(zti(rr,Q))$[ue]=rr,$[zt]=Q,ue=zt;else break e}}return le}function i($,le){var Q=$.sortIndex-le.sortIndex;return Q!==0?Q:$.id-le.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,c=a.now();e.unstable_now=function(){return a.now()-c}}var d=[],h=[],g=1,v=null,_=3,b=!1,k=!1,D=!1,j=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S($){for(var le=r(h);le!==null;){if(le.callback===null)n(h);else if(le.startTime<=$)n(h),le.sortIndex=le.expirationTime,t(d,le);else break;le=r(h)}}function E($){if(D=!1,S($),!k)if(r(d)!==null)k=!0,ze(T);else{var le=r(h);le!==null&&mt(E,le.startTime-$)}}function T($,le){k=!1,D&&(D=!1,y(O),O=-1),b=!0;var Q=_;try{for(S(le),v=r(d);v!==null&&(!(v.expirationTime>le)||$&&!ee());){var ue=v.callback;if(typeof ue=="function"){v.callback=null,_=v.priorityLevel;var he=ue(v.expirationTime<=le);le=e.unstable_now(),typeof he=="function"?v.callback=he:v===r(d)&&n(d),S(le)}else n(d);v=r(d)}if(v!==null)var st=!0;else{var Ve=r(h);Ve!==null&&mt(E,Ve.startTime-le),st=!1}return st}finally{v=null,_=Q,b=!1}}var R=!1,P=null,O=-1,z=5,Y=-1;function ee(){return!(e.unstable_now()-Y$||125<$?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):z=0<$?Math.floor(1e3/$):5},e.unstable_getCurrentPriorityLevel=function(){return _},e.unstable_getFirstCallbackNode=function(){return r(d)},e.unstable_next=function($){switch(_){case 1:case 2:case 3:var le=3;break;default:le=_}var Q=_;_=le;try{return $()}finally{_=Q}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function($,le){switch($){case 1:case 2:case 3:case 4:case 5:break;default:$=3}var Q=_;_=$;try{return le()}finally{_=Q}},e.unstable_scheduleCallback=function($,le,Q){var ue=e.unstable_now();switch(typeof Q=="object"&&Q!==null?(Q=Q.delay,Q=typeof Q=="number"&&0ue?($.sortIndex=Q,t(h,$),r(d)===null&&$===r(h)&&(D?(y(O),O=-1):D=!0,mt(E,Q-ue))):($.sortIndex=he,t(d,$),k||b||(k=!0,ze(T))),$},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function($){var le=_;return function(){var Q=_;_=le;try{return $.apply(this,arguments)}finally{_=Q}}}})(Mx);(function(e){e.exports=Mx})(qE);/** + */(function(e){function t($,le){var Q=$.length;$.push(le);e:for(;0>>1,he=$[ue];if(0>>1;uei(K,Q))zti(rr,K)?($[ue]=rr,$[zt]=Q,ue=zt):($[ue]=K,$[Fe]=Q,ue=Fe);else if(zti(rr,Q))$[ue]=rr,$[zt]=Q,ue=zt;else break e}}return le}function i($,le){var Q=$.sortIndex-le.sortIndex;return Q!==0?Q:$.id-le.id}if(typeof performance=="object"&&typeof performance.now=="function"){var o=performance;e.unstable_now=function(){return o.now()}}else{var a=Date,c=a.now();e.unstable_now=function(){return a.now()-c}}var d=[],h=[],g=1,v=null,_=3,k=!1,C=!1,D=!1,j=typeof setTimeout=="function"?setTimeout:null,y=typeof clearTimeout=="function"?clearTimeout:null,w=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function S($){for(var le=r(h);le!==null;){if(le.callback===null)n(h);else if(le.startTime<=$)n(h),le.sortIndex=le.expirationTime,t(d,le);else break;le=r(h)}}function E($){if(D=!1,S($),!C)if(r(d)!==null)C=!0,ze(T);else{var le=r(h);le!==null&&mt(E,le.startTime-$)}}function T($,le){C=!1,D&&(D=!1,y(O),O=-1),k=!0;var Q=_;try{for(S(le),v=r(d);v!==null&&(!(v.expirationTime>le)||$&&!ee());){var ue=v.callback;if(typeof ue=="function"){v.callback=null,_=v.priorityLevel;var he=ue(v.expirationTime<=le);le=e.unstable_now(),typeof he=="function"?v.callback=he:v===r(d)&&n(d),S(le)}else n(d);v=r(d)}if(v!==null)var st=!0;else{var Fe=r(h);Fe!==null&&mt(E,Fe.startTime-le),st=!1}return st}finally{v=null,_=Q,k=!1}}var R=!1,P=null,O=-1,z=5,Y=-1;function ee(){return!(e.unstable_now()-Y$||125<$?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):z=0<$?Math.floor(1e3/$):5},e.unstable_getCurrentPriorityLevel=function(){return _},e.unstable_getFirstCallbackNode=function(){return r(d)},e.unstable_next=function($){switch(_){case 1:case 2:case 3:var le=3;break;default:le=_}var Q=_;_=le;try{return $()}finally{_=Q}},e.unstable_pauseExecution=function(){},e.unstable_requestPaint=function(){},e.unstable_runWithPriority=function($,le){switch($){case 1:case 2:case 3:case 4:case 5:break;default:$=3}var Q=_;_=$;try{return le()}finally{_=Q}},e.unstable_scheduleCallback=function($,le,Q){var ue=e.unstable_now();switch(typeof Q=="object"&&Q!==null?(Q=Q.delay,Q=typeof Q=="number"&&0ue?($.sortIndex=Q,t(h,$),r(d)===null&&$===r(h)&&(D?(y(O),O=-1):D=!0,mt(E,Q-ue))):($.sortIndex=he,t(d,$),C||k||(C=!0,ze(T))),$},e.unstable_shouldYield=ee,e.unstable_wrapCallback=function($){var le=_;return function(){var Q=_;_=le;try{return $.apply(this,arguments)}finally{_=Q}}}})(M2);(function(e){e.exports=M2})(qE);/** * @license React * react-dom.production.min.js * @@ -30,14 +30,14 @@ var CE=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var iQ=CE((aQ,ou) * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var Lx=I,xr=Dm;function F(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,r=1;r"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),jm=Object.prototype.hasOwnProperty,ZE=/^[: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]*$/,ty={},ry={};function JE(e){return jm.call(ry,e)?!0:jm.call(ty,e)?!1:ZE.test(e)?ry[e]=!0:(ty[e]=!0,!1)}function eA(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function tA(e,t,r,n){if(t===null||typeof t>"u"||eA(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function tr(e,t,r,n,i,o,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var Nt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Nt[e]=new tr(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Nt[t]=new tr(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Nt[e]=new tr(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Nt[e]=new tr(e,2,!1,e,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(e){Nt[e]=new tr(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Nt[e]=new tr(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Nt[e]=new tr(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Nt[e]=new tr(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Nt[e]=new tr(e,5,!1,e.toLowerCase(),null,!1,!1)});var u0=/[\-:]([a-z])/g;function d0(e){return e[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(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!1,!1)});Nt.xlinkHref=new tr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!0,!0)});function f0(e,t,r,n){var i=Nt.hasOwnProperty(t)?Nt[t]:null;(i!==null?i.type!==0:n||!(2"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),jm=Object.prototype.hasOwnProperty,ZE=/^[: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]*$/,ty={},ry={};function JE(e){return jm.call(ry,e)?!0:jm.call(ty,e)?!1:ZE.test(e)?ry[e]=!0:(ty[e]=!0,!1)}function eA(e,t,r,n){if(r!==null&&r.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return n?!1:r!==null?!r.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function tA(e,t,r,n){if(t===null||typeof t>"u"||eA(e,t,r,n))return!0;if(n)return!1;if(r!==null)switch(r.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function tr(e,t,r,n,i,o,a){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=n,this.attributeNamespace=i,this.mustUseProperty=r,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=a}var Nt={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Nt[e]=new tr(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Nt[t]=new tr(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Nt[e]=new tr(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Nt[e]=new tr(e,2,!1,e,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(e){Nt[e]=new tr(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Nt[e]=new tr(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Nt[e]=new tr(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Nt[e]=new tr(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Nt[e]=new tr(e,5,!1,e.toLowerCase(),null,!1,!1)});var u0=/[\-:]([a-z])/g;function d0(e){return e[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(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(u0,d0);Nt[t]=new tr(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!1,!1)});Nt.xlinkHref=new tr("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Nt[e]=new tr(e,1,!1,e.toLowerCase(),null,!0,!0)});function f0(e,t,r,n){var i=Nt.hasOwnProperty(t)?Nt[t]:null;(i!==null?i.type!==0:n||!(2c||i[a]!==o[c]){var d=` -`+i[a].replace(" at new "," at ");return e.displayName&&d.includes("")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=c);break}}}finally{Hf=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Da(e):""}function rA(e){switch(e.tag){case 5:return Da(e.type);case 16:return Da("Lazy");case 13:return Da("Suspense");case 19:return Da("SuspenseList");case 0:case 2:case 15:return e=Ff(e.type,!1),e;case 11:return e=Ff(e.type.render,!1),e;case 1:return e=Ff(e.type,!0),e;default:return""}}function Rm(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xo:return"Fragment";case Ko:return"Portal";case Em:return"Profiler";case h0:return"StrictMode";case Am:return"Suspense";case Tm:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case zx:return(e.displayName||"Context")+".Consumer";case Nx:return(e._context.displayName||"Context")+".Provider";case m0:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case p0:return t=e.displayName||null,t!==null?t:Rm(e.type)||"Memo";case yi:t=e._payload,e=e._init;try{return Rm(e(t))}catch{}}return null}function nA(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rm(t);case 8:return t===h0?"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(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Vi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function Hx(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function iA(e){var t=Hx(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(a){n=""+a,o.call(this,a)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(a){n=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ic(e){e._valueTracker||(e._valueTracker=iA(e))}function Fx(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=Hx(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function au(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Om(e,t){var r=t.checked;return ot({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function iy(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=Vi(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Vx(e,t){t=t.checked,t!=null&&f0(e,"checked",t,!1)}function Pm(e,t){Vx(e,t);var r=Vi(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mm(e,t.type,r):t.hasOwnProperty("defaultValue")&&Mm(e,t.type,Vi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function oy(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function Mm(e,t,r){(t!=="number"||au(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var ja=Array.isArray;function us(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=oc.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ka(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Ra={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},oA=["Webkit","ms","Moz","O"];Object.keys(Ra).forEach(function(e){oA.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ra[t]=Ra[e]})});function Wx(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Ra.hasOwnProperty(e)&&Ra[e]?(""+t).trim():t+"px"}function Gx(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=Wx(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var sA=ot({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});function Nm(e,t){if(t){if(sA[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(F(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(F(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(F(61))}if(t.style!=null&&typeof t.style!="object")throw Error(F(62))}}function zm(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){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}}var Ym=null;function g0(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Hm=null,ds=null,fs=null;function ly(e){if(e=jl(e)){if(typeof Hm!="function")throw Error(F(280));var t=e.stateNode;t&&(t=cd(t),Hm(e.stateNode,e.type,t))}}function Kx(e){ds?fs?fs.push(e):fs=[e]:ds=e}function Xx(){if(ds){var e=ds,t=fs;if(fs=ds=null,ly(e),t)for(e=0;e>>=0,e===0?32:31-(vA(e)/yA|0)|0}var sc=64,ac=4194304;function Ea(e){switch(e&-e){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 e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function du(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,o=e.pingedLanes,a=r&268435455;if(a!==0){var c=a&~i;c!==0?n=Ea(c):(o&=a,o!==0&&(n=Ea(o)))}else a=r&~i,a!==0?n=Ea(a):o!==0&&(n=Ea(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Cl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Qr(t),e[t]=r}function SA(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=Pa),vy=String.fromCharCode(32),yy=!1;function p2(e,t){switch(e){case"keyup":return QA.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function g2(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Qo=!1;function ZA(e,t){switch(e){case"compositionend":return g2(t);case"keypress":return t.which!==32?null:(yy=!0,vy);case"textInput":return e=t.data,e===vy&&yy?null:e;default:return null}}function JA(e,t){if(Qo)return e==="compositionend"||!k0&&p2(e,t)?(e=h2(),Uc=_0=ki=null,Qo=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Sy(r)}}function x2(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?x2(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function _2(){for(var e=window,t=au();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=au(e.document)}return t}function C0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function lT(e){var t=_2(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&x2(r.ownerDocument.documentElement,r)){if(n!==null&&C0(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,o=Math.min(n.start,i);n=n.end===void 0?o:Math.min(n.end,i),!e.extend&&o>n&&(i=n,n=o,o=i),i=by(r,o);var a=by(r,n);i&&a&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,qo=null,Wm=null,La=null,Gm=!1;function ky(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Gm||qo==null||qo!==au(n)||(n=qo,"selectionStart"in n&&C0(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),La&&el(La,n)||(La=n,n=mu(Wm,"onSelect"),0es||(e.current=Jm[es],Jm[es]=null,es--)}function Fe(e,t){es++,Jm[es]=e.current,e.current=t}var Ui={},Bt=Wi(Ui),dr=Wi(!1),po=Ui;function ks(e,t){var r=e.type.contextTypes;if(!r)return Ui;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in r)i[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function fr(e){return e=e.childContextTypes,e!=null}function gu(){Ge(dr),Ge(Bt)}function Ry(e,t,r){if(Bt.current!==Ui)throw Error(F(168));Fe(Bt,t),Fe(dr,r)}function T2(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(F(108,nA(e)||"Unknown",i));return ot({},r,n)}function vu(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ui,po=Bt.current,Fe(Bt,e),Fe(dr,dr.current),!0}function Oy(e,t,r){var n=e.stateNode;if(!n)throw Error(F(169));r?(e=T2(e,t,po),n.__reactInternalMemoizedMergedChildContext=e,Ge(dr),Ge(Bt),Fe(Bt,e)):Ge(dr),Fe(dr,r)}var Un=null,ud=!1,th=!1;function R2(e){Un===null?Un=[e]:Un.push(e)}function xT(e){ud=!0,R2(e)}function Gi(){if(!th&&Un!==null){th=!0;var e=0,t=Le;try{var r=Un;for(Le=1;e>=a,i-=a,Bn=1<<32-Qr(t)+i|r<O?(z=P,P=null):z=P.sibling;var Y=_(y,P,S[O],E);if(Y===null){P===null&&(P=z);break}e&&P&&Y.alternate===null&&t(y,P),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y,P=z}if(O===S.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=_(y,P,Y.value,E);if(ee===null){P===null&&(P=z);break}e&&P&&ee.alternate===null&&t(y,P),w=o(ee,w,O),R===null?T=ee:R.sibling=ee,R=ee,P=z}if(Y.done)return r(y,P),et&&eo(y,O),T;if(P===null){for(;!Y.done;O++,Y=S.next())Y=v(y,Y.value,E),Y!==null&&(w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return et&&eo(y,O),T}for(P=n(y,P);!Y.done;O++,Y=S.next())Y=b(P,y,O,Y.value,E),Y!==null&&(e&&Y.alternate!==null&&P.delete(Y.key===null?O:Y.key),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return e&&P.forEach(function(te){return t(y,te)}),et&&eo(y,O),T}function j(y,w,S,E){if(typeof S=="object"&&S!==null&&S.type===Xo&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case nc:e:{for(var T=S.key,R=w;R!==null;){if(R.key===T){if(T=S.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,S.props.children),w.return=y,y=w;break e}}else if(R.elementType===T||typeof T=="object"&&T!==null&&T.$$typeof===yi&&Yy(T)===R.type){r(y,R.sibling),w=i(R,S.props),w.ref=ha(y,R,S),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}S.type===Xo?(w=uo(S.props.children,y.mode,E,S.key),w.return=y,y=w):(E=qc(S.type,S.key,S.props,null,y.mode,E),E.ref=ha(y,w,S),E.return=y,y=E)}return a(y);case Ko:e:{for(R=S.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===S.containerInfo&&w.stateNode.implementation===S.implementation){r(y,w.sibling),w=i(w,S.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(S,y.mode,E),w.return=y,y=w}return a(y);case yi:return R=S._init,j(y,w,R(S._payload),E)}if(ja(S))return k(y,w,S,E);if(la(S))return D(y,w,S,E);mc(y,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,S),w.return=y,y=w):(r(y,w),w=lh(S,y.mode,E),w.return=y,y=w),a(y)):r(y,w)}return j}var Ds=Y2(!0),H2=Y2(!1),El={},vn=Wi(El),il=Wi(El),ol=Wi(El);function oo(e){if(e===El)throw Error(F(174));return e}function M0(e,t){switch(Fe(ol,t),Fe(il,e),Fe(vn,El),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Im(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Im(t,e)}Ge(vn),Fe(vn,t)}function js(){Ge(vn),Ge(il),Ge(ol)}function F2(e){oo(ol.current);var t=oo(vn.current),r=Im(t,e.type);t!==r&&(Fe(il,e),Fe(vn,r))}function L0(e){il.current===e&&(Ge(vn),Ge(il))}var nt=Wi(0);function bu(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var rh=[];function I0(){for(var e=0;er?r:4,e(!0);var n=nh.transition;nh.transition={};try{e(!1),t()}finally{Le=r,nh.transition=n}}function n_(){return Pr().memoizedState}function kT(e,t,r){var n=Mi(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},i_(e))o_(t,r);else if(r=L2(e,t,r,n),r!==null){var i=Jt();qr(r,e,n,i),s_(r,t,n)}}function CT(e,t,r){var n=Mi(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(i_(e))o_(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var a=t.lastRenderedState,c=o(a,r);if(i.hasEagerState=!0,i.eagerState=c,Jr(c,a)){var d=t.interleaved;d===null?(i.next=i,O0(t)):(i.next=d.next,d.next=i),t.interleaved=i;return}}catch{}finally{}r=L2(e,t,i,n),r!==null&&(i=Jt(),qr(r,e,n,i),s_(r,t,n))}}function i_(e){var t=e.alternate;return e===it||t!==null&&t===it}function o_(e,t){Ia=ku=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function s_(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,y0(e,r)}}var Cu={readContext:Or,useCallback:Ht,useContext:Ht,useEffect:Ht,useImperativeHandle:Ht,useInsertionEffect:Ht,useLayoutEffect:Ht,useMemo:Ht,useReducer:Ht,useRef:Ht,useState:Ht,useDebugValue:Ht,useDeferredValue:Ht,useTransition:Ht,useMutableSource:Ht,useSyncExternalStore:Ht,useId:Ht,unstable_isNewReconciler:!1},DT={readContext:Or,useCallback:function(e,t){return hn().memoizedState=[e,t===void 0?null:t],e},useContext:Or,useEffect:Fy,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,Gc(4194308,4,Z2.bind(null,t,e),r)},useLayoutEffect:function(e,t){return Gc(4194308,4,e,t)},useInsertionEffect:function(e,t){return Gc(4,2,e,t)},useMemo:function(e,t){var r=hn();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=hn();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=kT.bind(null,it,e),[n.memoizedState,e]},useRef:function(e){var t=hn();return e={current:e},t.memoizedState=e},useState:Hy,useDebugValue:F0,useDeferredValue:function(e){return hn().memoizedState=e},useTransition:function(){var e=Hy(!1),t=e[0];return e=bT.bind(null,e[1]),hn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=it,i=hn();if(et){if(r===void 0)throw Error(F(407));r=r()}else{if(r=t(),Pt===null)throw Error(F(349));vo&30||$2(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,Fy(W2.bind(null,n,o,e),[e]),n.flags|=2048,ll(9,B2.bind(null,n,o,r,t),void 0,null),r},useId:function(){var e=hn(),t=Pt.identifierPrefix;if(et){var r=Wn,n=Bn;r=(n&~(1<<32-Qr(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=sl++,0")&&(d=d.replace("",e.displayName)),d}while(1<=a&&0<=c);break}}}finally{Hf=!1,Error.prepareStackTrace=r}return(e=e?e.displayName||e.name:"")?Da(e):""}function rA(e){switch(e.tag){case 5:return Da(e.type);case 16:return Da("Lazy");case 13:return Da("Suspense");case 19:return Da("SuspenseList");case 0:case 2:case 15:return e=Vf(e.type,!1),e;case 11:return e=Vf(e.type.render,!1),e;case 1:return e=Vf(e.type,!0),e;default:return""}}function Rm(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Xo:return"Fragment";case Ko:return"Portal";case Em:return"Profiler";case h0:return"StrictMode";case Am:return"Suspense";case Tm:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case z2:return(e.displayName||"Context")+".Consumer";case N2:return(e._context.displayName||"Context")+".Provider";case m0:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case p0:return t=e.displayName||null,t!==null?t:Rm(e.type)||"Memo";case yi:t=e._payload,e=e._init;try{return Rm(e(t))}catch{}}return null}function nA(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rm(t);case 8:return t===h0?"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(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function Fi(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function H2(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function iA(e){var t=H2(e)?"checked":"value",r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),n=""+e[t];if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var i=r.get,o=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return i.call(this)},set:function(a){n=""+a,o.call(this,a)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return n},setValue:function(a){n=""+a},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ic(e){e._valueTracker||(e._valueTracker=iA(e))}function V2(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var r=t.getValue(),n="";return e&&(n=H2(e)?e.checked?"true":"false":e.value),e=n,e!==r?(t.setValue(e),!0):!1}function au(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Om(e,t){var r=t.checked;return ot({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:r??e._wrapperState.initialChecked})}function iy(e,t){var r=t.defaultValue==null?"":t.defaultValue,n=t.checked!=null?t.checked:t.defaultChecked;r=Fi(t.value!=null?t.value:r),e._wrapperState={initialChecked:n,initialValue:r,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function F2(e,t){t=t.checked,t!=null&&f0(e,"checked",t,!1)}function Pm(e,t){F2(e,t);var r=Fi(t.value),n=t.type;if(r!=null)n==="number"?(r===0&&e.value===""||e.value!=r)&&(e.value=""+r):e.value!==""+r&&(e.value=""+r);else if(n==="submit"||n==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mm(e,t.type,r):t.hasOwnProperty("defaultValue")&&Mm(e,t.type,Fi(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function oy(e,t,r){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var n=t.type;if(!(n!=="submit"&&n!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,r||t===e.value||(e.value=t),e.defaultValue=t}r=e.name,r!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,r!==""&&(e.name=r)}function Mm(e,t,r){(t!=="number"||au(e.ownerDocument)!==e)&&(r==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+r&&(e.defaultValue=""+r))}var ja=Array.isArray;function us(e,t,r,n){if(e=e.options,t){t={};for(var i=0;i"+t.valueOf().toString()+"",t=oc.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Ka(e,t){if(t){var r=e.firstChild;if(r&&r===e.lastChild&&r.nodeType===3){r.nodeValue=t;return}}e.textContent=t}var Ra={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},oA=["Webkit","ms","Moz","O"];Object.keys(Ra).forEach(function(e){oA.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Ra[t]=Ra[e]})});function W2(e,t,r){return t==null||typeof t=="boolean"||t===""?"":r||typeof t!="number"||t===0||Ra.hasOwnProperty(e)&&Ra[e]?(""+t).trim():t+"px"}function G2(e,t){e=e.style;for(var r in t)if(t.hasOwnProperty(r)){var n=r.indexOf("--")===0,i=W2(r,t[r],n);r==="float"&&(r="cssFloat"),n?e.setProperty(r,i):e[r]=i}}var sA=ot({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});function Nm(e,t){if(t){if(sA[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(V(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(V(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(V(61))}if(t.style!=null&&typeof t.style!="object")throw Error(V(62))}}function zm(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){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}}var Ym=null;function g0(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Hm=null,ds=null,fs=null;function ly(e){if(e=jl(e)){if(typeof Hm!="function")throw Error(V(280));var t=e.stateNode;t&&(t=cd(t),Hm(e.stateNode,e.type,t))}}function K2(e){ds?fs?fs.push(e):fs=[e]:ds=e}function X2(){if(ds){var e=ds,t=fs;if(fs=ds=null,ly(e),t)for(e=0;e>>=0,e===0?32:31-(vA(e)/yA|0)|0}var sc=64,ac=4194304;function Ea(e){switch(e&-e){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 e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function du(e,t){var r=e.pendingLanes;if(r===0)return 0;var n=0,i=e.suspendedLanes,o=e.pingedLanes,a=r&268435455;if(a!==0){var c=a&~i;c!==0?n=Ea(c):(o&=a,o!==0&&(n=Ea(o)))}else a=r&~i,a!==0?n=Ea(a):o!==0&&(n=Ea(o));if(n===0)return 0;if(t!==0&&t!==n&&!(t&i)&&(i=n&-n,o=t&-t,i>=o||i===16&&(o&4194240)!==0))return t;if(n&4&&(n|=r&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=n;0r;r++)t.push(e);return t}function Cl(e,t,r){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Qr(t),e[t]=r}function SA(e,t){var r=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var n=e.eventTimes;for(e=e.expirationTimes;0=Pa),vy=String.fromCharCode(32),yy=!1;function px(e,t){switch(e){case"keyup":return QA.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function gx(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Qo=!1;function ZA(e,t){switch(e){case"compositionend":return gx(t);case"keypress":return t.which!==32?null:(yy=!0,vy);case"textInput":return e=t.data,e===vy&&yy?null:e;default:return null}}function JA(e,t){if(Qo)return e==="compositionend"||!k0&&px(e,t)?(e=hx(),Uc=_0=ki=null,Qo=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Sy(r)}}function xx(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?xx(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function _x(){for(var e=window,t=au();t instanceof e.HTMLIFrameElement;){try{var r=typeof t.contentWindow.location.href=="string"}catch{r=!1}if(r)e=t.contentWindow;else break;t=au(e.document)}return t}function C0(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function lT(e){var t=_x(),r=e.focusedElem,n=e.selectionRange;if(t!==r&&r&&r.ownerDocument&&xx(r.ownerDocument.documentElement,r)){if(n!==null&&C0(r)){if(t=n.start,e=n.end,e===void 0&&(e=t),"selectionStart"in r)r.selectionStart=t,r.selectionEnd=Math.min(e,r.value.length);else if(e=(t=r.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var i=r.textContent.length,o=Math.min(n.start,i);n=n.end===void 0?o:Math.min(n.end,i),!e.extend&&o>n&&(i=n,n=o,o=i),i=by(r,o);var a=by(r,n);i&&a&&(e.rangeCount!==1||e.anchorNode!==i.node||e.anchorOffset!==i.offset||e.focusNode!==a.node||e.focusOffset!==a.offset)&&(t=t.createRange(),t.setStart(i.node,i.offset),e.removeAllRanges(),o>n?(e.addRange(t),e.extend(a.node,a.offset)):(t.setEnd(a.node,a.offset),e.addRange(t)))}}for(t=[],e=r;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof r.focus=="function"&&r.focus(),r=0;r=document.documentMode,qo=null,Wm=null,La=null,Gm=!1;function ky(e,t,r){var n=r.window===r?r.document:r.nodeType===9?r:r.ownerDocument;Gm||qo==null||qo!==au(n)||(n=qo,"selectionStart"in n&&C0(n)?n={start:n.selectionStart,end:n.selectionEnd}:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection(),n={anchorNode:n.anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset}),La&&el(La,n)||(La=n,n=mu(Wm,"onSelect"),0es||(e.current=Jm[es],Jm[es]=null,es--)}function Ve(e,t){es++,Jm[es]=e.current,e.current=t}var Ui={},Bt=Wi(Ui),dr=Wi(!1),po=Ui;function ks(e,t){var r=e.type.contextTypes;if(!r)return Ui;var n=e.stateNode;if(n&&n.__reactInternalMemoizedUnmaskedChildContext===t)return n.__reactInternalMemoizedMaskedChildContext;var i={},o;for(o in r)i[o]=t[o];return n&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function fr(e){return e=e.childContextTypes,e!=null}function gu(){Ge(dr),Ge(Bt)}function Ry(e,t,r){if(Bt.current!==Ui)throw Error(V(168));Ve(Bt,t),Ve(dr,r)}function Tx(e,t,r){var n=e.stateNode;if(t=t.childContextTypes,typeof n.getChildContext!="function")return r;n=n.getChildContext();for(var i in n)if(!(i in t))throw Error(V(108,nA(e)||"Unknown",i));return ot({},r,n)}function vu(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ui,po=Bt.current,Ve(Bt,e),Ve(dr,dr.current),!0}function Oy(e,t,r){var n=e.stateNode;if(!n)throw Error(V(169));r?(e=Tx(e,t,po),n.__reactInternalMemoizedMergedChildContext=e,Ge(dr),Ge(Bt),Ve(Bt,e)):Ge(dr),Ve(dr,r)}var Un=null,ud=!1,th=!1;function Rx(e){Un===null?Un=[e]:Un.push(e)}function xT(e){ud=!0,Rx(e)}function Gi(){if(!th&&Un!==null){th=!0;var e=0,t=Le;try{var r=Un;for(Le=1;e>=a,i-=a,Bn=1<<32-Qr(t)+i|r<O?(z=P,P=null):z=P.sibling;var Y=_(y,P,S[O],E);if(Y===null){P===null&&(P=z);break}e&&P&&Y.alternate===null&&t(y,P),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y,P=z}if(O===S.length)return r(y,P),et&&eo(y,O),T;if(P===null){for(;OO?(z=P,P=null):z=P.sibling;var ee=_(y,P,Y.value,E);if(ee===null){P===null&&(P=z);break}e&&P&&ee.alternate===null&&t(y,P),w=o(ee,w,O),R===null?T=ee:R.sibling=ee,R=ee,P=z}if(Y.done)return r(y,P),et&&eo(y,O),T;if(P===null){for(;!Y.done;O++,Y=S.next())Y=v(y,Y.value,E),Y!==null&&(w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return et&&eo(y,O),T}for(P=n(y,P);!Y.done;O++,Y=S.next())Y=k(P,y,O,Y.value,E),Y!==null&&(e&&Y.alternate!==null&&P.delete(Y.key===null?O:Y.key),w=o(Y,w,O),R===null?T=Y:R.sibling=Y,R=Y);return e&&P.forEach(function(te){return t(y,te)}),et&&eo(y,O),T}function j(y,w,S,E){if(typeof S=="object"&&S!==null&&S.type===Xo&&S.key===null&&(S=S.props.children),typeof S=="object"&&S!==null){switch(S.$$typeof){case nc:e:{for(var T=S.key,R=w;R!==null;){if(R.key===T){if(T=S.type,T===Xo){if(R.tag===7){r(y,R.sibling),w=i(R,S.props.children),w.return=y,y=w;break e}}else if(R.elementType===T||typeof T=="object"&&T!==null&&T.$$typeof===yi&&Yy(T)===R.type){r(y,R.sibling),w=i(R,S.props),w.ref=ha(y,R,S),w.return=y,y=w;break e}r(y,R);break}else t(y,R);R=R.sibling}S.type===Xo?(w=uo(S.props.children,y.mode,E,S.key),w.return=y,y=w):(E=qc(S.type,S.key,S.props,null,y.mode,E),E.ref=ha(y,w,S),E.return=y,y=E)}return a(y);case Ko:e:{for(R=S.key;w!==null;){if(w.key===R)if(w.tag===4&&w.stateNode.containerInfo===S.containerInfo&&w.stateNode.implementation===S.implementation){r(y,w.sibling),w=i(w,S.children||[]),w.return=y,y=w;break e}else{r(y,w);break}else t(y,w);w=w.sibling}w=ch(S,y.mode,E),w.return=y,y=w}return a(y);case yi:return R=S._init,j(y,w,R(S._payload),E)}if(ja(S))return C(y,w,S,E);if(la(S))return D(y,w,S,E);mc(y,S)}return typeof S=="string"&&S!==""||typeof S=="number"?(S=""+S,w!==null&&w.tag===6?(r(y,w.sibling),w=i(w,S),w.return=y,y=w):(r(y,w),w=lh(S,y.mode,E),w.return=y,y=w),a(y)):r(y,w)}return j}var Ds=Yx(!0),Hx=Yx(!1),El={},vn=Wi(El),il=Wi(El),ol=Wi(El);function oo(e){if(e===El)throw Error(V(174));return e}function M0(e,t){switch(Ve(ol,t),Ve(il,e),Ve(vn,El),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Im(null,"");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Im(t,e)}Ge(vn),Ve(vn,t)}function js(){Ge(vn),Ge(il),Ge(ol)}function Vx(e){oo(ol.current);var t=oo(vn.current),r=Im(t,e.type);t!==r&&(Ve(il,e),Ve(vn,r))}function L0(e){il.current===e&&(Ge(vn),Ge(il))}var nt=Wi(0);function bu(e){for(var t=e;t!==null;){if(t.tag===13){var r=t.memoizedState;if(r!==null&&(r=r.dehydrated,r===null||r.data==="$?"||r.data==="$!"))return t}else if(t.tag===19&&t.memoizedProps.revealOrder!==void 0){if(t.flags&128)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var rh=[];function I0(){for(var e=0;er?r:4,e(!0);var n=nh.transition;nh.transition={};try{e(!1),t()}finally{Le=r,nh.transition=n}}function n_(){return Pr().memoizedState}function kT(e,t,r){var n=Mi(e);if(r={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null},i_(e))o_(t,r);else if(r=Lx(e,t,r,n),r!==null){var i=Jt();qr(r,e,n,i),s_(r,t,n)}}function CT(e,t,r){var n=Mi(e),i={lane:n,action:r,hasEagerState:!1,eagerState:null,next:null};if(i_(e))o_(t,i);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var a=t.lastRenderedState,c=o(a,r);if(i.hasEagerState=!0,i.eagerState=c,Jr(c,a)){var d=t.interleaved;d===null?(i.next=i,O0(t)):(i.next=d.next,d.next=i),t.interleaved=i;return}}catch{}finally{}r=Lx(e,t,i,n),r!==null&&(i=Jt(),qr(r,e,n,i),s_(r,t,n))}}function i_(e){var t=e.alternate;return e===it||t!==null&&t===it}function o_(e,t){Ia=ku=!0;var r=e.pending;r===null?t.next=t:(t.next=r.next,r.next=t),e.pending=t}function s_(e,t,r){if(r&4194240){var n=t.lanes;n&=e.pendingLanes,r|=n,t.lanes=r,y0(e,r)}}var Cu={readContext:Or,useCallback:Ht,useContext:Ht,useEffect:Ht,useImperativeHandle:Ht,useInsertionEffect:Ht,useLayoutEffect:Ht,useMemo:Ht,useReducer:Ht,useRef:Ht,useState:Ht,useDebugValue:Ht,useDeferredValue:Ht,useTransition:Ht,useMutableSource:Ht,useSyncExternalStore:Ht,useId:Ht,unstable_isNewReconciler:!1},DT={readContext:Or,useCallback:function(e,t){return hn().memoizedState=[e,t===void 0?null:t],e},useContext:Or,useEffect:Vy,useImperativeHandle:function(e,t,r){return r=r!=null?r.concat([e]):null,Gc(4194308,4,Zx.bind(null,t,e),r)},useLayoutEffect:function(e,t){return Gc(4194308,4,e,t)},useInsertionEffect:function(e,t){return Gc(4,2,e,t)},useMemo:function(e,t){var r=hn();return t=t===void 0?null:t,e=e(),r.memoizedState=[e,t],e},useReducer:function(e,t,r){var n=hn();return t=r!==void 0?r(t):t,n.memoizedState=n.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},n.queue=e,e=e.dispatch=kT.bind(null,it,e),[n.memoizedState,e]},useRef:function(e){var t=hn();return e={current:e},t.memoizedState=e},useState:Hy,useDebugValue:V0,useDeferredValue:function(e){return hn().memoizedState=e},useTransition:function(){var e=Hy(!1),t=e[0];return e=bT.bind(null,e[1]),hn().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,r){var n=it,i=hn();if(et){if(r===void 0)throw Error(V(407));r=r()}else{if(r=t(),Pt===null)throw Error(V(349));vo&30||$x(n,t,r)}i.memoizedState=r;var o={value:r,getSnapshot:t};return i.queue=o,Vy(Wx.bind(null,n,o,e),[e]),n.flags|=2048,ll(9,Bx.bind(null,n,o,r,t),void 0,null),r},useId:function(){var e=hn(),t=Pt.identifierPrefix;if(et){var r=Wn,n=Bn;r=(n&~(1<<32-Qr(n)-1)).toString(32)+r,t=":"+t+"R"+r,r=sl++,0<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=a.createElement(r,{is:n.is}):(e=a.createElement(r),r==="select"&&(a=e,n.multiple?a.multiple=!0:n.size&&(a.size=n.size))):e=a.createElementNS(e,r),e[mn]=t,e[nl]=n,p_(e,t,!1,!1),t.stateNode=e;e:{switch(a=zm(r,n),r){case"dialog":Be("cancel",e),Be("close",e),i=n;break;case"iframe":case"object":case"embed":Be("load",e),i=n;break;case"video":case"audio":for(i=0;iAs&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304)}else{if(!n)if(e=bu(a),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ma(o,!0),o.tail===null&&o.tailMode==="hidden"&&!a.alternate&&!et)return Ft(t),null}else 2*ft()-o.renderingStartTime>As&&r!==1073741824&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(r=o.last,r!==null?r.sibling=a:t.child=a,o.last=a)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=ft(),t.sibling=null,r=nt.current,Fe(nt,n?r&1|2:r&1),t):(Ft(t),null);case 22:case 23:return G0(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?gr&1073741824&&(Ft(t),t.subtreeFlags&6&&(t.flags|=8192)):Ft(t),null;case 24:return null;case 25:return null}throw Error(F(156,t.tag))}function MT(e,t){switch(j0(t),t.tag){case 1:return fr(t.type)&&gu(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return js(),Ge(dr),Ge(Bt),I0(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return L0(t),null;case 13:if(Ge(nt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(F(340));Cs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(nt),null;case 4:return js(),null;case 10:return R0(t.type._context),null;case 22:case 23:return G0(),null;case 24:return null;default:return null}}var gc=!1,Ut=!1,LT=typeof WeakSet=="function"?WeakSet:Set,Z=null;function is(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){at(e,t,n)}else r.current=null}function dp(e,t,r){try{r()}catch(n){at(e,t,n)}}var Qy=!1;function IT(e,t){if(Km=fu,e=_2(),C0(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{r.nodeType,o.nodeType}catch{r=null;break e}var a=0,c=-1,d=-1,h=0,g=0,v=e,_=null;t:for(;;){for(var b;v!==r||i!==0&&v.nodeType!==3||(c=a+i),v!==o||n!==0&&v.nodeType!==3||(d=a+n),v.nodeType===3&&(a+=v.nodeValue.length),(b=v.firstChild)!==null;)_=v,v=b;for(;;){if(v===e)break t;if(_===r&&++h===i&&(c=a),_===o&&++g===n&&(d=a),(b=v.nextSibling)!==null)break;v=_,_=v.parentNode}v=b}r=c===-1||d===-1?null:{start:c,end:d}}else r=null}r=r||{start:0,end:0}}else r=null;for(Xm={focusedElem:e,selectionRange:r},fu=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var k=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(k!==null){var D=k.memoizedProps,j=k.memoizedState,y=t.stateNode,w=y.getSnapshotBeforeUpdate(t.elementType===t.type?D:$r(t.type,D),j);y.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(F(163))}}catch(E){at(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return k=Qy,Qy=!1,k}function Na(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&dp(t,r,o)}i=i.next}while(i!==n)}}function hd(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function fp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function y_(e){var t=e.alternate;t!==null&&(e.alternate=null,y_(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[mn],delete t[nl],delete t[Zm],delete t[yT],delete t[wT])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function w_(e){return e.tag===5||e.tag===3||e.tag===4}function qy(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||w_(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function hp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=pu));else if(n!==4&&(e=e.child,e!==null))for(hp(e,t,r),e=e.sibling;e!==null;)hp(e,t,r),e=e.sibling}function mp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(mp(e,t,r),e=e.sibling;e!==null;)mp(e,t,r),e=e.sibling}var Lt=null,Wr=!1;function gi(e,t,r){for(r=r.child;r!==null;)x_(e,t,r),r=r.sibling}function x_(e,t,r){if(gn&&typeof gn.onCommitFiberUnmount=="function")try{gn.onCommitFiberUnmount(od,r)}catch{}switch(r.tag){case 5:Ut||is(r,t);case 6:var n=Lt,i=Wr;Lt=null,gi(e,t,r),Lt=n,Wr=i,Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Lt.removeChild(r.stateNode));break;case 18:Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?eh(e.parentNode,r):e.nodeType===1&&eh(e,r),Za(e)):eh(Lt,r.stateNode));break;case 4:n=Lt,i=Wr,Lt=r.stateNode.containerInfo,Wr=!0,gi(e,t,r),Lt=n,Wr=i;break;case 0:case 11:case 14:case 15:if(!Ut&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var o=i,a=o.destroy;o=o.tag,a!==void 0&&(o&2||o&4)&&dp(r,t,a),i=i.next}while(i!==n)}gi(e,t,r);break;case 1:if(!Ut&&(is(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(c){at(r,t,c)}gi(e,t,r);break;case 21:gi(e,t,r);break;case 22:r.mode&1?(Ut=(n=Ut)||r.memoizedState!==null,gi(e,t,r),Ut=n):gi(e,t,r);break;default:gi(e,t,r)}}function Zy(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new LT),t.forEach(function(n){var i=BT.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function Ur(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=a),n&=~o}if(n=i,n=ft()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*zT(n/1960))-n,10e?16:e,Ci===null)var n=!1;else{if(e=Ci,Ci=null,Eu=0,je&6)throw Error(F(331));var i=je;for(je|=4,Z=e.current;Z!==null;){var o=Z,a=o.child;if(Z.flags&16){var c=o.deletions;if(c!==null){for(var d=0;dft()-B0?co(e,0):$0|=r),hr(e,t)}function E_(e,t){t===0&&(e.mode&1?(t=ac,ac<<=1,!(ac&130023424)&&(ac=4194304)):t=1);var r=Jt();e=ei(e,t),e!==null&&(Cl(e,t,r),hr(e,r))}function $T(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),E_(e,r)}function BT(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(F(314))}n!==null&&n.delete(t),E_(e,r)}var A_;A_=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||dr.current)ur=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return ur=!1,OT(e,t,r);ur=!!(e.flags&131072)}else ur=!1,et&&t.flags&1048576&&O2(t,wu,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Kc(e,t),e=t.pendingProps;var i=ks(t,Bt.current);ms(t,r),i=z0(null,t,n,e,i,r);var o=Y0();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,fr(n)?(o=!0,vu(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,P0(t),i.updater=dd,t.stateNode=i,i._reactInternals=t,ip(t,n,e,r),t=ap(null,t,n,!0,o,r)):(t.tag=0,et&&o&&D0(t),qt(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(Kc(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=GT(n),e=$r(n,e),i){case 0:t=sp(null,t,n,e,r);break e;case 1:t=Gy(null,t,n,e,r);break e;case 11:t=By(null,t,n,e,r);break e;case 14:t=Wy(null,t,n,$r(n.type,e),r);break e}throw Error(F(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),sp(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Gy(e,t,n,i,r);case 3:e:{if(f_(t),e===null)throw Error(F(387));n=t.pendingProps,o=t.memoizedState,i=o.element,I2(e,t),Su(t,n,null,r);var a=t.memoizedState;if(n=a.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=Es(Error(F(423)),t),t=Ky(e,t,n,r,i);break e}else if(n!==i){i=Es(Error(F(424)),t),t=Ky(e,t,n,r,i);break e}else for(yr=Ri(t.stateNode.containerInfo.firstChild),wr=t,et=!0,Gr=null,r=H2(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(Cs(),n===i){t=ti(e,t,r);break e}qt(e,t,n,r)}t=t.child}return t;case 5:return F2(t),e===null&&tp(t),n=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,a=i.children,Qm(n,i)?a=null:o!==null&&Qm(n,o)&&(t.flags|=32),d_(e,t),qt(e,t,a,r),t.child;case 6:return e===null&&tp(t),null;case 13:return h_(e,t,r);case 4:return M0(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=Ds(t,null,n,r):qt(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),By(e,t,n,i,r);case 7:return qt(e,t,t.pendingProps,r),t.child;case 8:return qt(e,t,t.pendingProps.children,r),t.child;case 12:return qt(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,o=t.memoizedProps,a=i.value,Fe(xu,n._currentValue),n._currentValue=a,o!==null)if(Jr(o.value,a)){if(o.children===i.children&&!dr.current){t=ti(e,t,r);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){a=o.child;for(var d=c.firstContext;d!==null;){if(d.context===n){if(o.tag===1){d=Xn(-1,r&-r),d.tag=2;var h=o.updateQueue;if(h!==null){h=h.shared;var g=h.pending;g===null?d.next=d:(d.next=g.next,g.next=d),h.pending=d}}o.lanes|=r,d=o.alternate,d!==null&&(d.lanes|=r),rp(o.return,r,t),c.lanes|=r;break}d=d.next}}else if(o.tag===10)a=o.type===t.type?null:o.child;else if(o.tag===18){if(a=o.return,a===null)throw Error(F(341));a.lanes|=r,c=a.alternate,c!==null&&(c.lanes|=r),rp(a,r,t),a=o.sibling}else a=o.child;if(a!==null)a.return=o;else for(a=o;a!==null;){if(a===t){a=null;break}if(o=a.sibling,o!==null){o.return=a.return,a=o;break}a=a.return}o=a}qt(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,ms(t,r),i=Or(i),n=n(i),t.flags|=1,qt(e,t,n,r),t.child;case 14:return n=t.type,i=$r(n,t.pendingProps),i=$r(n.type,i),Wy(e,t,n,i,r);case 15:return c_(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Kc(e,t),t.tag=1,fr(n)?(e=!0,vu(t)):e=!1,ms(t,r),z2(t,n,i),ip(t,n,i,r),ap(null,t,n,!0,e,r);case 19:return m_(e,t,r);case 22:return u_(e,t,r)}throw Error(F(156,t.tag))};function T_(e,t){return r2(e,t)}function WT(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Tr(e,t,r,n){return new WT(e,t,r,n)}function X0(e){return e=e.prototype,!(!e||!e.isReactComponent)}function GT(e){if(typeof e=="function")return X0(e)?1:0;if(e!=null){if(e=e.$$typeof,e===m0)return 11;if(e===p0)return 14}return 2}function Li(e,t){var r=e.alternate;return r===null?(r=Tr(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function qc(e,t,r,n,i,o){var a=2;if(n=e,typeof e=="function")X0(e)&&(a=1);else if(typeof e=="string")a=5;else e:switch(e){case Xo:return uo(r.children,i,o,t);case h0:a=8,i|=8;break;case Em:return e=Tr(12,r,t,i|2),e.elementType=Em,e.lanes=o,e;case Am:return e=Tr(13,r,t,i),e.elementType=Am,e.lanes=o,e;case Tm:return e=Tr(19,r,t,i),e.elementType=Tm,e.lanes=o,e;case Yx:return pd(r,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Nx:a=10;break e;case zx:a=9;break e;case m0:a=11;break e;case p0:a=14;break e;case yi:a=16,n=null;break e}throw Error(F(130,e==null?e:typeof e,""))}return t=Tr(a,r,t,i),t.elementType=e,t.type=n,t.lanes=o,t}function uo(e,t,r,n){return e=Tr(7,e,n,t),e.lanes=r,e}function pd(e,t,r,n){return e=Tr(22,e,n,t),e.elementType=Yx,e.lanes=r,e.stateNode={isHidden:!1},e}function lh(e,t,r){return e=Tr(6,e,null,t),e.lanes=r,e}function ch(e,t,r){return t=Tr(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function KT(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Uf(0),this.expirationTimes=Uf(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Uf(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function Q0(e,t,r,n,i,o,a,c,d){return e=new KT(e,t,r,c,d),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Tr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},P0(o),e}function XT(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}t(),e.exports=Sr})(QE);var s1=su;Cm.createRoot=s1.createRoot,Cm.hydrateRoot=s1.hydrateRoot;/** +`+o.stack}return{value:e,source:t,stack:i,digest:null}}function sh(e,t,r){return{value:e,source:null,stack:r??null,digest:t??null}}function op(e,t){try{console.error(t.value)}catch(r){setTimeout(function(){throw r})}}var AT=typeof WeakMap=="function"?WeakMap:Map;function a_(e,t,r){r=Xn(-1,r),r.tag=3,r.payload={element:null};var n=t.value;return r.callback=function(){ju||(ju=!0,pp=n),op(e,t)},r}function l_(e,t,r){r=Xn(-1,r),r.tag=3;var n=e.type.getDerivedStateFromError;if(typeof n=="function"){var i=t.value;r.payload=function(){return n(i)},r.callback=function(){op(e,t)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch=="function"&&(r.callback=function(){op(e,t),typeof n!="function"&&(Pi===null?Pi=new Set([this]):Pi.add(this));var a=t.stack;this.componentDidCatch(t.value,{componentStack:a!==null?a:""})}),r}function Fy(e,t,r){var n=e.pingCache;if(n===null){n=e.pingCache=new AT;var i=new Set;n.set(t,i)}else i=n.get(t),i===void 0&&(i=new Set,n.set(t,i));i.has(r)||(i.add(r),e=UT.bind(null,e,t,r),t.then(e,e))}function Uy(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function $y(e,t,r,n,i){return e.mode&1?(e.flags|=65536,e.lanes=i,e):(e===t?e.flags|=65536:(e.flags|=128,r.flags|=131072,r.flags&=-52805,r.tag===1&&(r.alternate===null?r.tag=17:(t=Xn(-1,1),t.tag=2,Oi(r,t,1))),r.lanes|=1),e)}var TT=ii.ReactCurrentOwner,ur=!1;function qt(e,t,r,n){t.child=e===null?Hx(t,null,r,n):Ds(t,e.child,r,n)}function By(e,t,r,n,i){r=r.render;var o=t.ref;return ms(t,i),n=z0(e,t,r,n,o,i),r=Y0(),e!==null&&!ur?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,ti(e,t,i)):(et&&r&&D0(t),t.flags|=1,qt(e,t,n,i),t.child)}function Wy(e,t,r,n,i){if(e===null){var o=r.type;return typeof o=="function"&&!X0(o)&&o.defaultProps===void 0&&r.compare===null&&r.defaultProps===void 0?(t.tag=15,t.type=o,c_(e,t,o,n,i)):(e=qc(r.type,null,n,t,t.mode,i),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,!(e.lanes&i)){var a=o.memoizedProps;if(r=r.compare,r=r!==null?r:el,r(a,n)&&e.ref===t.ref)return ti(e,t,i)}return t.flags|=1,e=Li(o,n),e.ref=t.ref,e.return=t,t.child=e}function c_(e,t,r,n,i){if(e!==null){var o=e.memoizedProps;if(el(o,n)&&e.ref===t.ref)if(ur=!1,t.pendingProps=n=o,(e.lanes&i)!==0)e.flags&131072&&(ur=!0);else return t.lanes=e.lanes,ti(e,t,i)}return sp(e,t,r,n,i)}function u_(e,t,r){var n=t.pendingProps,i=n.children,o=e!==null?e.memoizedState:null;if(n.mode==="hidden")if(!(t.mode&1))t.memoizedState={baseLanes:0,cachePool:null,transitions:null},Ve(os,gr),gr|=r;else{if(!(r&1073741824))return e=o!==null?o.baseLanes|r:r,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,Ve(os,gr),gr|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},n=o!==null?o.baseLanes:r,Ve(os,gr),gr|=n}else o!==null?(n=o.baseLanes|r,t.memoizedState=null):n=r,Ve(os,gr),gr|=n;return qt(e,t,i,r),t.child}function d_(e,t){var r=t.ref;(e===null&&r!==null||e!==null&&e.ref!==r)&&(t.flags|=512,t.flags|=2097152)}function sp(e,t,r,n,i){var o=fr(r)?po:Bt.current;return o=ks(t,o),ms(t,i),r=z0(e,t,r,n,o,i),n=Y0(),e!==null&&!ur?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i,ti(e,t,i)):(et&&n&&D0(t),t.flags|=1,qt(e,t,r,i),t.child)}function Gy(e,t,r,n,i){if(fr(r)){var o=!0;vu(t)}else o=!1;if(ms(t,i),t.stateNode===null)Kc(e,t),zx(t,r,n),ip(t,r,n,i),n=!0;else if(e===null){var a=t.stateNode,c=t.memoizedProps;a.props=c;var d=a.context,h=r.contextType;typeof h=="object"&&h!==null?h=Or(h):(h=fr(r)?po:Bt.current,h=ks(t,h));var g=r.getDerivedStateFromProps,v=typeof g=="function"||typeof a.getSnapshotBeforeUpdate=="function";v||typeof a.UNSAFE_componentWillReceiveProps!="function"&&typeof a.componentWillReceiveProps!="function"||(c!==n||d!==h)&&zy(t,a,n,h),wi=!1;var _=t.memoizedState;a.state=_,Su(t,n,a,i),d=t.memoizedState,c!==n||_!==d||dr.current||wi?(typeof g=="function"&&(np(t,r,g,n),d=t.memoizedState),(c=wi||Ny(t,r,c,n,_,d,h))?(v||typeof a.UNSAFE_componentWillMount!="function"&&typeof a.componentWillMount!="function"||(typeof a.componentWillMount=="function"&&a.componentWillMount(),typeof a.UNSAFE_componentWillMount=="function"&&a.UNSAFE_componentWillMount()),typeof a.componentDidMount=="function"&&(t.flags|=4194308)):(typeof a.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=n,t.memoizedState=d),a.props=n,a.state=d,a.context=h,n=c):(typeof a.componentDidMount=="function"&&(t.flags|=4194308),n=!1)}else{a=t.stateNode,Ix(e,t),c=t.memoizedProps,h=t.type===t.elementType?c:$r(t.type,c),a.props=h,v=t.pendingProps,_=a.context,d=r.contextType,typeof d=="object"&&d!==null?d=Or(d):(d=fr(r)?po:Bt.current,d=ks(t,d));var k=r.getDerivedStateFromProps;(g=typeof k=="function"||typeof a.getSnapshotBeforeUpdate=="function")||typeof a.UNSAFE_componentWillReceiveProps!="function"&&typeof a.componentWillReceiveProps!="function"||(c!==v||_!==d)&&zy(t,a,n,d),wi=!1,_=t.memoizedState,a.state=_,Su(t,n,a,i);var C=t.memoizedState;c!==v||_!==C||dr.current||wi?(typeof k=="function"&&(np(t,r,k,n),C=t.memoizedState),(h=wi||Ny(t,r,h,n,_,C,d)||!1)?(g||typeof a.UNSAFE_componentWillUpdate!="function"&&typeof a.componentWillUpdate!="function"||(typeof a.componentWillUpdate=="function"&&a.componentWillUpdate(n,C,d),typeof a.UNSAFE_componentWillUpdate=="function"&&a.UNSAFE_componentWillUpdate(n,C,d)),typeof a.componentDidUpdate=="function"&&(t.flags|=4),typeof a.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof a.componentDidUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof a.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),t.memoizedProps=n,t.memoizedState=C),a.props=n,a.state=C,a.context=d,n=h):(typeof a.componentDidUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=4),typeof a.getSnapshotBeforeUpdate!="function"||c===e.memoizedProps&&_===e.memoizedState||(t.flags|=1024),n=!1)}return ap(e,t,r,n,o,i)}function ap(e,t,r,n,i,o){d_(e,t);var a=(t.flags&128)!==0;if(!n&&!a)return i&&Oy(t,r,!1),ti(e,t,o);n=t.stateNode,TT.current=t;var c=a&&typeof r.getDerivedStateFromError!="function"?null:n.render();return t.flags|=1,e!==null&&a?(t.child=Ds(t,e.child,null,o),t.child=Ds(t,null,c,o)):qt(e,t,c,o),t.memoizedState=n.state,i&&Oy(t,r,!0),t.child}function f_(e){var t=e.stateNode;t.pendingContext?Ry(e,t.pendingContext,t.pendingContext!==t.context):t.context&&Ry(e,t.context,!1),M0(e,t.containerInfo)}function Ky(e,t,r,n,i){return Cs(),E0(i),t.flags|=256,qt(e,t,r,n),t.child}var lp={dehydrated:null,treeContext:null,retryLane:0};function cp(e){return{baseLanes:e,cachePool:null,transitions:null}}function h_(e,t,r){var n=t.pendingProps,i=nt.current,o=!1,a=(t.flags&128)!==0,c;if((c=a)||(c=e!==null&&e.memoizedState===null?!1:(i&2)!==0),c?(o=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(i|=1),Ve(nt,i&1),e===null)return tp(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?(t.mode&1?e.data==="$!"?t.lanes=8:t.lanes=1073741824:t.lanes=1,null):(a=n.children,e=n.fallback,o?(n=t.mode,o=t.child,a={mode:"hidden",children:a},!(n&1)&&o!==null?(o.childLanes=0,o.pendingProps=a):o=pd(a,n,0,null),e=uo(e,n,r,null),o.return=t,e.return=t,o.sibling=e,t.child=o,t.child.memoizedState=cp(r),t.memoizedState=lp,e):F0(t,a));if(i=e.memoizedState,i!==null&&(c=i.dehydrated,c!==null))return RT(e,t,a,n,c,i,r);if(o){o=n.fallback,a=t.mode,i=e.child,c=i.sibling;var d={mode:"hidden",children:n.children};return!(a&1)&&t.child!==i?(n=t.child,n.childLanes=0,n.pendingProps=d,t.deletions=null):(n=Li(i,d),n.subtreeFlags=i.subtreeFlags&14680064),c!==null?o=Li(c,o):(o=uo(o,a,r,null),o.flags|=2),o.return=t,n.return=t,n.sibling=o,t.child=n,n=o,o=t.child,a=e.child.memoizedState,a=a===null?cp(r):{baseLanes:a.baseLanes|r,cachePool:null,transitions:a.transitions},o.memoizedState=a,o.childLanes=e.childLanes&~r,t.memoizedState=lp,n}return o=e.child,e=o.sibling,n=Li(o,{mode:"visible",children:n.children}),!(t.mode&1)&&(n.lanes=r),n.return=t,n.sibling=null,e!==null&&(r=t.deletions,r===null?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n}function F0(e,t){return t=pd({mode:"visible",children:t},e.mode,0,null),t.return=e,e.child=t}function pc(e,t,r,n){return n!==null&&E0(n),Ds(t,e.child,null,r),e=F0(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function RT(e,t,r,n,i,o,a){if(r)return t.flags&256?(t.flags&=-257,n=sh(Error(V(422))),pc(e,t,a,n)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(o=n.fallback,i=t.mode,n=pd({mode:"visible",children:n.children},i,0,null),o=uo(o,i,a,null),o.flags|=2,n.return=t,o.return=t,n.sibling=o,t.child=n,t.mode&1&&Ds(t,e.child,null,a),t.child.memoizedState=cp(a),t.memoizedState=lp,o);if(!(t.mode&1))return pc(e,t,a,null);if(i.data==="$!"){if(n=i.nextSibling&&i.nextSibling.dataset,n)var c=n.dgst;return n=c,o=Error(V(419)),n=sh(o,n,void 0),pc(e,t,a,n)}if(c=(a&e.childLanes)!==0,ur||c){if(n=Pt,n!==null){switch(a&-a){case 4:i=2;break;case 16:i=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:i=32;break;case 536870912:i=268435456;break;default:i=0}i=i&(n.suspendedLanes|a)?0:i,i!==0&&i!==o.retryLane&&(o.retryLane=i,ei(e,i),qr(n,e,i,-1))}return K0(),n=sh(Error(V(421))),pc(e,t,a,n)}return i.data==="$?"?(t.flags|=128,t.child=e.child,t=$T.bind(null,e),i._reactRetry=t,null):(e=o.treeContext,yr=Ri(i.nextSibling),wr=t,et=!0,Gr=null,e!==null&&(jr[Er++]=Bn,jr[Er++]=Wn,jr[Er++]=go,Bn=e.id,Wn=e.overflow,go=t),t=F0(t,n.children),t.flags|=4096,t)}function Xy(e,t,r){e.lanes|=t;var n=e.alternate;n!==null&&(n.lanes|=t),rp(e.return,t,r)}function ah(e,t,r,n,i){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:n,tail:r,tailMode:i}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=n,o.tail=r,o.tailMode=i)}function m_(e,t,r){var n=t.pendingProps,i=n.revealOrder,o=n.tail;if(qt(e,t,n.children,r),n=nt.current,n&2)n=n&1|2,t.flags|=128;else{if(e!==null&&e.flags&128)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Xy(e,r,t);else if(e.tag===19)Xy(e,r,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}n&=1}if(Ve(nt,n),!(t.mode&1))t.memoizedState=null;else switch(i){case"forwards":for(r=t.child,i=null;r!==null;)e=r.alternate,e!==null&&bu(e)===null&&(i=r),r=r.sibling;r=i,r===null?(i=t.child,t.child=null):(i=r.sibling,r.sibling=null),ah(t,!1,i,r,o);break;case"backwards":for(r=null,i=t.child,t.child=null;i!==null;){if(e=i.alternate,e!==null&&bu(e)===null){t.child=i;break}e=i.sibling,i.sibling=r,r=i,i=e}ah(t,!0,r,null,o);break;case"together":ah(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Kc(e,t){!(t.mode&1)&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function ti(e,t,r){if(e!==null&&(t.dependencies=e.dependencies),yo|=t.lanes,!(r&t.childLanes))return null;if(e!==null&&t.child!==e.child)throw Error(V(153));if(t.child!==null){for(e=t.child,r=Li(e,e.pendingProps),t.child=r,r.return=t;e.sibling!==null;)e=e.sibling,r=r.sibling=Li(e,e.pendingProps),r.return=t;r.sibling=null}return t.child}function OT(e,t,r){switch(t.tag){case 3:f_(t),Cs();break;case 5:Vx(t);break;case 1:fr(t.type)&&vu(t);break;case 4:M0(t,t.stateNode.containerInfo);break;case 10:var n=t.type._context,i=t.memoizedProps.value;Ve(xu,n._currentValue),n._currentValue=i;break;case 13:if(n=t.memoizedState,n!==null)return n.dehydrated!==null?(Ve(nt,nt.current&1),t.flags|=128,null):r&t.child.childLanes?h_(e,t,r):(Ve(nt,nt.current&1),e=ti(e,t,r),e!==null?e.sibling:null);Ve(nt,nt.current&1);break;case 19:if(n=(r&t.childLanes)!==0,e.flags&128){if(n)return m_(e,t,r);t.flags|=128}if(i=t.memoizedState,i!==null&&(i.rendering=null,i.tail=null,i.lastEffect=null),Ve(nt,nt.current),n)break;return null;case 22:case 23:return t.lanes=0,u_(e,t,r)}return ti(e,t,r)}var p_,up,g_,v_;p_=function(e,t){for(var r=t.child;r!==null;){if(r.tag===5||r.tag===6)e.appendChild(r.stateNode);else if(r.tag!==4&&r.child!==null){r.child.return=r,r=r.child;continue}if(r===t)break;for(;r.sibling===null;){if(r.return===null||r.return===t)return;r=r.return}r.sibling.return=r.return,r=r.sibling}};up=function(){};g_=function(e,t,r,n){var i=e.memoizedProps;if(i!==n){e=t.stateNode,oo(vn.current);var o=null;switch(r){case"input":i=Om(e,i),n=Om(e,n),o=[];break;case"select":i=ot({},i,{value:void 0}),n=ot({},n,{value:void 0}),o=[];break;case"textarea":i=Lm(e,i),n=Lm(e,n),o=[];break;default:typeof i.onClick!="function"&&typeof n.onClick=="function"&&(e.onclick=pu)}Nm(r,n);var a;r=null;for(h in i)if(!n.hasOwnProperty(h)&&i.hasOwnProperty(h)&&i[h]!=null)if(h==="style"){var c=i[h];for(a in c)c.hasOwnProperty(a)&&(r||(r={}),r[a]="")}else h!=="dangerouslySetInnerHTML"&&h!=="children"&&h!=="suppressContentEditableWarning"&&h!=="suppressHydrationWarning"&&h!=="autoFocus"&&(Ga.hasOwnProperty(h)?o||(o=[]):(o=o||[]).push(h,null));for(h in n){var d=n[h];if(c=i!=null?i[h]:void 0,n.hasOwnProperty(h)&&d!==c&&(d!=null||c!=null))if(h==="style")if(c){for(a in c)!c.hasOwnProperty(a)||d&&d.hasOwnProperty(a)||(r||(r={}),r[a]="");for(a in d)d.hasOwnProperty(a)&&c[a]!==d[a]&&(r||(r={}),r[a]=d[a])}else r||(o||(o=[]),o.push(h,r)),r=d;else h==="dangerouslySetInnerHTML"?(d=d?d.__html:void 0,c=c?c.__html:void 0,d!=null&&c!==d&&(o=o||[]).push(h,d)):h==="children"?typeof d!="string"&&typeof d!="number"||(o=o||[]).push(h,""+d):h!=="suppressContentEditableWarning"&&h!=="suppressHydrationWarning"&&(Ga.hasOwnProperty(h)?(d!=null&&h==="onScroll"&&Be("scroll",e),o||c===d||(o=[])):(o=o||[]).push(h,d))}r&&(o=o||[]).push("style",r);var h=o;(t.updateQueue=h)&&(t.flags|=4)}};v_=function(e,t,r,n){r!==n&&(t.flags|=4)};function ma(e,t){if(!et)switch(e.tailMode){case"hidden":t=e.tail;for(var r=null;t!==null;)t.alternate!==null&&(r=t),t=t.sibling;r===null?e.tail=null:r.sibling=null;break;case"collapsed":r=e.tail;for(var n=null;r!==null;)r.alternate!==null&&(n=r),r=r.sibling;n===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:n.sibling=null}}function Vt(e){var t=e.alternate!==null&&e.alternate.child===e.child,r=0,n=0;if(t)for(var i=e.child;i!==null;)r|=i.lanes|i.childLanes,n|=i.subtreeFlags&14680064,n|=i.flags&14680064,i.return=e,i=i.sibling;else for(i=e.child;i!==null;)r|=i.lanes|i.childLanes,n|=i.subtreeFlags,n|=i.flags,i.return=e,i=i.sibling;return e.subtreeFlags|=n,e.childLanes=r,t}function PT(e,t,r){var n=t.pendingProps;switch(j0(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Vt(t),null;case 1:return fr(t.type)&&gu(),Vt(t),null;case 3:return n=t.stateNode,js(),Ge(dr),Ge(Bt),I0(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),(e===null||e.child===null)&&(hc(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&!(t.flags&256)||(t.flags|=1024,Gr!==null&&(yp(Gr),Gr=null))),up(e,t),Vt(t),null;case 5:L0(t);var i=oo(ol.current);if(r=t.type,e!==null&&t.stateNode!=null)g_(e,t,r,n,i),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!n){if(t.stateNode===null)throw Error(V(166));return Vt(t),null}if(e=oo(vn.current),hc(t)){n=t.stateNode,r=t.type;var o=t.memoizedProps;switch(n[mn]=t,n[nl]=o,e=(t.mode&1)!==0,r){case"dialog":Be("cancel",n),Be("close",n);break;case"iframe":case"object":case"embed":Be("load",n);break;case"video":case"audio":for(i=0;i<\/script>",e=e.removeChild(e.firstChild)):typeof n.is=="string"?e=a.createElement(r,{is:n.is}):(e=a.createElement(r),r==="select"&&(a=e,n.multiple?a.multiple=!0:n.size&&(a.size=n.size))):e=a.createElementNS(e,r),e[mn]=t,e[nl]=n,p_(e,t,!1,!1),t.stateNode=e;e:{switch(a=zm(r,n),r){case"dialog":Be("cancel",e),Be("close",e),i=n;break;case"iframe":case"object":case"embed":Be("load",e),i=n;break;case"video":case"audio":for(i=0;iAs&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304)}else{if(!n)if(e=bu(a),e!==null){if(t.flags|=128,n=!0,r=e.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),ma(o,!0),o.tail===null&&o.tailMode==="hidden"&&!a.alternate&&!et)return Vt(t),null}else 2*ft()-o.renderingStartTime>As&&r!==1073741824&&(t.flags|=128,n=!0,ma(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(r=o.last,r!==null?r.sibling=a:t.child=a,o.last=a)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=ft(),t.sibling=null,r=nt.current,Ve(nt,n?r&1|2:r&1),t):(Vt(t),null);case 22:case 23:return G0(),n=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==n&&(t.flags|=8192),n&&t.mode&1?gr&1073741824&&(Vt(t),t.subtreeFlags&6&&(t.flags|=8192)):Vt(t),null;case 24:return null;case 25:return null}throw Error(V(156,t.tag))}function MT(e,t){switch(j0(t),t.tag){case 1:return fr(t.type)&&gu(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return js(),Ge(dr),Ge(Bt),I0(),e=t.flags,e&65536&&!(e&128)?(t.flags=e&-65537|128,t):null;case 5:return L0(t),null;case 13:if(Ge(nt),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(V(340));Cs()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Ge(nt),null;case 4:return js(),null;case 10:return R0(t.type._context),null;case 22:case 23:return G0(),null;case 24:return null;default:return null}}var gc=!1,Ut=!1,LT=typeof WeakSet=="function"?WeakSet:Set,Z=null;function is(e,t){var r=e.ref;if(r!==null)if(typeof r=="function")try{r(null)}catch(n){at(e,t,n)}else r.current=null}function dp(e,t,r){try{r()}catch(n){at(e,t,n)}}var Qy=!1;function IT(e,t){if(Km=fu,e=_x(),C0(e)){if("selectionStart"in e)var r={start:e.selectionStart,end:e.selectionEnd};else e:{r=(r=e.ownerDocument)&&r.defaultView||window;var n=r.getSelection&&r.getSelection();if(n&&n.rangeCount!==0){r=n.anchorNode;var i=n.anchorOffset,o=n.focusNode;n=n.focusOffset;try{r.nodeType,o.nodeType}catch{r=null;break e}var a=0,c=-1,d=-1,h=0,g=0,v=e,_=null;t:for(;;){for(var k;v!==r||i!==0&&v.nodeType!==3||(c=a+i),v!==o||n!==0&&v.nodeType!==3||(d=a+n),v.nodeType===3&&(a+=v.nodeValue.length),(k=v.firstChild)!==null;)_=v,v=k;for(;;){if(v===e)break t;if(_===r&&++h===i&&(c=a),_===o&&++g===n&&(d=a),(k=v.nextSibling)!==null)break;v=_,_=v.parentNode}v=k}r=c===-1||d===-1?null:{start:c,end:d}}else r=null}r=r||{start:0,end:0}}else r=null;for(Xm={focusedElem:e,selectionRange:r},fu=!1,Z=t;Z!==null;)if(t=Z,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,Z=e;else for(;Z!==null;){t=Z;try{var C=t.alternate;if(t.flags&1024)switch(t.tag){case 0:case 11:case 15:break;case 1:if(C!==null){var D=C.memoizedProps,j=C.memoizedState,y=t.stateNode,w=y.getSnapshotBeforeUpdate(t.elementType===t.type?D:$r(t.type,D),j);y.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var S=t.stateNode.containerInfo;S.nodeType===1?S.textContent="":S.nodeType===9&&S.documentElement&&S.removeChild(S.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(V(163))}}catch(E){at(t,t.return,E)}if(e=t.sibling,e!==null){e.return=t.return,Z=e;break}Z=t.return}return C=Qy,Qy=!1,C}function Na(e,t,r){var n=t.updateQueue;if(n=n!==null?n.lastEffect:null,n!==null){var i=n=n.next;do{if((i.tag&e)===e){var o=i.destroy;i.destroy=void 0,o!==void 0&&dp(t,r,o)}i=i.next}while(i!==n)}}function hd(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var r=t=t.next;do{if((r.tag&e)===e){var n=r.create;r.destroy=n()}r=r.next}while(r!==t)}}function fp(e){var t=e.ref;if(t!==null){var r=e.stateNode;switch(e.tag){case 5:e=r;break;default:e=r}typeof t=="function"?t(e):t.current=e}}function y_(e){var t=e.alternate;t!==null&&(e.alternate=null,y_(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[mn],delete t[nl],delete t[Zm],delete t[yT],delete t[wT])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function w_(e){return e.tag===5||e.tag===3||e.tag===4}function qy(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||w_(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function hp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.nodeType===8?r.parentNode.insertBefore(e,t):r.insertBefore(e,t):(r.nodeType===8?(t=r.parentNode,t.insertBefore(e,r)):(t=r,t.appendChild(e)),r=r._reactRootContainer,r!=null||t.onclick!==null||(t.onclick=pu));else if(n!==4&&(e=e.child,e!==null))for(hp(e,t,r),e=e.sibling;e!==null;)hp(e,t,r),e=e.sibling}function mp(e,t,r){var n=e.tag;if(n===5||n===6)e=e.stateNode,t?r.insertBefore(e,t):r.appendChild(e);else if(n!==4&&(e=e.child,e!==null))for(mp(e,t,r),e=e.sibling;e!==null;)mp(e,t,r),e=e.sibling}var Lt=null,Wr=!1;function gi(e,t,r){for(r=r.child;r!==null;)x_(e,t,r),r=r.sibling}function x_(e,t,r){if(gn&&typeof gn.onCommitFiberUnmount=="function")try{gn.onCommitFiberUnmount(od,r)}catch{}switch(r.tag){case 5:Ut||is(r,t);case 6:var n=Lt,i=Wr;Lt=null,gi(e,t,r),Lt=n,Wr=i,Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?e.parentNode.removeChild(r):e.removeChild(r)):Lt.removeChild(r.stateNode));break;case 18:Lt!==null&&(Wr?(e=Lt,r=r.stateNode,e.nodeType===8?eh(e.parentNode,r):e.nodeType===1&&eh(e,r),Za(e)):eh(Lt,r.stateNode));break;case 4:n=Lt,i=Wr,Lt=r.stateNode.containerInfo,Wr=!0,gi(e,t,r),Lt=n,Wr=i;break;case 0:case 11:case 14:case 15:if(!Ut&&(n=r.updateQueue,n!==null&&(n=n.lastEffect,n!==null))){i=n=n.next;do{var o=i,a=o.destroy;o=o.tag,a!==void 0&&(o&2||o&4)&&dp(r,t,a),i=i.next}while(i!==n)}gi(e,t,r);break;case 1:if(!Ut&&(is(r,t),n=r.stateNode,typeof n.componentWillUnmount=="function"))try{n.props=r.memoizedProps,n.state=r.memoizedState,n.componentWillUnmount()}catch(c){at(r,t,c)}gi(e,t,r);break;case 21:gi(e,t,r);break;case 22:r.mode&1?(Ut=(n=Ut)||r.memoizedState!==null,gi(e,t,r),Ut=n):gi(e,t,r);break;default:gi(e,t,r)}}function Zy(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var r=e.stateNode;r===null&&(r=e.stateNode=new LT),t.forEach(function(n){var i=BT.bind(null,e,n);r.has(n)||(r.add(n),n.then(i,i))})}}function Ur(e,t){var r=t.deletions;if(r!==null)for(var n=0;ni&&(i=a),n&=~o}if(n=i,n=ft()-n,n=(120>n?120:480>n?480:1080>n?1080:1920>n?1920:3e3>n?3e3:4320>n?4320:1960*zT(n/1960))-n,10e?16:e,Ci===null)var n=!1;else{if(e=Ci,Ci=null,Eu=0,je&6)throw Error(V(331));var i=je;for(je|=4,Z=e.current;Z!==null;){var o=Z,a=o.child;if(Z.flags&16){var c=o.deletions;if(c!==null){for(var d=0;dft()-B0?co(e,0):$0|=r),hr(e,t)}function E_(e,t){t===0&&(e.mode&1?(t=ac,ac<<=1,!(ac&130023424)&&(ac=4194304)):t=1);var r=Jt();e=ei(e,t),e!==null&&(Cl(e,t,r),hr(e,r))}function $T(e){var t=e.memoizedState,r=0;t!==null&&(r=t.retryLane),E_(e,r)}function BT(e,t){var r=0;switch(e.tag){case 13:var n=e.stateNode,i=e.memoizedState;i!==null&&(r=i.retryLane);break;case 19:n=e.stateNode;break;default:throw Error(V(314))}n!==null&&n.delete(t),E_(e,r)}var A_;A_=function(e,t,r){if(e!==null)if(e.memoizedProps!==t.pendingProps||dr.current)ur=!0;else{if(!(e.lanes&r)&&!(t.flags&128))return ur=!1,OT(e,t,r);ur=!!(e.flags&131072)}else ur=!1,et&&t.flags&1048576&&Ox(t,wu,t.index);switch(t.lanes=0,t.tag){case 2:var n=t.type;Kc(e,t),e=t.pendingProps;var i=ks(t,Bt.current);ms(t,r),i=z0(null,t,n,e,i,r);var o=Y0();return t.flags|=1,typeof i=="object"&&i!==null&&typeof i.render=="function"&&i.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,fr(n)?(o=!0,vu(t)):o=!1,t.memoizedState=i.state!==null&&i.state!==void 0?i.state:null,P0(t),i.updater=dd,t.stateNode=i,i._reactInternals=t,ip(t,n,e,r),t=ap(null,t,n,!0,o,r)):(t.tag=0,et&&o&&D0(t),qt(null,t,i,r),t=t.child),t;case 16:n=t.elementType;e:{switch(Kc(e,t),e=t.pendingProps,i=n._init,n=i(n._payload),t.type=n,i=t.tag=GT(n),e=$r(n,e),i){case 0:t=sp(null,t,n,e,r);break e;case 1:t=Gy(null,t,n,e,r);break e;case 11:t=By(null,t,n,e,r);break e;case 14:t=Wy(null,t,n,$r(n.type,e),r);break e}throw Error(V(306,n,""))}return t;case 0:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),sp(e,t,n,i,r);case 1:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Gy(e,t,n,i,r);case 3:e:{if(f_(t),e===null)throw Error(V(387));n=t.pendingProps,o=t.memoizedState,i=o.element,Ix(e,t),Su(t,n,null,r);var a=t.memoizedState;if(n=a.element,o.isDehydrated)if(o={element:n,isDehydrated:!1,cache:a.cache,pendingSuspenseBoundaries:a.pendingSuspenseBoundaries,transitions:a.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){i=Es(Error(V(423)),t),t=Ky(e,t,n,r,i);break e}else if(n!==i){i=Es(Error(V(424)),t),t=Ky(e,t,n,r,i);break e}else for(yr=Ri(t.stateNode.containerInfo.firstChild),wr=t,et=!0,Gr=null,r=Hx(t,null,n,r),t.child=r;r;)r.flags=r.flags&-3|4096,r=r.sibling;else{if(Cs(),n===i){t=ti(e,t,r);break e}qt(e,t,n,r)}t=t.child}return t;case 5:return Vx(t),e===null&&tp(t),n=t.type,i=t.pendingProps,o=e!==null?e.memoizedProps:null,a=i.children,Qm(n,i)?a=null:o!==null&&Qm(n,o)&&(t.flags|=32),d_(e,t),qt(e,t,a,r),t.child;case 6:return e===null&&tp(t),null;case 13:return h_(e,t,r);case 4:return M0(t,t.stateNode.containerInfo),n=t.pendingProps,e===null?t.child=Ds(t,null,n,r):qt(e,t,n,r),t.child;case 11:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),By(e,t,n,i,r);case 7:return qt(e,t,t.pendingProps,r),t.child;case 8:return qt(e,t,t.pendingProps.children,r),t.child;case 12:return qt(e,t,t.pendingProps.children,r),t.child;case 10:e:{if(n=t.type._context,i=t.pendingProps,o=t.memoizedProps,a=i.value,Ve(xu,n._currentValue),n._currentValue=a,o!==null)if(Jr(o.value,a)){if(o.children===i.children&&!dr.current){t=ti(e,t,r);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var c=o.dependencies;if(c!==null){a=o.child;for(var d=c.firstContext;d!==null;){if(d.context===n){if(o.tag===1){d=Xn(-1,r&-r),d.tag=2;var h=o.updateQueue;if(h!==null){h=h.shared;var g=h.pending;g===null?d.next=d:(d.next=g.next,g.next=d),h.pending=d}}o.lanes|=r,d=o.alternate,d!==null&&(d.lanes|=r),rp(o.return,r,t),c.lanes|=r;break}d=d.next}}else if(o.tag===10)a=o.type===t.type?null:o.child;else if(o.tag===18){if(a=o.return,a===null)throw Error(V(341));a.lanes|=r,c=a.alternate,c!==null&&(c.lanes|=r),rp(a,r,t),a=o.sibling}else a=o.child;if(a!==null)a.return=o;else for(a=o;a!==null;){if(a===t){a=null;break}if(o=a.sibling,o!==null){o.return=a.return,a=o;break}a=a.return}o=a}qt(e,t,i.children,r),t=t.child}return t;case 9:return i=t.type,n=t.pendingProps.children,ms(t,r),i=Or(i),n=n(i),t.flags|=1,qt(e,t,n,r),t.child;case 14:return n=t.type,i=$r(n,t.pendingProps),i=$r(n.type,i),Wy(e,t,n,i,r);case 15:return c_(e,t,t.type,t.pendingProps,r);case 17:return n=t.type,i=t.pendingProps,i=t.elementType===n?i:$r(n,i),Kc(e,t),t.tag=1,fr(n)?(e=!0,vu(t)):e=!1,ms(t,r),zx(t,n,i),ip(t,n,i,r),ap(null,t,n,!0,e,r);case 19:return m_(e,t,r);case 22:return u_(e,t,r)}throw Error(V(156,t.tag))};function T_(e,t){return rx(e,t)}function WT(e,t,r,n){this.tag=e,this.key=r,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=n,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Tr(e,t,r,n){return new WT(e,t,r,n)}function X0(e){return e=e.prototype,!(!e||!e.isReactComponent)}function GT(e){if(typeof e=="function")return X0(e)?1:0;if(e!=null){if(e=e.$$typeof,e===m0)return 11;if(e===p0)return 14}return 2}function Li(e,t){var r=e.alternate;return r===null?(r=Tr(e.tag,t,e.key,e.mode),r.elementType=e.elementType,r.type=e.type,r.stateNode=e.stateNode,r.alternate=e,e.alternate=r):(r.pendingProps=t,r.type=e.type,r.flags=0,r.subtreeFlags=0,r.deletions=null),r.flags=e.flags&14680064,r.childLanes=e.childLanes,r.lanes=e.lanes,r.child=e.child,r.memoizedProps=e.memoizedProps,r.memoizedState=e.memoizedState,r.updateQueue=e.updateQueue,t=e.dependencies,r.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},r.sibling=e.sibling,r.index=e.index,r.ref=e.ref,r}function qc(e,t,r,n,i,o){var a=2;if(n=e,typeof e=="function")X0(e)&&(a=1);else if(typeof e=="string")a=5;else e:switch(e){case Xo:return uo(r.children,i,o,t);case h0:a=8,i|=8;break;case Em:return e=Tr(12,r,t,i|2),e.elementType=Em,e.lanes=o,e;case Am:return e=Tr(13,r,t,i),e.elementType=Am,e.lanes=o,e;case Tm:return e=Tr(19,r,t,i),e.elementType=Tm,e.lanes=o,e;case Y2:return pd(r,i,o,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case N2:a=10;break e;case z2:a=9;break e;case m0:a=11;break e;case p0:a=14;break e;case yi:a=16,n=null;break e}throw Error(V(130,e==null?e:typeof e,""))}return t=Tr(a,r,t,i),t.elementType=e,t.type=n,t.lanes=o,t}function uo(e,t,r,n){return e=Tr(7,e,n,t),e.lanes=r,e}function pd(e,t,r,n){return e=Tr(22,e,n,t),e.elementType=Y2,e.lanes=r,e.stateNode={isHidden:!1},e}function lh(e,t,r){return e=Tr(6,e,null,t),e.lanes=r,e}function ch(e,t,r){return t=Tr(4,e.children!==null?e.children:[],e.key,t),t.lanes=r,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function KT(e,t,r,n,i){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Uf(0),this.expirationTimes=Uf(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Uf(0),this.identifierPrefix=n,this.onRecoverableError=i,this.mutableSourceEagerHydrationData=null}function Q0(e,t,r,n,i,o,a,c,d){return e=new KT(e,t,r,c,d),t===1?(t=1,o===!0&&(t|=8)):t=0,o=Tr(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:n,isDehydrated:r,cache:null,transitions:null,pendingSuspenseBoundaries:null},P0(o),e}function XT(e,t,r){var n=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(t)}catch(r){console.error(r)}}t(),e.exports=Sr})(QE);var s1=su;Cm.createRoot=s1.createRoot,Cm.hydrateRoot=s1.hydrateRoot;/** * @remix-run/router v1.6.1 * * Copyright (c) Remix Software Inc. @@ -46,7 +46,7 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function xo(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function tR(){return Math.random().toString(36).substr(2,8)}function l1(e,t){return{usr:e.state,key:e.key,idx:t}}function ul(e,t,r,n){return r===void 0&&(r=null),Oe({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?_n(t):t,{state:r,key:t&&t.key||n||tR()})}function _o(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function _n(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function rR(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:o=!1}=n,a=i.history,c=vt.Pop,d=null,h=g();h==null&&(h=0,a.replaceState(Oe({},a.state,{idx:h}),""));function g(){return(a.state||{idx:null}).idx}function v(){c=vt.Pop;let j=g(),y=j==null?null:j-h;h=j,d&&d({action:c,location:D.location,delta:y})}function _(j,y){c=vt.Push;let w=ul(D.location,j,y);r&&r(w,j),h=g()+1;let S=l1(w,h),E=D.createHref(w);try{a.pushState(S,"",E)}catch{i.location.assign(E)}o&&d&&d({action:c,location:D.location,delta:1})}function b(j,y){c=vt.Replace;let w=ul(D.location,j,y);r&&r(w,j),h=g();let S=l1(w,h),E=D.createHref(w);a.replaceState(S,"",E),o&&d&&d({action:c,location:D.location,delta:0})}function k(j){let y=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof j=="string"?j:_o(j);return be(y,"No window.location.(origin|href) available to create URL for href: "+w),new URL(w,y)}let D={get action(){return c},get location(){return e(i,a)},listen(j){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(a1,v),d=j,()=>{i.removeEventListener(a1,v),d=null}},createHref(j){return t(i,j)},createURL:k,encodeLocation(j){let y=k(j);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:_,replace:b,go(j){return a.go(j)}};return D}var St;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(St||(St={}));const nR=new Set(["lazy","caseSensitive","path","id","index","children"]);function iR(e){return e.index===!0}function M_(e,t,r,n){return r===void 0&&(r=[]),n===void 0&&(n={}),e.map((i,o)=>{let a=[...r,o],c=typeof i.id=="string"?i.id:a.join("-");if(be(i.index!==!0||!i.children,"Cannot specify children on an index route"),be(!n[c],'Found a route id collision on id "'+c+`". Route id's must be globally unique within Data Router usages`),iR(i)){let d=Oe({},i,t(i),{id:c});return n[c]=d,d}else{let d=Oe({},i,t(i),{id:c,children:void 0});return n[c]=d,i.children&&(d.children=M_(i.children,t,a,n)),d}})}function ss(e,t,r){r===void 0&&(r="/");let n=typeof t=="string"?_n(t):t,i=Vs(n.pathname||"/",r);if(i==null)return null;let o=L_(e);oR(o);let a=null;for(let c=0;a==null&&c{let d={relativePath:c===void 0?o.path||"":c,caseSensitive:o.caseSensitive===!0,childrenIndex:a,route:o};d.relativePath.startsWith("/")&&(be(d.relativePath.startsWith(n),'Absolute route path "'+d.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),d.relativePath=d.relativePath.slice(n.length));let h=Qn([n,d.relativePath]),g=r.concat(d);o.children&&o.children.length>0&&(be(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+h+'".')),L_(o.children,t,g,h)),!(o.path==null&&!o.index)&&t.push({path:h,score:fR(h,o.index),routesMeta:g})};return e.forEach((o,a)=>{var c;if(o.path===""||!((c=o.path)!=null&&c.includes("?")))i(o,a);else for(let d of I_(o.path))i(o,a,d)}),t}function I_(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),o=r.replace(/\?$/,"");if(n.length===0)return i?[o,""]:[o];let a=I_(n.join("/")),c=[];return c.push(...a.map(d=>d===""?o:[o,d].join("/"))),i&&c.push(...a),c.map(d=>e.startsWith("/")&&d===""?"/":d)}function oR(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:hR(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const sR=/^:\w+$/,aR=3,lR=2,cR=1,uR=10,dR=-2,c1=e=>e==="*";function fR(e,t){let r=e.split("/"),n=r.length;return r.some(c1)&&(n+=dR),t&&(n+=lR),r.filter(i=>!c1(i)).reduce((i,o)=>i+(sR.test(o)?aR:o===""?cR:uR),n)}function hR(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function mR(e,t){let{routesMeta:r}=e,n={},i="/",o=[];for(let a=0;a{if(g==="*"){let _=c[v]||"";a=o.slice(0,o.length-_.length).replace(/(.)\/+$/,"$1")}return h[g]=yR(c[v]||"",g),h},{}),pathname:o,pathnameBase:a,pattern:e}}function gR(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),xo(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(a,c)=>(n.push(c),"/([^\\/]+)"));return e.endsWith("*")?(n.push("*"),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function vR(e){try{return decodeURI(e)}catch(t){return xo(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function yR(e,t){try{return decodeURIComponent(e)}catch(r){return xo(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+r+").")),e}}function Vs(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}function wR(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?_n(e):e;return{pathname:r?r.startsWith("/")?r:xR(r,t):t,search:SR(n),hash:bR(i)}}function xR(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function uh(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function xd(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function eg(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=_n(e):(i=Oe({},e),be(!i.pathname||!i.pathname.includes("?"),uh("?","pathname","search",i)),be(!i.pathname||!i.pathname.includes("#"),uh("#","pathname","hash",i)),be(!i.search||!i.search.includes("#"),uh("#","search","hash",i)));let o=e===""||i.pathname==="",a=o?"/":i.pathname,c;if(n||a==null)c=r;else{let v=t.length-1;if(a.startsWith("..")){let _=a.split("/");for(;_[0]==="..";)_.shift(),v-=1;i.pathname=_.join("/")}c=v>=0?t[v]:"/"}let d=wR(i,c),h=a&&a!=="/"&&a.endsWith("/"),g=(o||a===".")&&r.endsWith("/");return!d.pathname.endsWith("/")&&(h||g)&&(d.pathname+="/"),d}const Qn=e=>e.join("/").replace(/\/\/+/g,"/"),_R=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),SR=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,bR=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class tg{constructor(t,r,n,i){i===void 0&&(i=!1),this.status=t,this.statusText=r||"",this.internal=i,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}}function N_(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const z_=["post","put","patch","delete"],kR=new Set(z_),CR=["get",...z_],DR=new Set(CR),jR=new Set([301,302,303,307,308]),ER=new Set([307,308]),dh={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},AR={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},u1={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Y_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,H_=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TR=!H_,RR=e=>({hasErrorBoundary:!!e.hasErrorBoundary});function OR(e){be(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let t;if(e.mapRouteProperties)t=e.mapRouteProperties;else if(e.detectErrorBoundary){let M=e.detectErrorBoundary;t=N=>({hasErrorBoundary:M(N)})}else t=RR;let r={},n=M_(e.routes,t,void 0,r),i,o=e.basename||"/",a=Oe({v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),c=null,d=new Set,h=null,g=null,v=null,_=e.hydrationData!=null,b=ss(n,e.history.location,o),k=null;if(b==null){let M=Br(404,{pathname:e.history.location.pathname}),{matches:N,route:H}=v1(n);b=N,k={[H.id]:M}}let D=!b.some(M=>M.route.lazy)&&(!b.some(M=>M.route.loader)||e.hydrationData!=null),j,y={historyAction:e.history.action,location:e.history.location,matches:b,initialized:D,navigation:dh,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||k,fetchers:new Map,blockers:new Map},w=vt.Pop,S=!1,E,T=!1,R=!1,P=[],O=[],z=new Map,Y=0,ee=-1,te=new Map,G=new Set,lt=new Map,Ee=new Map,ze=new Map,mt=!1;function $(){return c=e.history.listen(M=>{let{action:N,location:H,delta:J}=M;if(mt){mt=!1;return}xo(ze.size===0||J!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let re=ea({currentLocation:y.location,nextLocation:H,historyAction:N});if(re&&J!=null){mt=!0,e.history.go(J*-1),di(re,{state:"blocked",location:H,proceed(){di(re,{state:"proceeding",proceed:void 0,reset:void 0,location:H}),e.history.go(J)},reset(){jt(re),ue({blockers:new Map(j.state.blockers)})}});return}return K(N,H)}),y.initialized||K(vt.Pop,y.location),j}function le(){c&&c(),d.clear(),E&&E.abort(),y.fetchers.forEach((M,N)=>Js(N)),y.blockers.forEach((M,N)=>jt(N))}function Q(M){return d.add(M),()=>d.delete(M)}function ue(M){y=Oe({},y,M),d.forEach(N=>N(y))}function he(M,N){var H,J;let re=y.actionData!=null&&y.navigation.formMethod!=null&&Fn(y.navigation.formMethod)&&y.navigation.state==="loading"&&((H=M.state)==null?void 0:H._isRedirect)!==!0,fe;N.actionData?Object.keys(N.actionData).length>0?fe=N.actionData:fe=null:re?fe=y.actionData:fe=null;let ie=N.loaderData?g1(y.loaderData,N.loaderData,N.matches||[],N.errors):y.loaderData;for(let[ne]of ze)jt(ne);let ce=S===!0||y.navigation.formMethod!=null&&Fn(y.navigation.formMethod)&&((J=M.state)==null?void 0:J._isRedirect)!==!0;i&&(n=i,i=void 0),ue(Oe({},N,{actionData:fe,loaderData:ie,historyAction:w,location:M,initialized:!0,navigation:dh,revalidation:"idle",restoreScrollPosition:Kt(M,N.matches||y.matches),preventScrollReset:ce,blockers:new Map(y.blockers)})),T||w===vt.Pop||(w===vt.Push?e.history.push(M,M.state):w===vt.Replace&&e.history.replace(M,M.state)),w=vt.Pop,S=!1,T=!1,R=!1,P=[],O=[]}async function st(M,N){if(typeof M=="number"){e.history.go(M);return}let H=wp(y.location,y.matches,o,a.v7_prependBasename,M,N==null?void 0:N.fromRouteId,N==null?void 0:N.relative),{path:J,submission:re,error:fe}=d1(a.v7_normalizeFormMethod,!1,H,N),ie=y.location,ce=ul(y.location,J,N&&N.state);ce=Oe({},ce,e.history.encodeLocation(ce));let ne=N&&N.replace!=null?N.replace:void 0,xe=vt.Push;ne===!0?xe=vt.Replace:ne===!1||re!=null&&Fn(re.formMethod)&&re.formAction===y.location.pathname+y.location.search&&(xe=vt.Replace);let ae=N&&"preventScrollReset"in N?N.preventScrollReset===!0:void 0,xt=ea({currentLocation:ie,nextLocation:ce,historyAction:xe});if(xt){di(xt,{state:"blocked",location:ce,proceed(){di(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:ce}),st(M,N)},reset(){jt(xt),ue({blockers:new Map(y.blockers)})}});return}return await K(xe,ce,{submission:re,pendingError:fe,preventScrollReset:ae,replace:N&&N.replace})}function Ve(){if(qs(),ue({revalidation:"loading"}),y.navigation.state!=="submitting"){if(y.navigation.state==="idle"){K(y.historyAction,y.location,{startUninterruptedRevalidation:!0});return}K(w||y.historyAction,y.navigation.location,{overrideNavigation:y.navigation})}}async function K(M,N,H){E&&E.abort(),E=null,w=M,T=(H&&H.startUninterruptedRevalidation)===!0,To(y.location,y.matches),S=(H&&H.preventScrollReset)===!0;let J=i||n,re=H&&H.overrideNavigation,fe=ss(J,N,o);if(!fe){let ct=Br(404,{pathname:N.pathname}),{matches:tt,route:Yt}=v1(J);pt(),he(N,{matches:tt,loaderData:{},errors:{[Yt.id]:ct}});return}if(NR(y.location,N)&&!(H&&H.submission&&Fn(H.submission.formMethod))){he(N,{matches:fe});return}E=new AbortController;let ie=va(e.history,N,E.signal,H&&H.submission),ce,ne;if(H&&H.pendingError)ne={[as(fe).route.id]:H.pendingError};else if(H&&H.submission&&Fn(H.submission.formMethod)){let ct=await zt(ie,N,H.submission,fe,{replace:H.replace});if(ct.shortCircuited)return;ce=ct.pendingActionData,ne=ct.pendingActionError,re=Oe({state:"loading",location:N},H.submission),ie=new Request(ie.url,{signal:ie.signal})}let{shortCircuited:xe,loaderData:ae,errors:xt}=await rr(ie,N,fe,re,H&&H.submission,H&&H.fetcherSubmission,H&&H.replace,ce,ne);xe||(E=null,he(N,Oe({matches:fe},ce?{actionData:ce}:{},{loaderData:ae,errors:xt})))}async function zt(M,N,H,J,re){qs();let fe=Oe({state:"submitting",location:N},H);ue({navigation:fe});let ie,ce=xp(J,N);if(!ce.route.action&&!ce.route.lazy)ie={type:St.error,error:Br(405,{method:M.method,pathname:N.pathname,routeId:ce.route.id})};else if(ie=await ga("action",M,ce,J,r,t,o),M.signal.aborted)return{shortCircuited:!0};if(gs(ie)){let ne;return re&&re.replace!=null?ne=re.replace:ne=ie.location===y.location.pathname+y.location.search,await Dr(y,ie,{submission:H,replace:ne}),{shortCircuited:!0}}if(Ha(ie)){let ne=as(J,ce.route.id);return(re&&re.replace)!==!0&&(w=vt.Push),{pendingActionData:{},pendingActionError:{[ne.route.id]:ie.error}}}if(so(ie))throw Br(400,{type:"defer-action"});return{pendingActionData:{[ce.route.id]:ie.data}}}async function rr(M,N,H,J,re,fe,ie,ce,ne){let xe=J;xe||(xe=Oe({state:"loading",location:N,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},re));let ae=re||fe?re||fe:xe.formMethod&&xe.formAction&&xe.formData&&xe.formEncType?{formMethod:xe.formMethod,formAction:xe.formAction,formData:xe.formData,formEncType:xe.formEncType}:void 0,xt=i||n,[ct,tt]=f1(e.history,y,H,ae,N,R,P,O,lt,xt,o,ce,ne);if(pt(Ue=>!(H&&H.some(nr=>nr.route.id===Ue))||ct&&ct.some(nr=>nr.route.id===Ue)),ct.length===0&&tt.length===0){let Ue=Vl();return he(N,Oe({matches:H,loaderData:{},errors:ne||null},ce?{actionData:ce}:{},Ue?{fetchers:new Map(y.fetchers)}:{})),{shortCircuited:!0}}if(!T){tt.forEach(nr=>{let gt=y.fetchers.get(nr.key),Xi={state:"loading",data:gt&>.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(nr.key,Xi)});let Ue=ce||y.actionData;ue(Oe({navigation:xe},Ue?Object.keys(Ue).length===0?{actionData:null}:{actionData:Ue}:{},tt.length>0?{fetchers:new Map(y.fetchers)}:{}))}ee=++Y,tt.forEach(Ue=>{Ue.controller&&z.set(Ue.key,Ue.controller)});let Yt=()=>tt.forEach(Ue=>ci(Ue.key));E&&E.signal.addEventListener("abort",Yt);let{results:nn,loaderResults:on,fetcherResults:Dn}=await pr(y.matches,H,ct,tt,M);if(M.signal.aborted)return{shortCircuited:!0};E&&E.signal.removeEventListener("abort",Yt),tt.forEach(Ue=>z.delete(Ue.key));let sn=y1(nn);if(sn)return await Dr(y,sn,{replace:ie}),{shortCircuited:!0};let{loaderData:jn,errors:ta}=p1(y,H,ct,on,ne,tt,Dn,Ee);Ee.forEach((Ue,nr)=>{Ue.subscribe(gt=>{(gt||Ue.done)&&Ee.delete(nr)})});let En=Vl(),fi=ui(ee),X=En||fi||tt.length>0;return Oe({loaderData:jn,errors:ta},X?{fetchers:new Map(y.fetchers)}:{})}function Yr(M){return y.fetchers.get(M)||AR}function Hr(M,N,H,J){if(TR)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");z.has(M)&&ci(M);let re=i||n,fe=wp(y.location,y.matches,o,a.v7_prependBasename,H,N,J==null?void 0:J.relative),ie=ss(re,fe,o);if(!ie){Zs(M,N,Br(404,{pathname:fe}));return}let{path:ce,submission:ne}=d1(a.v7_normalizeFormMethod,!0,fe,J),xe=xp(ie,ce);if(S=(J&&J.preventScrollReset)===!0,ne&&Fn(ne.formMethod)){mr(M,N,ce,xe,ie,ne);return}lt.set(M,{routeId:N,path:ce}),Ki(M,N,ce,xe,ie,ne)}async function mr(M,N,H,J,re,fe){if(qs(),lt.delete(M),!J.route.action&&!J.route.lazy){let me=Br(405,{method:fe.formMethod,pathname:H,routeId:N});Zs(M,N,me);return}let ie=y.fetchers.get(M),ce=Oe({state:"submitting"},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal,fe);z.set(M,ne);let ae=await ga("action",xe,J,re,r,t,o);if(xe.signal.aborted){z.get(M)===ne&&z.delete(M);return}if(gs(ae)){z.delete(M),G.add(M);let me=Oe({state:"loading"},fe,{data:void 0," _hasFetcherDoneAnything ":!0});return y.fetchers.set(M,me),ue({fetchers:new Map(y.fetchers)}),Dr(y,ae,{submission:fe,isFetchActionRedirect:!0})}if(Ha(ae)){Zs(M,N,ae.error);return}if(so(ae))throw Br(400,{type:"defer-action"});let xt=y.navigation.location||y.location,ct=va(e.history,xt,ne.signal),tt=i||n,Yt=y.navigation.state!=="idle"?ss(tt,y.navigation.location,o):y.matches;be(Yt,"Didn't find any matches after fetcher action");let nn=++Y;te.set(M,nn);let on=Oe({state:"loading",data:ae.data},fe,{" _hasFetcherDoneAnything ":!0});y.fetchers.set(M,on);let[Dn,sn]=f1(e.history,y,Yt,fe,xt,R,P,O,lt,tt,o,{[J.route.id]:ae.data},void 0);sn.filter(me=>me.key!==M).forEach(me=>{let An=me.key,Ul=y.fetchers.get(An),Et={state:"loading",data:Ul&&Ul.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(An,Et),me.controller&&z.set(An,me.controller)}),ue({fetchers:new Map(y.fetchers)});let jn=()=>sn.forEach(me=>ci(me.key));ne.signal.addEventListener("abort",jn);let{results:ta,loaderResults:En,fetcherResults:fi}=await pr(y.matches,Yt,Dn,sn,ct);if(ne.signal.aborted)return;ne.signal.removeEventListener("abort",jn),te.delete(M),z.delete(M),sn.forEach(me=>z.delete(me.key));let X=y1(ta);if(X)return Dr(y,X);let{loaderData:Ue,errors:nr}=p1(y,y.matches,Dn,En,void 0,sn,fi,Ee),gt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,gt);let Xi=ui(nn);y.navigation.state==="loading"&&nn>ee?(be(w,"Expected pending action"),E&&E.abort(),he(y.navigation.location,{matches:Yt,loaderData:Ue,errors:nr,fetchers:new Map(y.fetchers)})):(ue(Oe({errors:nr,loaderData:g1(y.loaderData,Ue,Yt,nr)},Xi?{fetchers:new Map(y.fetchers)}:{})),R=!1)}async function Ki(M,N,H,J,re,fe){let ie=y.fetchers.get(M),ce=Oe({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal);z.set(M,ne);let ae=await ga("loader",xe,J,re,r,t,o);if(so(ae)&&(ae=await $_(ae,xe.signal,!0)||ae),z.get(M)===ne&&z.delete(M),xe.signal.aborted)return;if(gs(ae)){G.add(M),await Dr(y,ae);return}if(Ha(ae)){let ct=as(y.matches,N);y.fetchers.delete(M),ue({fetchers:new Map(y.fetchers),errors:{[ct.route.id]:ae.error}});return}be(!so(ae),"Unhandled fetcher deferred data");let xt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,xt),ue({fetchers:new Map(y.fetchers)})}async function Dr(M,N,H){var J;let{submission:re,replace:fe,isFetchActionRedirect:ie}=H===void 0?{}:H;N.revalidate&&(R=!0);let ce=ul(M.location,N.location,Oe({_isRedirect:!0},ie?{_isFetchActionRedirect:!0}:{}));if(be(ce,"Expected a location on the redirect navigation"),Y_.test(N.location)&&H_&&typeof((J=window)==null?void 0:J.location)<"u"){let tt=e.history.createURL(N.location),Yt=Vs(tt.pathname,o)==null;if(window.location.origin!==tt.origin||Yt){fe?window.location.replace(N.location):window.location.assign(N.location);return}}E=null;let ne=fe===!0?vt.Replace:vt.Push,{formMethod:xe,formAction:ae,formEncType:xt,formData:ct}=M.navigation;!re&&xe&&ae&&ct&&xt&&(re={formMethod:xe,formAction:ae,formEncType:xt,formData:ct}),ER.has(N.status)&&re&&Fn(re.formMethod)?await K(ne,ce,{submission:Oe({},re,{formAction:N.location}),preventScrollReset:S}):ie?await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fetcherSubmission:re,preventScrollReset:S}):await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:re?re.formMethod:void 0,formAction:re?re.formAction:void 0,formEncType:re?re.formEncType:void 0,formData:re?re.formData:void 0},preventScrollReset:S})}async function pr(M,N,H,J,re){let fe=await Promise.all([...H.map(ne=>ga("loader",re,ne,N,r,t,o)),...J.map(ne=>ne.matches&&ne.match&&ne.controller?ga("loader",va(e.history,ne.path,ne.controller.signal),ne.match,ne.matches,r,t,o):{type:St.error,error:Br(404,{pathname:ne.path})})]),ie=fe.slice(0,H.length),ce=fe.slice(H.length);return await Promise.all([w1(M,H,ie,ie.map(()=>re.signal),!1,y.loaderData),w1(M,J.map(ne=>ne.match),ce,J.map(ne=>ne.controller?ne.controller.signal:null),!0)]),{results:fe,loaderResults:ie,fetcherResults:ce}}function qs(){R=!0,P.push(...pt()),lt.forEach((M,N)=>{z.has(N)&&(O.push(N),ci(N))})}function Zs(M,N,H){let J=as(y.matches,N);Js(M),ue({errors:{[J.route.id]:H},fetchers:new Map(y.fetchers)})}function Js(M){z.has(M)&&ci(M),lt.delete(M),te.delete(M),G.delete(M),y.fetchers.delete(M)}function ci(M){let N=z.get(M);be(N,"Expected fetch controller: "+M),N.abort(),z.delete(M)}function Fl(M){for(let N of M){let J={state:"idle",data:Yr(N).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(N,J)}}function Vl(){let M=[],N=!1;for(let H of G){let J=y.fetchers.get(H);be(J,"Expected fetcher: "+H),J.state==="loading"&&(G.delete(H),M.push(H),N=!0)}return Fl(M),N}function ui(M){let N=[];for(let[H,J]of te)if(J0}function Dt(M,N){let H=y.blockers.get(M)||u1;return ze.get(M)!==N&&ze.set(M,N),H}function jt(M){y.blockers.delete(M),ze.delete(M)}function di(M,N){let H=y.blockers.get(M)||u1;be(H.state==="unblocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="proceeding"||H.state==="blocked"&&N.state==="unblocked"||H.state==="proceeding"&&N.state==="unblocked","Invalid blocker state transition: "+H.state+" -> "+N.state),y.blockers.set(M,N),ue({blockers:new Map(y.blockers)})}function ea(M){let{currentLocation:N,nextLocation:H,historyAction:J}=M;if(ze.size===0)return;ze.size>1&&xo(!1,"A router only supports one blocker at a time");let re=Array.from(ze.entries()),[fe,ie]=re[re.length-1],ce=y.blockers.get(fe);if(!(ce&&ce.state==="proceeding")&&ie({currentLocation:N,nextLocation:H,historyAction:J}))return fe}function pt(M){let N=[];return Ee.forEach((H,J)=>{(!M||M(J))&&(H.cancel(),N.push(J),Ee.delete(J))}),N}function xf(M,N,H){if(h=M,v=N,g=H||(J=>J.key),!_&&y.navigation===dh){_=!0;let J=Kt(y.location,y.matches);J!=null&&ue({restoreScrollPosition:J})}return()=>{h=null,v=null,g=null}}function To(M,N){if(h&&g&&v){let H=N.map(re=>x1(re,y.loaderData)),J=g(M,H)||M.key;h[J]=v()}}function Kt(M,N){if(h&&g&&v){let H=N.map(fe=>x1(fe,y.loaderData)),J=g(M,H)||M.key,re=h[J];if(typeof re=="number")return re}return null}function ge(M){i=M}return j={get basename(){return o},get state(){return y},get routes(){return n},initialize:$,subscribe:Q,enableScrollRestoration:xf,navigate:st,fetch:Hr,revalidate:Ve,createHref:M=>e.history.createHref(M),encodeLocation:M=>e.history.encodeLocation(M),getFetcher:Yr,deleteFetcher:Js,dispose:le,getBlocker:Dt,deleteBlocker:jt,_internalFetchControllers:z,_internalActiveDeferreds:Ee,_internalSetRoutes:ge},j}function PR(e){return e!=null&&"formData"in e}function wp(e,t,r,n,i,o,a){let c,d;if(o!=null&&a!=="path"){c=[];for(let g of t)if(c.push(g),g.route.id===o){d=g;break}}else c=t,d=t[t.length-1];let h=eg(i||".",xd(c).map(g=>g.pathnameBase),Vs(e.pathname,r)||e.pathname,a==="path");return i==null&&(h.search=e.search,h.hash=e.hash),(i==null||i===""||i===".")&&d&&d.route.index&&!rg(h.search)&&(h.search=h.search?h.search.replace(/^\?/,"?index&"):"?index"),n&&r!=="/"&&(h.pathname=h.pathname==="/"?r:Qn([r,h.pathname])),_o(h)}function d1(e,t,r,n){if(!n||!PR(n))return{path:r};if(n.formMethod&&!HR(n.formMethod))return{path:r,error:Br(405,{method:n.formMethod})};let i;if(n.formData){let c=n.formMethod||"get";if(i={formMethod:e?c.toUpperCase():c.toLowerCase(),formAction:U_(r),formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:n.formData},Fn(i.formMethod))return{path:r,submission:i}}let o=_n(r),a=V_(n.formData);return t&&o.search&&rg(o.search)&&a.append("index",""),o.search="?"+a,{path:_o(o),submission:i}}function MR(e,t){let r=e;if(t){let n=e.findIndex(i=>i.route.id===t);n>=0&&(r=e.slice(0,n))}return r}function f1(e,t,r,n,i,o,a,c,d,h,g,v,_){let b=_?Object.values(_)[0]:v?Object.values(v)[0]:void 0,k=e.createURL(t.location),D=e.createURL(i),j=_?Object.keys(_)[0]:void 0,w=MR(r,j).filter((E,T)=>{if(E.route.lazy)return!0;if(E.route.loader==null)return!1;if(LR(t.loaderData,t.matches[T],E)||a.some(O=>O===E.route.id))return!0;let R=t.matches[T],P=E;return h1(E,Oe({currentUrl:k,currentParams:R.params,nextUrl:D,nextParams:P.params},n,{actionResult:b,defaultShouldRevalidate:o||k.pathname+k.search===D.pathname+D.search||k.search!==D.search||F_(R,P)}))}),S=[];return d.forEach((E,T)=>{if(!r.some(z=>z.route.id===E.routeId))return;let R=ss(h,E.path,g);if(!R){S.push({key:T,routeId:E.routeId,path:E.path,matches:null,match:null,controller:null});return}let P=xp(R,E.path);if(c.includes(T)){S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController});return}h1(P,Oe({currentUrl:k,currentParams:t.matches[t.matches.length-1].params,nextUrl:D,nextParams:r[r.length-1].params},n,{actionResult:b,defaultShouldRevalidate:o}))&&S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController})}),[w,S]}function LR(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function F_(e,t){let r=e.route.path;return e.pathname!==t.pathname||r!=null&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function h1(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if(typeof r=="boolean")return r}return t.defaultShouldRevalidate}async function m1(e,t,r){if(!e.lazy)return;let n=await e.lazy();if(!e.lazy)return;let i=r[e.id];be(i,"No route found in manifest");let o={};for(let a in n){let d=i[a]!==void 0&&a!=="hasErrorBoundary";xo(!d,'Route "'+i.id+'" has a static property "'+a+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+a+'" will be ignored.')),!d&&!nR.has(a)&&(o[a]=n[a])}Object.assign(i,o),Object.assign(i,Oe({},t(i),{lazy:void 0}))}async function ga(e,t,r,n,i,o,a,c,d,h){c===void 0&&(c=!1),d===void 0&&(d=!1);let g,v,_,b=j=>{let y,w=new Promise((S,E)=>y=E);return _=()=>y(),t.signal.addEventListener("abort",_),Promise.race([j({request:t,params:r.params,context:h}),w])};try{let j=r.route[e];if(r.route.lazy)if(j)v=(await Promise.all([b(j),m1(r.route,o,i)]))[0];else if(await m1(r.route,o,i),j=r.route[e],j)v=await b(j);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw Br(405,{method:t.method,pathname:w,routeId:r.route.id})}else return{type:St.data,data:void 0};else if(j)v=await b(j);else{let y=new URL(t.url),w=y.pathname+y.search;throw Br(404,{pathname:w})}be(v!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(j){g=St.error,v=j}finally{_&&t.signal.removeEventListener("abort",_)}if(YR(v)){let j=v.status;if(jR.has(j)){let S=v.headers.get("Location");if(be(S,"Redirects returned/thrown from loaders/actions must have a Location header"),!Y_.test(S))S=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,S);else if(!c){let E=new URL(t.url),T=S.startsWith("//")?new URL(E.protocol+S):new URL(S),R=Vs(T.pathname,a)!=null;T.origin===E.origin&&R&&(S=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",S),v;return{type:St.redirect,status:j,location:S,revalidate:v.headers.get("X-Remix-Revalidate")!==null}}if(d)throw{type:g||St.data,response:v};let y,w=v.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await v.json():y=await v.text(),g===St.error?{type:g,error:new tg(j,v.statusText,y),headers:v.headers}:{type:St.data,data:y,statusCode:v.status,headers:v.headers}}if(g===St.error)return{type:g,error:v};if(zR(v)){var k,D;return{type:St.deferred,deferredData:v,statusCode:(k=v.init)==null?void 0:k.status,headers:((D=v.init)==null?void 0:D.headers)&&new Headers(v.init.headers)}}return{type:St.data,data:v}}function va(e,t,r,n){let i=e.createURL(U_(t)).toString(),o={signal:r};if(n&&Fn(n.formMethod)){let{formMethod:a,formEncType:c,formData:d}=n;o.method=a.toUpperCase(),o.body=c==="application/x-www-form-urlencoded"?V_(d):d}return new Request(i,o)}function V_(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,n instanceof File?n.name:n);return t}function IR(e,t,r,n,i){let o={},a=null,c,d=!1,h={};return r.forEach((g,v)=>{let _=t[v].route.id;if(be(!gs(g),"Cannot handle redirect results in processLoaderData"),Ha(g)){let b=as(e,_),k=g.error;n&&(k=Object.values(n)[0],n=void 0),a=a||{},a[b.route.id]==null&&(a[b.route.id]=k),o[_]=void 0,d||(d=!0,c=N_(g.error)?g.error.status:500),g.headers&&(h[_]=g.headers)}else so(g)?(i.set(_,g.deferredData),o[_]=g.deferredData.data):o[_]=g.data,g.statusCode!=null&&g.statusCode!==200&&!d&&(c=g.statusCode),g.headers&&(h[_]=g.headers)}),n&&(a=n,o[Object.keys(n)[0]]=void 0),{loaderData:o,errors:a,statusCode:c||200,loaderHeaders:h}}function p1(e,t,r,n,i,o,a,c){let{loaderData:d,errors:h}=IR(t,r,n,i,c);for(let g=0;gn.route.id===t)+1):[...e]).reverse().find(n=>n.route.hasErrorBoundary===!0)||e[0]}function v1(e){let t=e.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function Br(e,t){let{pathname:r,routeId:n,method:i,type:o}=t===void 0?{}:t,a="Unknown Server Error",c="Unknown @remix-run/router error";return e===400?(a="Bad Request",i&&r&&n?c="You made a "+i+' request to "'+r+'" but '+('did not provide a `loader` for route "'+n+'", ')+"so there is no way to handle the request.":o==="defer-action"&&(c="defer() is not supported in actions")):e===403?(a="Forbidden",c='Route "'+n+'" does not match URL "'+r+'"'):e===404?(a="Not Found",c='No route matches URL "'+r+'"'):e===405&&(a="Method Not Allowed",i&&r&&n?c="You made a "+i.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+n+'", ')+"so there is no way to handle the request.":i&&(c='Invalid request method "'+i.toUpperCase()+'"')),new tg(e||500,a,new Error(c),!0)}function y1(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(gs(r))return r}}function U_(e){let t=typeof e=="string"?_n(e):e;return _o(Oe({},t,{hash:""}))}function NR(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function so(e){return e.type===St.deferred}function Ha(e){return e.type===St.error}function gs(e){return(e&&e.type)===St.redirect}function zR(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function YR(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function HR(e){return DR.has(e.toLowerCase())}function Fn(e){return kR.has(e.toLowerCase())}async function w1(e,t,r,n,i,o){for(let a=0;av.route.id===d.route.id),g=h!=null&&!F_(h,d)&&(o&&o[d.route.id])!==void 0;if(so(c)&&(i||g)){let v=n[a];be(v,"Expected an AbortSignal for revalidating fetcher deferred result"),await $_(c,v,i).then(_=>{_&&(r[a]=_||r[a])})}}}async function $_(e,t,r){if(r===void 0&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:St.data,data:e.deferredData.unwrappedData}}catch(i){return{type:St.error,error:i}}return{type:St.data,data:e.deferredData.data}}}function rg(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function x1(e,t){let{route:r,pathname:n,params:i}=e;return{id:r.id,pathname:n,params:i,data:t[r.id],handle:r.handle}}function xp(e,t){let r=typeof t=="string"?_n(t).search:t.search;if(e[e.length-1].route.index&&rg(r||""))return e[e.length-1];let n=xd(e);return n[n.length-1]}/** + */function Oe(){return Oe=Object.assign?Object.assign.bind():function(e){for(var t=1;t"u")throw new Error(t)}function xo(e,t){if(!e){typeof console<"u"&&console.warn(t);try{throw new Error(t)}catch{}}}function tR(){return Math.random().toString(36).substr(2,8)}function l1(e,t){return{usr:e.state,key:e.key,idx:t}}function ul(e,t,r,n){return r===void 0&&(r=null),Oe({pathname:typeof e=="string"?e:e.pathname,search:"",hash:""},typeof t=="string"?_n(t):t,{state:r,key:t&&t.key||n||tR()})}function _o(e){let{pathname:t="/",search:r="",hash:n=""}=e;return r&&r!=="?"&&(t+=r.charAt(0)==="?"?r:"?"+r),n&&n!=="#"&&(t+=n.charAt(0)==="#"?n:"#"+n),t}function _n(e){let t={};if(e){let r=e.indexOf("#");r>=0&&(t.hash=e.substr(r),e=e.substr(0,r));let n=e.indexOf("?");n>=0&&(t.search=e.substr(n),e=e.substr(0,n)),e&&(t.pathname=e)}return t}function rR(e,t,r,n){n===void 0&&(n={});let{window:i=document.defaultView,v5Compat:o=!1}=n,a=i.history,c=vt.Pop,d=null,h=g();h==null&&(h=0,a.replaceState(Oe({},a.state,{idx:h}),""));function g(){return(a.state||{idx:null}).idx}function v(){c=vt.Pop;let j=g(),y=j==null?null:j-h;h=j,d&&d({action:c,location:D.location,delta:y})}function _(j,y){c=vt.Push;let w=ul(D.location,j,y);r&&r(w,j),h=g()+1;let S=l1(w,h),E=D.createHref(w);try{a.pushState(S,"",E)}catch{i.location.assign(E)}o&&d&&d({action:c,location:D.location,delta:1})}function k(j,y){c=vt.Replace;let w=ul(D.location,j,y);r&&r(w,j),h=g();let S=l1(w,h),E=D.createHref(w);a.replaceState(S,"",E),o&&d&&d({action:c,location:D.location,delta:0})}function C(j){let y=i.location.origin!=="null"?i.location.origin:i.location.href,w=typeof j=="string"?j:_o(j);return be(y,"No window.location.(origin|href) available to create URL for href: "+w),new URL(w,y)}let D={get action(){return c},get location(){return e(i,a)},listen(j){if(d)throw new Error("A history only accepts one active listener");return i.addEventListener(a1,v),d=j,()=>{i.removeEventListener(a1,v),d=null}},createHref(j){return t(i,j)},createURL:C,encodeLocation(j){let y=C(j);return{pathname:y.pathname,search:y.search,hash:y.hash}},push:_,replace:k,go(j){return a.go(j)}};return D}var St;(function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"})(St||(St={}));const nR=new Set(["lazy","caseSensitive","path","id","index","children"]);function iR(e){return e.index===!0}function M_(e,t,r,n){return r===void 0&&(r=[]),n===void 0&&(n={}),e.map((i,o)=>{let a=[...r,o],c=typeof i.id=="string"?i.id:a.join("-");if(be(i.index!==!0||!i.children,"Cannot specify children on an index route"),be(!n[c],'Found a route id collision on id "'+c+`". Route id's must be globally unique within Data Router usages`),iR(i)){let d=Oe({},i,t(i),{id:c});return n[c]=d,d}else{let d=Oe({},i,t(i),{id:c,children:void 0});return n[c]=d,i.children&&(d.children=M_(i.children,t,a,n)),d}})}function ss(e,t,r){r===void 0&&(r="/");let n=typeof t=="string"?_n(t):t,i=Fs(n.pathname||"/",r);if(i==null)return null;let o=L_(e);oR(o);let a=null;for(let c=0;a==null&&c{let d={relativePath:c===void 0?o.path||"":c,caseSensitive:o.caseSensitive===!0,childrenIndex:a,route:o};d.relativePath.startsWith("/")&&(be(d.relativePath.startsWith(n),'Absolute route path "'+d.relativePath+'" nested under path '+('"'+n+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),d.relativePath=d.relativePath.slice(n.length));let h=Qn([n,d.relativePath]),g=r.concat(d);o.children&&o.children.length>0&&(be(o.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+h+'".')),L_(o.children,t,g,h)),!(o.path==null&&!o.index)&&t.push({path:h,score:fR(h,o.index),routesMeta:g})};return e.forEach((o,a)=>{var c;if(o.path===""||!((c=o.path)!=null&&c.includes("?")))i(o,a);else for(let d of I_(o.path))i(o,a,d)}),t}function I_(e){let t=e.split("/");if(t.length===0)return[];let[r,...n]=t,i=r.endsWith("?"),o=r.replace(/\?$/,"");if(n.length===0)return i?[o,""]:[o];let a=I_(n.join("/")),c=[];return c.push(...a.map(d=>d===""?o:[o,d].join("/"))),i&&c.push(...a),c.map(d=>e.startsWith("/")&&d===""?"/":d)}function oR(e){e.sort((t,r)=>t.score!==r.score?r.score-t.score:hR(t.routesMeta.map(n=>n.childrenIndex),r.routesMeta.map(n=>n.childrenIndex)))}const sR=/^:\w+$/,aR=3,lR=2,cR=1,uR=10,dR=-2,c1=e=>e==="*";function fR(e,t){let r=e.split("/"),n=r.length;return r.some(c1)&&(n+=dR),t&&(n+=lR),r.filter(i=>!c1(i)).reduce((i,o)=>i+(sR.test(o)?aR:o===""?cR:uR),n)}function hR(e,t){return e.length===t.length&&e.slice(0,-1).every((n,i)=>n===t[i])?e[e.length-1]-t[t.length-1]:0}function mR(e,t){let{routesMeta:r}=e,n={},i="/",o=[];for(let a=0;a{if(g==="*"){let _=c[v]||"";a=o.slice(0,o.length-_.length).replace(/(.)\/+$/,"$1")}return h[g]=yR(c[v]||"",g),h},{}),pathname:o,pathnameBase:a,pattern:e}}function gR(e,t,r){t===void 0&&(t=!1),r===void 0&&(r=!0),xo(e==="*"||!e.endsWith("*")||e.endsWith("/*"),'Route path "'+e+'" will be treated as if it were '+('"'+e.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+e.replace(/\*$/,"/*")+'".'));let n=[],i="^"+e.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^$?{}|()[\]]/g,"\\$&").replace(/\/:(\w+)/g,(a,c)=>(n.push(c),"/([^\\/]+)"));return e.endsWith("*")?(n.push("*"),i+=e==="*"||e==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):r?i+="\\/*$":e!==""&&e!=="/"&&(i+="(?:(?=\\/|$))"),[new RegExp(i,t?void 0:"i"),n]}function vR(e){try{return decodeURI(e)}catch(t){return xo(!1,'The URL path "'+e+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+t+").")),e}}function yR(e,t){try{return decodeURIComponent(e)}catch(r){return xo(!1,'The value for the URL param "'+t+'" will not be decoded because'+(' the string "'+e+'" is a malformed URL segment. This is probably')+(" due to a bad percent encoding ("+r+").")),e}}function Fs(e,t){if(t==="/")return e;if(!e.toLowerCase().startsWith(t.toLowerCase()))return null;let r=t.endsWith("/")?t.length-1:t.length,n=e.charAt(r);return n&&n!=="/"?null:e.slice(r)||"/"}function wR(e,t){t===void 0&&(t="/");let{pathname:r,search:n="",hash:i=""}=typeof e=="string"?_n(e):e;return{pathname:r?r.startsWith("/")?r:xR(r,t):t,search:SR(n),hash:bR(i)}}function xR(e,t){let r=t.replace(/\/+$/,"").split("/");return e.split("/").forEach(i=>{i===".."?r.length>1&&r.pop():i!=="."&&r.push(i)}),r.length>1?r.join("/"):"/"}function uh(e,t,r,n){return"Cannot include a '"+e+"' character in a manually specified "+("`to."+t+"` field ["+JSON.stringify(n)+"]. Please separate it out to the ")+("`to."+r+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function xd(e){return e.filter((t,r)=>r===0||t.route.path&&t.route.path.length>0)}function eg(e,t,r,n){n===void 0&&(n=!1);let i;typeof e=="string"?i=_n(e):(i=Oe({},e),be(!i.pathname||!i.pathname.includes("?"),uh("?","pathname","search",i)),be(!i.pathname||!i.pathname.includes("#"),uh("#","pathname","hash",i)),be(!i.search||!i.search.includes("#"),uh("#","search","hash",i)));let o=e===""||i.pathname==="",a=o?"/":i.pathname,c;if(n||a==null)c=r;else{let v=t.length-1;if(a.startsWith("..")){let _=a.split("/");for(;_[0]==="..";)_.shift(),v-=1;i.pathname=_.join("/")}c=v>=0?t[v]:"/"}let d=wR(i,c),h=a&&a!=="/"&&a.endsWith("/"),g=(o||a===".")&&r.endsWith("/");return!d.pathname.endsWith("/")&&(h||g)&&(d.pathname+="/"),d}const Qn=e=>e.join("/").replace(/\/\/+/g,"/"),_R=e=>e.replace(/\/+$/,"").replace(/^\/*/,"/"),SR=e=>!e||e==="?"?"":e.startsWith("?")?e:"?"+e,bR=e=>!e||e==="#"?"":e.startsWith("#")?e:"#"+e;class tg{constructor(t,r,n,i){i===void 0&&(i=!1),this.status=t,this.statusText=r||"",this.internal=i,n instanceof Error?(this.data=n.toString(),this.error=n):this.data=n}}function N_(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.internal=="boolean"&&"data"in e}const z_=["post","put","patch","delete"],kR=new Set(z_),CR=["get",...z_],DR=new Set(CR),jR=new Set([301,302,303,307,308]),ER=new Set([307,308]),dh={state:"idle",location:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},AR={state:"idle",data:void 0,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},u1={state:"unblocked",proceed:void 0,reset:void 0,location:void 0},Y_=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,H_=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",TR=!H_,RR=e=>({hasErrorBoundary:!!e.hasErrorBoundary});function OR(e){be(e.routes.length>0,"You must provide a non-empty routes array to createRouter");let t;if(e.mapRouteProperties)t=e.mapRouteProperties;else if(e.detectErrorBoundary){let M=e.detectErrorBoundary;t=N=>({hasErrorBoundary:M(N)})}else t=RR;let r={},n=M_(e.routes,t,void 0,r),i,o=e.basename||"/",a=Oe({v7_normalizeFormMethod:!1,v7_prependBasename:!1},e.future),c=null,d=new Set,h=null,g=null,v=null,_=e.hydrationData!=null,k=ss(n,e.history.location,o),C=null;if(k==null){let M=Br(404,{pathname:e.history.location.pathname}),{matches:N,route:H}=v1(n);k=N,C={[H.id]:M}}let D=!k.some(M=>M.route.lazy)&&(!k.some(M=>M.route.loader)||e.hydrationData!=null),j,y={historyAction:e.history.action,location:e.history.location,matches:k,initialized:D,navigation:dh,restoreScrollPosition:e.hydrationData!=null?!1:null,preventScrollReset:!1,revalidation:"idle",loaderData:e.hydrationData&&e.hydrationData.loaderData||{},actionData:e.hydrationData&&e.hydrationData.actionData||null,errors:e.hydrationData&&e.hydrationData.errors||C,fetchers:new Map,blockers:new Map},w=vt.Pop,S=!1,E,T=!1,R=!1,P=[],O=[],z=new Map,Y=0,ee=-1,te=new Map,G=new Set,lt=new Map,Ee=new Map,ze=new Map,mt=!1;function $(){return c=e.history.listen(M=>{let{action:N,location:H,delta:J}=M;if(mt){mt=!1;return}xo(ze.size===0||J!=null,"You are trying to use a blocker on a POP navigation to a location that was not created by @remix-run/router. This will fail silently in production. This can happen if you are navigating outside the router via `window.history.pushState`/`window.location.hash` instead of using router navigation APIs. This can also happen if you are using createHashRouter and the user manually changes the URL.");let re=ea({currentLocation:y.location,nextLocation:H,historyAction:N});if(re&&J!=null){mt=!0,e.history.go(J*-1),di(re,{state:"blocked",location:H,proceed(){di(re,{state:"proceeding",proceed:void 0,reset:void 0,location:H}),e.history.go(J)},reset(){jt(re),ue({blockers:new Map(j.state.blockers)})}});return}return K(N,H)}),y.initialized||K(vt.Pop,y.location),j}function le(){c&&c(),d.clear(),E&&E.abort(),y.fetchers.forEach((M,N)=>Js(N)),y.blockers.forEach((M,N)=>jt(N))}function Q(M){return d.add(M),()=>d.delete(M)}function ue(M){y=Oe({},y,M),d.forEach(N=>N(y))}function he(M,N){var H,J;let re=y.actionData!=null&&y.navigation.formMethod!=null&&Vn(y.navigation.formMethod)&&y.navigation.state==="loading"&&((H=M.state)==null?void 0:H._isRedirect)!==!0,fe;N.actionData?Object.keys(N.actionData).length>0?fe=N.actionData:fe=null:re?fe=y.actionData:fe=null;let ie=N.loaderData?g1(y.loaderData,N.loaderData,N.matches||[],N.errors):y.loaderData;for(let[ne]of ze)jt(ne);let ce=S===!0||y.navigation.formMethod!=null&&Vn(y.navigation.formMethod)&&((J=M.state)==null?void 0:J._isRedirect)!==!0;i&&(n=i,i=void 0),ue(Oe({},N,{actionData:fe,loaderData:ie,historyAction:w,location:M,initialized:!0,navigation:dh,revalidation:"idle",restoreScrollPosition:Kt(M,N.matches||y.matches),preventScrollReset:ce,blockers:new Map(y.blockers)})),T||w===vt.Pop||(w===vt.Push?e.history.push(M,M.state):w===vt.Replace&&e.history.replace(M,M.state)),w=vt.Pop,S=!1,T=!1,R=!1,P=[],O=[]}async function st(M,N){if(typeof M=="number"){e.history.go(M);return}let H=wp(y.location,y.matches,o,a.v7_prependBasename,M,N==null?void 0:N.fromRouteId,N==null?void 0:N.relative),{path:J,submission:re,error:fe}=d1(a.v7_normalizeFormMethod,!1,H,N),ie=y.location,ce=ul(y.location,J,N&&N.state);ce=Oe({},ce,e.history.encodeLocation(ce));let ne=N&&N.replace!=null?N.replace:void 0,xe=vt.Push;ne===!0?xe=vt.Replace:ne===!1||re!=null&&Vn(re.formMethod)&&re.formAction===y.location.pathname+y.location.search&&(xe=vt.Replace);let ae=N&&"preventScrollReset"in N?N.preventScrollReset===!0:void 0,xt=ea({currentLocation:ie,nextLocation:ce,historyAction:xe});if(xt){di(xt,{state:"blocked",location:ce,proceed(){di(xt,{state:"proceeding",proceed:void 0,reset:void 0,location:ce}),st(M,N)},reset(){jt(xt),ue({blockers:new Map(y.blockers)})}});return}return await K(xe,ce,{submission:re,pendingError:fe,preventScrollReset:ae,replace:N&&N.replace})}function Fe(){if(qs(),ue({revalidation:"loading"}),y.navigation.state!=="submitting"){if(y.navigation.state==="idle"){K(y.historyAction,y.location,{startUninterruptedRevalidation:!0});return}K(w||y.historyAction,y.navigation.location,{overrideNavigation:y.navigation})}}async function K(M,N,H){E&&E.abort(),E=null,w=M,T=(H&&H.startUninterruptedRevalidation)===!0,To(y.location,y.matches),S=(H&&H.preventScrollReset)===!0;let J=i||n,re=H&&H.overrideNavigation,fe=ss(J,N,o);if(!fe){let ct=Br(404,{pathname:N.pathname}),{matches:tt,route:Yt}=v1(J);pt(),he(N,{matches:tt,loaderData:{},errors:{[Yt.id]:ct}});return}if(NR(y.location,N)&&!(H&&H.submission&&Vn(H.submission.formMethod))){he(N,{matches:fe});return}E=new AbortController;let ie=va(e.history,N,E.signal,H&&H.submission),ce,ne;if(H&&H.pendingError)ne={[as(fe).route.id]:H.pendingError};else if(H&&H.submission&&Vn(H.submission.formMethod)){let ct=await zt(ie,N,H.submission,fe,{replace:H.replace});if(ct.shortCircuited)return;ce=ct.pendingActionData,ne=ct.pendingActionError,re=Oe({state:"loading",location:N},H.submission),ie=new Request(ie.url,{signal:ie.signal})}let{shortCircuited:xe,loaderData:ae,errors:xt}=await rr(ie,N,fe,re,H&&H.submission,H&&H.fetcherSubmission,H&&H.replace,ce,ne);xe||(E=null,he(N,Oe({matches:fe},ce?{actionData:ce}:{},{loaderData:ae,errors:xt})))}async function zt(M,N,H,J,re){qs();let fe=Oe({state:"submitting",location:N},H);ue({navigation:fe});let ie,ce=xp(J,N);if(!ce.route.action&&!ce.route.lazy)ie={type:St.error,error:Br(405,{method:M.method,pathname:N.pathname,routeId:ce.route.id})};else if(ie=await ga("action",M,ce,J,r,t,o),M.signal.aborted)return{shortCircuited:!0};if(gs(ie)){let ne;return re&&re.replace!=null?ne=re.replace:ne=ie.location===y.location.pathname+y.location.search,await Dr(y,ie,{submission:H,replace:ne}),{shortCircuited:!0}}if(Ha(ie)){let ne=as(J,ce.route.id);return(re&&re.replace)!==!0&&(w=vt.Push),{pendingActionData:{},pendingActionError:{[ne.route.id]:ie.error}}}if(so(ie))throw Br(400,{type:"defer-action"});return{pendingActionData:{[ce.route.id]:ie.data}}}async function rr(M,N,H,J,re,fe,ie,ce,ne){let xe=J;xe||(xe=Oe({state:"loading",location:N,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},re));let ae=re||fe?re||fe:xe.formMethod&&xe.formAction&&xe.formData&&xe.formEncType?{formMethod:xe.formMethod,formAction:xe.formAction,formData:xe.formData,formEncType:xe.formEncType}:void 0,xt=i||n,[ct,tt]=f1(e.history,y,H,ae,N,R,P,O,lt,xt,o,ce,ne);if(pt(Ue=>!(H&&H.some(nr=>nr.route.id===Ue))||ct&&ct.some(nr=>nr.route.id===Ue)),ct.length===0&&tt.length===0){let Ue=Fl();return he(N,Oe({matches:H,loaderData:{},errors:ne||null},ce?{actionData:ce}:{},Ue?{fetchers:new Map(y.fetchers)}:{})),{shortCircuited:!0}}if(!T){tt.forEach(nr=>{let gt=y.fetchers.get(nr.key),Xi={state:"loading",data:gt&>.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(nr.key,Xi)});let Ue=ce||y.actionData;ue(Oe({navigation:xe},Ue?Object.keys(Ue).length===0?{actionData:null}:{actionData:Ue}:{},tt.length>0?{fetchers:new Map(y.fetchers)}:{}))}ee=++Y,tt.forEach(Ue=>{Ue.controller&&z.set(Ue.key,Ue.controller)});let Yt=()=>tt.forEach(Ue=>ci(Ue.key));E&&E.signal.addEventListener("abort",Yt);let{results:nn,loaderResults:on,fetcherResults:Dn}=await pr(y.matches,H,ct,tt,M);if(M.signal.aborted)return{shortCircuited:!0};E&&E.signal.removeEventListener("abort",Yt),tt.forEach(Ue=>z.delete(Ue.key));let sn=y1(nn);if(sn)return await Dr(y,sn,{replace:ie}),{shortCircuited:!0};let{loaderData:jn,errors:ta}=p1(y,H,ct,on,ne,tt,Dn,Ee);Ee.forEach((Ue,nr)=>{Ue.subscribe(gt=>{(gt||Ue.done)&&Ee.delete(nr)})});let En=Fl(),fi=ui(ee),X=En||fi||tt.length>0;return Oe({loaderData:jn,errors:ta},X?{fetchers:new Map(y.fetchers)}:{})}function Yr(M){return y.fetchers.get(M)||AR}function Hr(M,N,H,J){if(TR)throw new Error("router.fetch() was called during the server render, but it shouldn't be. You are likely calling a useFetcher() method in the body of your component. Try moving it to a useEffect or a callback.");z.has(M)&&ci(M);let re=i||n,fe=wp(y.location,y.matches,o,a.v7_prependBasename,H,N,J==null?void 0:J.relative),ie=ss(re,fe,o);if(!ie){Zs(M,N,Br(404,{pathname:fe}));return}let{path:ce,submission:ne}=d1(a.v7_normalizeFormMethod,!0,fe,J),xe=xp(ie,ce);if(S=(J&&J.preventScrollReset)===!0,ne&&Vn(ne.formMethod)){mr(M,N,ce,xe,ie,ne);return}lt.set(M,{routeId:N,path:ce}),Ki(M,N,ce,xe,ie,ne)}async function mr(M,N,H,J,re,fe){if(qs(),lt.delete(M),!J.route.action&&!J.route.lazy){let me=Br(405,{method:fe.formMethod,pathname:H,routeId:N});Zs(M,N,me);return}let ie=y.fetchers.get(M),ce=Oe({state:"submitting"},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal,fe);z.set(M,ne);let ae=await ga("action",xe,J,re,r,t,o);if(xe.signal.aborted){z.get(M)===ne&&z.delete(M);return}if(gs(ae)){z.delete(M),G.add(M);let me=Oe({state:"loading"},fe,{data:void 0," _hasFetcherDoneAnything ":!0});return y.fetchers.set(M,me),ue({fetchers:new Map(y.fetchers)}),Dr(y,ae,{submission:fe,isFetchActionRedirect:!0})}if(Ha(ae)){Zs(M,N,ae.error);return}if(so(ae))throw Br(400,{type:"defer-action"});let xt=y.navigation.location||y.location,ct=va(e.history,xt,ne.signal),tt=i||n,Yt=y.navigation.state!=="idle"?ss(tt,y.navigation.location,o):y.matches;be(Yt,"Didn't find any matches after fetcher action");let nn=++Y;te.set(M,nn);let on=Oe({state:"loading",data:ae.data},fe,{" _hasFetcherDoneAnything ":!0});y.fetchers.set(M,on);let[Dn,sn]=f1(e.history,y,Yt,fe,xt,R,P,O,lt,tt,o,{[J.route.id]:ae.data},void 0);sn.filter(me=>me.key!==M).forEach(me=>{let An=me.key,Ul=y.fetchers.get(An),Et={state:"loading",data:Ul&&Ul.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(An,Et),me.controller&&z.set(An,me.controller)}),ue({fetchers:new Map(y.fetchers)});let jn=()=>sn.forEach(me=>ci(me.key));ne.signal.addEventListener("abort",jn);let{results:ta,loaderResults:En,fetcherResults:fi}=await pr(y.matches,Yt,Dn,sn,ct);if(ne.signal.aborted)return;ne.signal.removeEventListener("abort",jn),te.delete(M),z.delete(M),sn.forEach(me=>z.delete(me.key));let X=y1(ta);if(X)return Dr(y,X);let{loaderData:Ue,errors:nr}=p1(y,y.matches,Dn,En,void 0,sn,fi,Ee),gt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,gt);let Xi=ui(nn);y.navigation.state==="loading"&&nn>ee?(be(w,"Expected pending action"),E&&E.abort(),he(y.navigation.location,{matches:Yt,loaderData:Ue,errors:nr,fetchers:new Map(y.fetchers)})):(ue(Oe({errors:nr,loaderData:g1(y.loaderData,Ue,Yt,nr)},Xi?{fetchers:new Map(y.fetchers)}:{})),R=!1)}async function Ki(M,N,H,J,re,fe){let ie=y.fetchers.get(M),ce=Oe({state:"loading",formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fe,{data:ie&&ie.data," _hasFetcherDoneAnything ":!0});y.fetchers.set(M,ce),ue({fetchers:new Map(y.fetchers)});let ne=new AbortController,xe=va(e.history,H,ne.signal);z.set(M,ne);let ae=await ga("loader",xe,J,re,r,t,o);if(so(ae)&&(ae=await $_(ae,xe.signal,!0)||ae),z.get(M)===ne&&z.delete(M),xe.signal.aborted)return;if(gs(ae)){G.add(M),await Dr(y,ae);return}if(Ha(ae)){let ct=as(y.matches,N);y.fetchers.delete(M),ue({fetchers:new Map(y.fetchers),errors:{[ct.route.id]:ae.error}});return}be(!so(ae),"Unhandled fetcher deferred data");let xt={state:"idle",data:ae.data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(M,xt),ue({fetchers:new Map(y.fetchers)})}async function Dr(M,N,H){var J;let{submission:re,replace:fe,isFetchActionRedirect:ie}=H===void 0?{}:H;N.revalidate&&(R=!0);let ce=ul(M.location,N.location,Oe({_isRedirect:!0},ie?{_isFetchActionRedirect:!0}:{}));if(be(ce,"Expected a location on the redirect navigation"),Y_.test(N.location)&&H_&&typeof((J=window)==null?void 0:J.location)<"u"){let tt=e.history.createURL(N.location),Yt=Fs(tt.pathname,o)==null;if(window.location.origin!==tt.origin||Yt){fe?window.location.replace(N.location):window.location.assign(N.location);return}}E=null;let ne=fe===!0?vt.Replace:vt.Push,{formMethod:xe,formAction:ae,formEncType:xt,formData:ct}=M.navigation;!re&&xe&&ae&&ct&&xt&&(re={formMethod:xe,formAction:ae,formEncType:xt,formData:ct}),ER.has(N.status)&&re&&Vn(re.formMethod)?await K(ne,ce,{submission:Oe({},re,{formAction:N.location}),preventScrollReset:S}):ie?await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0},fetcherSubmission:re,preventScrollReset:S}):await K(ne,ce,{overrideNavigation:{state:"loading",location:ce,formMethod:re?re.formMethod:void 0,formAction:re?re.formAction:void 0,formEncType:re?re.formEncType:void 0,formData:re?re.formData:void 0},preventScrollReset:S})}async function pr(M,N,H,J,re){let fe=await Promise.all([...H.map(ne=>ga("loader",re,ne,N,r,t,o)),...J.map(ne=>ne.matches&&ne.match&&ne.controller?ga("loader",va(e.history,ne.path,ne.controller.signal),ne.match,ne.matches,r,t,o):{type:St.error,error:Br(404,{pathname:ne.path})})]),ie=fe.slice(0,H.length),ce=fe.slice(H.length);return await Promise.all([w1(M,H,ie,ie.map(()=>re.signal),!1,y.loaderData),w1(M,J.map(ne=>ne.match),ce,J.map(ne=>ne.controller?ne.controller.signal:null),!0)]),{results:fe,loaderResults:ie,fetcherResults:ce}}function qs(){R=!0,P.push(...pt()),lt.forEach((M,N)=>{z.has(N)&&(O.push(N),ci(N))})}function Zs(M,N,H){let J=as(y.matches,N);Js(M),ue({errors:{[J.route.id]:H},fetchers:new Map(y.fetchers)})}function Js(M){z.has(M)&&ci(M),lt.delete(M),te.delete(M),G.delete(M),y.fetchers.delete(M)}function ci(M){let N=z.get(M);be(N,"Expected fetch controller: "+M),N.abort(),z.delete(M)}function Vl(M){for(let N of M){let J={state:"idle",data:Yr(N).data,formMethod:void 0,formAction:void 0,formEncType:void 0,formData:void 0," _hasFetcherDoneAnything ":!0};y.fetchers.set(N,J)}}function Fl(){let M=[],N=!1;for(let H of G){let J=y.fetchers.get(H);be(J,"Expected fetcher: "+H),J.state==="loading"&&(G.delete(H),M.push(H),N=!0)}return Vl(M),N}function ui(M){let N=[];for(let[H,J]of te)if(J0}function Dt(M,N){let H=y.blockers.get(M)||u1;return ze.get(M)!==N&&ze.set(M,N),H}function jt(M){y.blockers.delete(M),ze.delete(M)}function di(M,N){let H=y.blockers.get(M)||u1;be(H.state==="unblocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="blocked"||H.state==="blocked"&&N.state==="proceeding"||H.state==="blocked"&&N.state==="unblocked"||H.state==="proceeding"&&N.state==="unblocked","Invalid blocker state transition: "+H.state+" -> "+N.state),y.blockers.set(M,N),ue({blockers:new Map(y.blockers)})}function ea(M){let{currentLocation:N,nextLocation:H,historyAction:J}=M;if(ze.size===0)return;ze.size>1&&xo(!1,"A router only supports one blocker at a time");let re=Array.from(ze.entries()),[fe,ie]=re[re.length-1],ce=y.blockers.get(fe);if(!(ce&&ce.state==="proceeding")&&ie({currentLocation:N,nextLocation:H,historyAction:J}))return fe}function pt(M){let N=[];return Ee.forEach((H,J)=>{(!M||M(J))&&(H.cancel(),N.push(J),Ee.delete(J))}),N}function xf(M,N,H){if(h=M,v=N,g=H||(J=>J.key),!_&&y.navigation===dh){_=!0;let J=Kt(y.location,y.matches);J!=null&&ue({restoreScrollPosition:J})}return()=>{h=null,v=null,g=null}}function To(M,N){if(h&&g&&v){let H=N.map(re=>x1(re,y.loaderData)),J=g(M,H)||M.key;h[J]=v()}}function Kt(M,N){if(h&&g&&v){let H=N.map(fe=>x1(fe,y.loaderData)),J=g(M,H)||M.key,re=h[J];if(typeof re=="number")return re}return null}function ge(M){i=M}return j={get basename(){return o},get state(){return y},get routes(){return n},initialize:$,subscribe:Q,enableScrollRestoration:xf,navigate:st,fetch:Hr,revalidate:Fe,createHref:M=>e.history.createHref(M),encodeLocation:M=>e.history.encodeLocation(M),getFetcher:Yr,deleteFetcher:Js,dispose:le,getBlocker:Dt,deleteBlocker:jt,_internalFetchControllers:z,_internalActiveDeferreds:Ee,_internalSetRoutes:ge},j}function PR(e){return e!=null&&"formData"in e}function wp(e,t,r,n,i,o,a){let c,d;if(o!=null&&a!=="path"){c=[];for(let g of t)if(c.push(g),g.route.id===o){d=g;break}}else c=t,d=t[t.length-1];let h=eg(i||".",xd(c).map(g=>g.pathnameBase),Fs(e.pathname,r)||e.pathname,a==="path");return i==null&&(h.search=e.search,h.hash=e.hash),(i==null||i===""||i===".")&&d&&d.route.index&&!rg(h.search)&&(h.search=h.search?h.search.replace(/^\?/,"?index&"):"?index"),n&&r!=="/"&&(h.pathname=h.pathname==="/"?r:Qn([r,h.pathname])),_o(h)}function d1(e,t,r,n){if(!n||!PR(n))return{path:r};if(n.formMethod&&!HR(n.formMethod))return{path:r,error:Br(405,{method:n.formMethod})};let i;if(n.formData){let c=n.formMethod||"get";if(i={formMethod:e?c.toUpperCase():c.toLowerCase(),formAction:U_(r),formEncType:n&&n.formEncType||"application/x-www-form-urlencoded",formData:n.formData},Vn(i.formMethod))return{path:r,submission:i}}let o=_n(r),a=F_(n.formData);return t&&o.search&&rg(o.search)&&a.append("index",""),o.search="?"+a,{path:_o(o),submission:i}}function MR(e,t){let r=e;if(t){let n=e.findIndex(i=>i.route.id===t);n>=0&&(r=e.slice(0,n))}return r}function f1(e,t,r,n,i,o,a,c,d,h,g,v,_){let k=_?Object.values(_)[0]:v?Object.values(v)[0]:void 0,C=e.createURL(t.location),D=e.createURL(i),j=_?Object.keys(_)[0]:void 0,w=MR(r,j).filter((E,T)=>{if(E.route.lazy)return!0;if(E.route.loader==null)return!1;if(LR(t.loaderData,t.matches[T],E)||a.some(O=>O===E.route.id))return!0;let R=t.matches[T],P=E;return h1(E,Oe({currentUrl:C,currentParams:R.params,nextUrl:D,nextParams:P.params},n,{actionResult:k,defaultShouldRevalidate:o||C.pathname+C.search===D.pathname+D.search||C.search!==D.search||V_(R,P)}))}),S=[];return d.forEach((E,T)=>{if(!r.some(z=>z.route.id===E.routeId))return;let R=ss(h,E.path,g);if(!R){S.push({key:T,routeId:E.routeId,path:E.path,matches:null,match:null,controller:null});return}let P=xp(R,E.path);if(c.includes(T)){S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController});return}h1(P,Oe({currentUrl:C,currentParams:t.matches[t.matches.length-1].params,nextUrl:D,nextParams:r[r.length-1].params},n,{actionResult:k,defaultShouldRevalidate:o}))&&S.push({key:T,routeId:E.routeId,path:E.path,matches:R,match:P,controller:new AbortController})}),[w,S]}function LR(e,t,r){let n=!t||r.route.id!==t.route.id,i=e[r.route.id]===void 0;return n||i}function V_(e,t){let r=e.route.path;return e.pathname!==t.pathname||r!=null&&r.endsWith("*")&&e.params["*"]!==t.params["*"]}function h1(e,t){if(e.route.shouldRevalidate){let r=e.route.shouldRevalidate(t);if(typeof r=="boolean")return r}return t.defaultShouldRevalidate}async function m1(e,t,r){if(!e.lazy)return;let n=await e.lazy();if(!e.lazy)return;let i=r[e.id];be(i,"No route found in manifest");let o={};for(let a in n){let d=i[a]!==void 0&&a!=="hasErrorBoundary";xo(!d,'Route "'+i.id+'" has a static property "'+a+'" defined but its lazy function is also returning a value for this property. '+('The lazy route property "'+a+'" will be ignored.')),!d&&!nR.has(a)&&(o[a]=n[a])}Object.assign(i,o),Object.assign(i,Oe({},t(i),{lazy:void 0}))}async function ga(e,t,r,n,i,o,a,c,d,h){c===void 0&&(c=!1),d===void 0&&(d=!1);let g,v,_,k=j=>{let y,w=new Promise((S,E)=>y=E);return _=()=>y(),t.signal.addEventListener("abort",_),Promise.race([j({request:t,params:r.params,context:h}),w])};try{let j=r.route[e];if(r.route.lazy)if(j)v=(await Promise.all([k(j),m1(r.route,o,i)]))[0];else if(await m1(r.route,o,i),j=r.route[e],j)v=await k(j);else if(e==="action"){let y=new URL(t.url),w=y.pathname+y.search;throw Br(405,{method:t.method,pathname:w,routeId:r.route.id})}else return{type:St.data,data:void 0};else if(j)v=await k(j);else{let y=new URL(t.url),w=y.pathname+y.search;throw Br(404,{pathname:w})}be(v!==void 0,"You defined "+(e==="action"?"an action":"a loader")+" for route "+('"'+r.route.id+"\" but didn't return anything from your `"+e+"` ")+"function. Please return a value or `null`.")}catch(j){g=St.error,v=j}finally{_&&t.signal.removeEventListener("abort",_)}if(YR(v)){let j=v.status;if(jR.has(j)){let S=v.headers.get("Location");if(be(S,"Redirects returned/thrown from loaders/actions must have a Location header"),!Y_.test(S))S=wp(new URL(t.url),n.slice(0,n.indexOf(r)+1),a,!0,S);else if(!c){let E=new URL(t.url),T=S.startsWith("//")?new URL(E.protocol+S):new URL(S),R=Fs(T.pathname,a)!=null;T.origin===E.origin&&R&&(S=T.pathname+T.search+T.hash)}if(c)throw v.headers.set("Location",S),v;return{type:St.redirect,status:j,location:S,revalidate:v.headers.get("X-Remix-Revalidate")!==null}}if(d)throw{type:g||St.data,response:v};let y,w=v.headers.get("Content-Type");return w&&/\bapplication\/json\b/.test(w)?y=await v.json():y=await v.text(),g===St.error?{type:g,error:new tg(j,v.statusText,y),headers:v.headers}:{type:St.data,data:y,statusCode:v.status,headers:v.headers}}if(g===St.error)return{type:g,error:v};if(zR(v)){var C,D;return{type:St.deferred,deferredData:v,statusCode:(C=v.init)==null?void 0:C.status,headers:((D=v.init)==null?void 0:D.headers)&&new Headers(v.init.headers)}}return{type:St.data,data:v}}function va(e,t,r,n){let i=e.createURL(U_(t)).toString(),o={signal:r};if(n&&Vn(n.formMethod)){let{formMethod:a,formEncType:c,formData:d}=n;o.method=a.toUpperCase(),o.body=c==="application/x-www-form-urlencoded"?F_(d):d}return new Request(i,o)}function F_(e){let t=new URLSearchParams;for(let[r,n]of e.entries())t.append(r,n instanceof File?n.name:n);return t}function IR(e,t,r,n,i){let o={},a=null,c,d=!1,h={};return r.forEach((g,v)=>{let _=t[v].route.id;if(be(!gs(g),"Cannot handle redirect results in processLoaderData"),Ha(g)){let k=as(e,_),C=g.error;n&&(C=Object.values(n)[0],n=void 0),a=a||{},a[k.route.id]==null&&(a[k.route.id]=C),o[_]=void 0,d||(d=!0,c=N_(g.error)?g.error.status:500),g.headers&&(h[_]=g.headers)}else so(g)?(i.set(_,g.deferredData),o[_]=g.deferredData.data):o[_]=g.data,g.statusCode!=null&&g.statusCode!==200&&!d&&(c=g.statusCode),g.headers&&(h[_]=g.headers)}),n&&(a=n,o[Object.keys(n)[0]]=void 0),{loaderData:o,errors:a,statusCode:c||200,loaderHeaders:h}}function p1(e,t,r,n,i,o,a,c){let{loaderData:d,errors:h}=IR(t,r,n,i,c);for(let g=0;gn.route.id===t)+1):[...e]).reverse().find(n=>n.route.hasErrorBoundary===!0)||e[0]}function v1(e){let t=e.find(r=>r.index||!r.path||r.path==="/")||{id:"__shim-error-route__"};return{matches:[{params:{},pathname:"",pathnameBase:"",route:t}],route:t}}function Br(e,t){let{pathname:r,routeId:n,method:i,type:o}=t===void 0?{}:t,a="Unknown Server Error",c="Unknown @remix-run/router error";return e===400?(a="Bad Request",i&&r&&n?c="You made a "+i+' request to "'+r+'" but '+('did not provide a `loader` for route "'+n+'", ')+"so there is no way to handle the request.":o==="defer-action"&&(c="defer() is not supported in actions")):e===403?(a="Forbidden",c='Route "'+n+'" does not match URL "'+r+'"'):e===404?(a="Not Found",c='No route matches URL "'+r+'"'):e===405&&(a="Method Not Allowed",i&&r&&n?c="You made a "+i.toUpperCase()+' request to "'+r+'" but '+('did not provide an `action` for route "'+n+'", ')+"so there is no way to handle the request.":i&&(c='Invalid request method "'+i.toUpperCase()+'"')),new tg(e||500,a,new Error(c),!0)}function y1(e){for(let t=e.length-1;t>=0;t--){let r=e[t];if(gs(r))return r}}function U_(e){let t=typeof e=="string"?_n(e):e;return _o(Oe({},t,{hash:""}))}function NR(e,t){return e.pathname!==t.pathname||e.search!==t.search?!1:e.hash===""?t.hash!=="":e.hash===t.hash?!0:t.hash!==""}function so(e){return e.type===St.deferred}function Ha(e){return e.type===St.error}function gs(e){return(e&&e.type)===St.redirect}function zR(e){let t=e;return t&&typeof t=="object"&&typeof t.data=="object"&&typeof t.subscribe=="function"&&typeof t.cancel=="function"&&typeof t.resolveData=="function"}function YR(e){return e!=null&&typeof e.status=="number"&&typeof e.statusText=="string"&&typeof e.headers=="object"&&typeof e.body<"u"}function HR(e){return DR.has(e.toLowerCase())}function Vn(e){return kR.has(e.toLowerCase())}async function w1(e,t,r,n,i,o){for(let a=0;av.route.id===d.route.id),g=h!=null&&!V_(h,d)&&(o&&o[d.route.id])!==void 0;if(so(c)&&(i||g)){let v=n[a];be(v,"Expected an AbortSignal for revalidating fetcher deferred result"),await $_(c,v,i).then(_=>{_&&(r[a]=_||r[a])})}}}async function $_(e,t,r){if(r===void 0&&(r=!1),!await e.deferredData.resolveData(t)){if(r)try{return{type:St.data,data:e.deferredData.unwrappedData}}catch(i){return{type:St.error,error:i}}return{type:St.data,data:e.deferredData.data}}}function rg(e){return new URLSearchParams(e).getAll("index").some(t=>t==="")}function x1(e,t){let{route:r,pathname:n,params:i}=e;return{id:r.id,pathname:n,params:i,data:t[r.id],handle:r.handle}}function xp(e,t){let r=typeof t=="string"?_n(t).search:t.search;if(e[e.length-1].route.index&&rg(r||""))return e[e.length-1];let n=xd(e);return n[n.length-1]}/** * React Router v6.11.1 * * Copyright (c) Remix Software Inc. @@ -55,7 +55,7 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function Ru(){return Ru=Object.assign?Object.assign.bind():function(e){for(var t=1;tc.pathnameBase)),o=I.useRef(!1);return G_(()=>{o.current=!0}),I.useCallback(function(c,d){if(d===void 0&&(d={}),!o.current)return;if(typeof c=="number"){t.go(c);return}let h=eg(c,JSON.parse(i),n,d.relative==="path");e!=="/"&&(h.pathname=h.pathname==="/"?e:Qn([e,h.pathname])),(d.replace?t.replace:t.push)(h,d.state,d)},[e,t,i,n])}const UR=I.createContext(null);function $R(e){let t=I.useContext(oi).outlet;return t&&I.createElement(UR.Provider,{value:e},t)}function Sn(){let{matches:e}=I.useContext(oi),t=e[e.length-1];return t?t.params:{}}function K_(e,t){let{relative:r}=t===void 0?{}:t,{matches:n}=I.useContext(oi),{pathname:i}=si(),o=JSON.stringify(xd(n).map(a=>a.pathnameBase));return I.useMemo(()=>eg(e,JSON.parse(o),i,r==="path"),[e,o,i,r])}function BR(e,t,r){Al()||be(!1);let{navigator:n}=I.useContext(Us),{matches:i}=I.useContext(oi),o=i[i.length-1],a=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:"/";o&&o.route;let d=si(),h;if(t){var g;let D=typeof t=="string"?_n(t):t;c==="/"||(g=D.pathname)!=null&&g.startsWith(c)||be(!1),h=D}else h=d;let v=h.pathname||"/",_=c==="/"?v:v.slice(c.length)||"/",b=ss(e,{pathname:_}),k=QR(b&&b.map(D=>Object.assign({},D,{params:Object.assign({},a,D.params),pathname:Qn([c,n.encodeLocation?n.encodeLocation(D.pathname).pathname:D.pathname]),pathnameBase:D.pathnameBase==="/"?c:Qn([c,n.encodeLocation?n.encodeLocation(D.pathnameBase).pathname:D.pathnameBase])})),i,r);return t&&k?I.createElement(_d.Provider,{value:{location:Ru({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:vt.Pop}},k):k}function WR(){let e=eO(),t=N_(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return I.createElement(I.Fragment,null,I.createElement("h2",null,"Unexpected Application Error!"),I.createElement("h3",{style:{fontStyle:"italic"}},t),r?I.createElement("pre",{style:i},r):null,o)}const GR=I.createElement(WR,null);class KR extends I.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error?I.createElement(oi.Provider,{value:this.props.routeContext},I.createElement(W_.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function XR(e){let{routeContext:t,match:r,children:n}=e,i=I.useContext(ng);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),I.createElement(oi.Provider,{value:t},n)}function QR(e,t,r){var n;if(t===void 0&&(t=[]),r===void 0&&(r=null),e==null){var i;if((i=r)!=null&&i.errors)e=r.matches;else return null}let o=e,a=(n=r)==null?void 0:n.errors;if(a!=null){let c=o.findIndex(d=>d.route.id&&(a==null?void 0:a[d.route.id]));c>=0||be(!1),o=o.slice(0,Math.min(o.length,c+1))}return o.reduceRight((c,d,h)=>{let g=d.route.id?a==null?void 0:a[d.route.id]:null,v=null;r&&(v=d.route.errorElement||GR);let _=t.concat(o.slice(0,h+1)),b=()=>{let k;return g?k=v:d.route.Component?k=I.createElement(d.route.Component,null):d.route.element?k=d.route.element:k=c,I.createElement(XR,{match:d,routeContext:{outlet:c,matches:_,isDataRoute:r!=null},children:k})};return r&&(d.route.ErrorBoundary||d.route.errorElement||h===0)?I.createElement(KR,{location:r.location,revalidation:r.revalidation,component:v,error:g,children:b(),routeContext:{outlet:null,matches:_,isDataRoute:!0}}):b()},null)}var _p;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(_p||(_p={}));var dl;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(dl||(dl={}));function qR(e){let t=I.useContext(ng);return t||be(!1),t}function ZR(e){let t=I.useContext(B_);return t||be(!1),t}function JR(e){let t=I.useContext(oi);return t||be(!1),t}function X_(e){let t=JR(),r=t.matches[t.matches.length-1];return r.route.id||be(!1),r.route.id}function eO(){var e;let t=I.useContext(W_),r=ZR(dl.UseRouteError),n=X_(dl.UseRouteError);return t||((e=r.errors)==null?void 0:e[n])}function tO(){let{router:e}=qR(_p.UseNavigateStable),t=X_(dl.UseNavigateStable),r=I.useRef(!1);return G_(()=>{r.current=!0}),I.useCallback(function(i,o){o===void 0&&(o={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ru({fromRouteId:t},o)))},[e,t])}function rO(e){let{fallbackElement:t,router:r}=e,[n,i]=I.useState(r.state);I.useLayoutEffect(()=>r.subscribe(i),[r,i]);let o=I.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:d=>r.navigate(d),push:(d,h,g)=>r.navigate(d,{state:h,preventScrollReset:g==null?void 0:g.preventScrollReset}),replace:(d,h,g)=>r.navigate(d,{replace:!0,state:h,preventScrollReset:g==null?void 0:g.preventScrollReset})}),[r]),a=r.basename||"/",c=I.useMemo(()=>({router:r,navigator:o,static:!1,basename:a}),[r,o,a]);return I.createElement(I.Fragment,null,I.createElement(ng.Provider,{value:c},I.createElement(B_.Provider,{value:n},I.createElement(oO,{basename:r.basename,location:r.state.location,navigationType:r.state.historyAction,navigator:o},r.state.initialized?I.createElement(nO,{routes:r.routes,state:n}):t))),null)}function nO(e){let{routes:t,state:r}=e;return BR(t,void 0,r)}function iO(e){return $R(e.context)}function oO(e){let{basename:t="/",children:r=null,location:n,navigationType:i=vt.Pop,navigator:o,static:a=!1}=e;Al()&&be(!1);let c=t.replace(/^\/*/,"/"),d=I.useMemo(()=>({basename:c,navigator:o,static:a}),[c,o,a]);typeof n=="string"&&(n=_n(n));let{pathname:h="/",search:g="",hash:v="",state:_=null,key:b="default"}=n,k=I.useMemo(()=>{let D=Vs(h,c);return D==null?null:{location:{pathname:D,search:g,hash:v,state:_,key:b},navigationType:i}},[c,h,g,v,_,b,i]);return k==null?null:I.createElement(Us.Provider,{value:d},I.createElement(_d.Provider,{children:r,value:k}))}var _1;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(_1||(_1={}));new Promise(()=>{});function sO(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:I.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:I.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** + */function Ru(){return Ru=Object.assign?Object.assign.bind():function(e){for(var t=1;tc.pathnameBase)),o=I.useRef(!1);return G_(()=>{o.current=!0}),I.useCallback(function(c,d){if(d===void 0&&(d={}),!o.current)return;if(typeof c=="number"){t.go(c);return}let h=eg(c,JSON.parse(i),n,d.relative==="path");e!=="/"&&(h.pathname=h.pathname==="/"?e:Qn([e,h.pathname])),(d.replace?t.replace:t.push)(h,d.state,d)},[e,t,i,n])}const UR=I.createContext(null);function $R(e){let t=I.useContext(oi).outlet;return t&&I.createElement(UR.Provider,{value:e},t)}function Sn(){let{matches:e}=I.useContext(oi),t=e[e.length-1];return t?t.params:{}}function K_(e,t){let{relative:r}=t===void 0?{}:t,{matches:n}=I.useContext(oi),{pathname:i}=si(),o=JSON.stringify(xd(n).map(a=>a.pathnameBase));return I.useMemo(()=>eg(e,JSON.parse(o),i,r==="path"),[e,o,i,r])}function BR(e,t,r){Al()||be(!1);let{navigator:n}=I.useContext(Us),{matches:i}=I.useContext(oi),o=i[i.length-1],a=o?o.params:{};o&&o.pathname;let c=o?o.pathnameBase:"/";o&&o.route;let d=si(),h;if(t){var g;let D=typeof t=="string"?_n(t):t;c==="/"||(g=D.pathname)!=null&&g.startsWith(c)||be(!1),h=D}else h=d;let v=h.pathname||"/",_=c==="/"?v:v.slice(c.length)||"/",k=ss(e,{pathname:_}),C=QR(k&&k.map(D=>Object.assign({},D,{params:Object.assign({},a,D.params),pathname:Qn([c,n.encodeLocation?n.encodeLocation(D.pathname).pathname:D.pathname]),pathnameBase:D.pathnameBase==="/"?c:Qn([c,n.encodeLocation?n.encodeLocation(D.pathnameBase).pathname:D.pathnameBase])})),i,r);return t&&C?I.createElement(_d.Provider,{value:{location:Ru({pathname:"/",search:"",hash:"",state:null,key:"default"},h),navigationType:vt.Pop}},C):C}function WR(){let e=eO(),t=N_(e)?e.status+" "+e.statusText:e instanceof Error?e.message:JSON.stringify(e),r=e instanceof Error?e.stack:null,i={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"},o=null;return I.createElement(I.Fragment,null,I.createElement("h2",null,"Unexpected Application Error!"),I.createElement("h3",{style:{fontStyle:"italic"}},t),r?I.createElement("pre",{style:i},r):null,o)}const GR=I.createElement(WR,null);class KR extends I.Component{constructor(t){super(t),this.state={location:t.location,revalidation:t.revalidation,error:t.error}}static getDerivedStateFromError(t){return{error:t}}static getDerivedStateFromProps(t,r){return r.location!==t.location||r.revalidation!=="idle"&&t.revalidation==="idle"?{error:t.error,location:t.location,revalidation:t.revalidation}:{error:t.error||r.error,location:r.location,revalidation:t.revalidation||r.revalidation}}componentDidCatch(t,r){console.error("React Router caught the following error during render",t,r)}render(){return this.state.error?I.createElement(oi.Provider,{value:this.props.routeContext},I.createElement(W_.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function XR(e){let{routeContext:t,match:r,children:n}=e,i=I.useContext(ng);return i&&i.static&&i.staticContext&&(r.route.errorElement||r.route.ErrorBoundary)&&(i.staticContext._deepestRenderedBoundaryId=r.route.id),I.createElement(oi.Provider,{value:t},n)}function QR(e,t,r){var n;if(t===void 0&&(t=[]),r===void 0&&(r=null),e==null){var i;if((i=r)!=null&&i.errors)e=r.matches;else return null}let o=e,a=(n=r)==null?void 0:n.errors;if(a!=null){let c=o.findIndex(d=>d.route.id&&(a==null?void 0:a[d.route.id]));c>=0||be(!1),o=o.slice(0,Math.min(o.length,c+1))}return o.reduceRight((c,d,h)=>{let g=d.route.id?a==null?void 0:a[d.route.id]:null,v=null;r&&(v=d.route.errorElement||GR);let _=t.concat(o.slice(0,h+1)),k=()=>{let C;return g?C=v:d.route.Component?C=I.createElement(d.route.Component,null):d.route.element?C=d.route.element:C=c,I.createElement(XR,{match:d,routeContext:{outlet:c,matches:_,isDataRoute:r!=null},children:C})};return r&&(d.route.ErrorBoundary||d.route.errorElement||h===0)?I.createElement(KR,{location:r.location,revalidation:r.revalidation,component:v,error:g,children:k(),routeContext:{outlet:null,matches:_,isDataRoute:!0}}):k()},null)}var _p;(function(e){e.UseBlocker="useBlocker",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate"})(_p||(_p={}));var dl;(function(e){e.UseBlocker="useBlocker",e.UseLoaderData="useLoaderData",e.UseActionData="useActionData",e.UseRouteError="useRouteError",e.UseNavigation="useNavigation",e.UseRouteLoaderData="useRouteLoaderData",e.UseMatches="useMatches",e.UseRevalidator="useRevalidator",e.UseNavigateStable="useNavigate",e.UseRouteId="useRouteId"})(dl||(dl={}));function qR(e){let t=I.useContext(ng);return t||be(!1),t}function ZR(e){let t=I.useContext(B_);return t||be(!1),t}function JR(e){let t=I.useContext(oi);return t||be(!1),t}function X_(e){let t=JR(),r=t.matches[t.matches.length-1];return r.route.id||be(!1),r.route.id}function eO(){var e;let t=I.useContext(W_),r=ZR(dl.UseRouteError),n=X_(dl.UseRouteError);return t||((e=r.errors)==null?void 0:e[n])}function tO(){let{router:e}=qR(_p.UseNavigateStable),t=X_(dl.UseNavigateStable),r=I.useRef(!1);return G_(()=>{r.current=!0}),I.useCallback(function(i,o){o===void 0&&(o={}),r.current&&(typeof i=="number"?e.navigate(i):e.navigate(i,Ru({fromRouteId:t},o)))},[e,t])}function rO(e){let{fallbackElement:t,router:r}=e,[n,i]=I.useState(r.state);I.useLayoutEffect(()=>r.subscribe(i),[r,i]);let o=I.useMemo(()=>({createHref:r.createHref,encodeLocation:r.encodeLocation,go:d=>r.navigate(d),push:(d,h,g)=>r.navigate(d,{state:h,preventScrollReset:g==null?void 0:g.preventScrollReset}),replace:(d,h,g)=>r.navigate(d,{replace:!0,state:h,preventScrollReset:g==null?void 0:g.preventScrollReset})}),[r]),a=r.basename||"/",c=I.useMemo(()=>({router:r,navigator:o,static:!1,basename:a}),[r,o,a]);return I.createElement(I.Fragment,null,I.createElement(ng.Provider,{value:c},I.createElement(B_.Provider,{value:n},I.createElement(oO,{basename:r.basename,location:r.state.location,navigationType:r.state.historyAction,navigator:o},r.state.initialized?I.createElement(nO,{routes:r.routes,state:n}):t))),null)}function nO(e){let{routes:t,state:r}=e;return BR(t,void 0,r)}function iO(e){return $R(e.context)}function oO(e){let{basename:t="/",children:r=null,location:n,navigationType:i=vt.Pop,navigator:o,static:a=!1}=e;Al()&&be(!1);let c=t.replace(/^\/*/,"/"),d=I.useMemo(()=>({basename:c,navigator:o,static:a}),[c,o,a]);typeof n=="string"&&(n=_n(n));let{pathname:h="/",search:g="",hash:v="",state:_=null,key:k="default"}=n,C=I.useMemo(()=>{let D=Fs(h,c);return D==null?null:{location:{pathname:D,search:g,hash:v,state:_,key:k},navigationType:i}},[c,h,g,v,_,k,i]);return C==null?null:I.createElement(Us.Provider,{value:d},I.createElement(_d.Provider,{children:r,value:C}))}var _1;(function(e){e[e.pending=0]="pending",e[e.success=1]="success",e[e.error=2]="error"})(_1||(_1={}));new Promise(()=>{});function sO(e){let t={hasErrorBoundary:e.ErrorBoundary!=null||e.errorElement!=null};return e.Component&&Object.assign(t,{element:I.createElement(e.Component),Component:void 0}),e.ErrorBoundary&&Object.assign(t,{errorElement:I.createElement(e.ErrorBoundary),ErrorBoundary:void 0}),t}/** * React Router DOM v6.11.1 * * Copyright (c) Remix Software Inc. @@ -64,10 +64,10 @@ Error generating stack: `+o.message+` * LICENSE.md file in the root directory of this source tree. * * @license MIT - */function fl(){return fl=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0)&&(r[i]=e[i]);return r}function lO(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function cO(e,t){return e.button===0&&(!t||t==="_self")&&!lO(e)}const uO=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"];function dO(e,t){return OR({basename:t==null?void 0:t.basename,future:fl({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:eR({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||fO(),routes:e,mapRouteProperties:sO}).initialize()}function fO(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=fl({},t,{errors:hO(t.errors)})),t}function hO(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,i]of t)if(i&&i.__type==="RouteErrorResponse")r[n]=new tg(i.status,i.statusText,i.data,i.internal===!0);else if(i&&i.__type==="Error"){let o=new Error(i.message);o.stack="",r[n]=o}else r[n]=i;return r}const mO=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pO=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wc=I.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:o,replace:a,state:c,target:d,to:h,preventScrollReset:g}=t,v=aO(t,uO),{basename:_}=I.useContext(Us),b,k=!1;if(typeof h=="string"&&pO.test(h)&&(b=h,mO))try{let w=new URL(window.location.href),S=h.startsWith("//")?new URL(w.protocol+h):new URL(h),E=Vs(S.pathname,_);S.origin===w.origin&&E!=null?h=E+S.search+S.hash:k=!0}catch{}let D=FR(h,{relative:i}),j=gO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i});function y(w){n&&n(w),w.defaultPrevented||j(w)}return I.createElement("a",fl({},v,{href:b||D,onClick:k||o?n:y,ref:r,target:d}))});var S1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmitImpl="useSubmitImpl",e.UseFetcher="useFetcher"})(S1||(S1={}));var b1;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(b1||(b1={}));function gO(e,t){let{target:r,replace:n,state:i,preventScrollReset:o,relative:a}=t===void 0?{}:t,c=ht(),d=si(),h=K_(e,{relative:a});return I.useCallback(g=>{if(cO(g,r)){g.preventDefault();let v=n!==void 0?n:_o(d)===_o(h);c(e,{replace:v,state:i,preventScrollReset:o,relative:a})}},[d,c,h,n,i,r,e,o,a])}var Ot=function(){return Ot=Object.assign||function(t){for(var r,n=1,i=arguments.length;n0?Tt($s,--Mr):0,Rs--,yt===10&&(Rs=1,bd--),yt}function Zr(){return yt=Mr2||Sp(yt)>3?"":" "}function EO(e,t){for(;--t&&Zr()&&!(yt<48||yt>102||yt>57&&yt<65||yt>70&&yt<97););return Cd(e,Jc()+(t<6&&fo()==32&&Zr()==32))}function bp(e){for(;Zr();)switch(yt){case e:return Mr;case 34:case 39:e!==34&&e!==39&&bp(yt);break;case 40:e===41&&bp(e);break;case 92:Zr();break}return Mr}function AO(e,t){for(;Zr()&&e+yt!==47+10;)if(e+yt===42+42&&fo()===47)break;return"/*"+Cd(t,Mr-1)+"*"+og(e===47?e:Zr())}function TO(e){for(;!Sp(fo());)Zr();return Cd(e,Mr)}function RO(e){return DO(eu("",null,null,null,[""],e=CO(e),0,[0],e))}function eu(e,t,r,n,i,o,a,c,d){for(var h=0,g=0,v=a,_=0,b=0,k=0,D=1,j=1,y=1,w=0,S="",E=i,T=o,R=n,P=S;j;)switch(k=w,w=Zr()){case 40:if(k!=108&&Tt(P,v-1)==58){Zc(P+=ye(fh(w),"&","&\f"),"&\f")!=-1&&(y=-1);break}case 34:case 39:case 91:P+=fh(w);break;case 9:case 10:case 13:case 32:P+=jO(k);break;case 92:P+=EO(Jc()-1,7);continue;case 47:switch(fo()){case 42:case 47:xc(OO(AO(Zr(),Jc()),t,r),d);break;default:P+="/"}break;case 123*D:c[h++]=$n(P)*y;case 125*D:case 59:case 0:switch(w){case 0:case 125:j=0;case 59+g:y==-1&&(P=ye(P,/\f/g,"")),b>0&&$n(P)-v&&xc(b>32?C1(P+";",n,r,v-1):C1(ye(P," ","")+";",n,r,v-2),d);break;case 59:P+=";";default:if(xc(R=k1(P,t,r,h,g,i,c,S,E=[],T=[],v),o),w===123)if(g===0)eu(P,t,R,R,E,o,v,c,T);else switch(_===99&&Tt(P,3)===110?100:_){case 100:case 108:case 109:case 115:eu(e,R,R,n&&xc(k1(e,R,R,0,0,i,c,S,i,E=[],v),T),i,T,v,c,n?E:T);break;default:eu(P,R,R,R,[""],T,0,c,T)}}h=g=b=0,D=y=1,S=P="",v=a;break;case 58:v=1+$n(P),b=k;default:if(D<1){if(w==123)--D;else if(w==125&&D++==0&&kO()==125)continue}switch(P+=og(w),w*D){case 38:y=g>0?1:(P+="\f",-1);break;case 44:c[h++]=($n(P)-1)*y,y=1;break;case 64:fo()===45&&(P+=fh(Zr())),_=fo(),g=v=$n(S=P+=TO(Jc())),w++;break;case 45:k===45&&$n(P)==2&&(D=0)}}return o}function k1(e,t,r,n,i,o,a,c,d,h,g){for(var v=i-1,_=i===0?o:[""],b=sg(_),k=0,D=0,j=0;k0?_[y]+" "+w:ye(w,/&\f/g,_[y])))&&(d[j++]=S);return kd(e,t,r,i===0?Sd:c,d,h,g)}function OO(e,t,r){return kd(e,t,r,Q_,og(bO()),Ts(e,2,-2),0)}function C1(e,t,r,n){return kd(e,t,r,ig,Ts(e,0,n),Ts(e,n+1,-1),n)}function eS(e,t,r){switch(_O(e,t)){case 5103:return Me+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Me+e+e;case 4789:return Fa+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Me+e+Fa+e+We+e+e;case 5936:switch(Tt(e,t+11)){case 114:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return Me+e+We+e+e;case 6165:return Me+e+We+"flex-"+e+e;case 5187:return Me+e+ye(e,/(\w+).+(:[^]+)/,Me+"box-$1$2"+We+"flex-$1$2")+e;case 5443:return Me+e+We+"flex-item-"+ye(e,/flex-|-self/g,"")+(vi(e,/flex-|baseline/)?"":We+"grid-row-"+ye(e,/flex-|-self/g,""))+e;case 4675:return Me+e+We+"flex-line-pack"+ye(e,/align-content|flex-|-self/g,"")+e;case 5548:return Me+e+We+ye(e,"shrink","negative")+e;case 5292:return Me+e+We+ye(e,"basis","preferred-size")+e;case 6060:return Me+"box-"+ye(e,"-grow","")+Me+e+We+ye(e,"grow","positive")+e;case 4554:return Me+ye(e,/([^-])(transform)/g,"$1"+Me+"$2")+e;case 6187:return ye(ye(ye(e,/(zoom-|grab)/,Me+"$1"),/(image-set)/,Me+"$1"),e,"")+e;case 5495:case 3959:return ye(e,/(image-set\([^]*)/,Me+"$1$`$1");case 4968:return ye(ye(e,/(.+:)(flex-)?(.*)/,Me+"box-pack:$3"+We+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Me+e+e;case 4200:if(!vi(e,/flex-|baseline/))return We+"grid-column-align"+Ts(e,t)+e;break;case 2592:case 3360:return We+ye(e,"template-","")+e;case 4384:case 3616:return r&&r.some(function(n,i){return t=i,vi(n.props,/grid-\w+-end/)})?~Zc(e+(r=r[t].value),"span")?e:We+ye(e,"-start","")+e+We+"grid-row-span:"+(~Zc(r,"span")?vi(r,/\d+/):+vi(r,/\d+/)-+vi(e,/\d+/))+";":We+ye(e,"-start","")+e;case 4896:case 4128:return r&&r.some(function(n){return vi(n.props,/grid-\w+-start/)})?e:We+ye(ye(e,"-end","-span"),"span ","")+e;case 4095:case 3583:case 4068:case 2532:return ye(e,/(.+)-inline(.+)/,Me+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if($n(e)-1-t>6)switch(Tt(e,t+1)){case 109:if(Tt(e,t+4)!==45)break;case 102:return ye(e,/(.+:)(.+)-([^]+)/,"$1"+Me+"$2-$3$1"+Fa+(Tt(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~Zc(e,"stretch")?eS(ye(e,"stretch","fill-available"),t,r)+e:e}break;case 5152:case 5920:return ye(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(n,i,o,a,c,d,h){return We+i+":"+o+h+(a?We+i+"-span:"+(c?d:+d-+o)+h:"")+e});case 4949:if(Tt(e,t+6)===121)return ye(e,":",":"+Me)+e;break;case 6444:switch(Tt(e,Tt(e,14)===45?18:11)){case 120:return ye(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Me+(Tt(e,14)===45?"inline-":"")+"box$3$1"+Me+"$2$3$1"+We+"$2box$3")+e;case 100:return ye(e,":",":"+We)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ye(e,"scroll-","scroll-snap-")+e}return e}function Va(e,t){for(var r="",n=sg(e),i=0;i-1&&!e.return)switch(e.type){case ig:e.return=eS(e.value,e.length,r);return;case q_:return Va([ya(e,{value:ye(e.value,"@","@"+Me)})],n);case Sd:if(e.length)return SO(e.props,function(i){switch(vi(i,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return Va([ya(e,{props:[ye(i,/:(read-\w+)/,":"+Fa+"$1")]})],n);case"::placeholder":return Va([ya(e,{props:[ye(i,/:(plac\w+)/,":"+Me+"input-$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,":"+Fa+"$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,We+"input-$1")]})],n)}return""})}}var IO={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Os=typeof process<"u"&&process.env!==void 0&&({}.REACT_APP_SC_ATTR||{}.SC_ATTR)||"data-styled",ag=typeof window<"u"&&"HTMLElement"in window,NO=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==""?{}.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&{}.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.SC_DISABLE_SPEEDY!==void 0&&{}.SC_DISABLE_SPEEDY!==""&&{}.SC_DISABLE_SPEEDY!=="false"&&{}.SC_DISABLE_SPEEDY),zO={},lg=Object.freeze([]),So=Object.freeze({});function tS(e,t,r){return r===void 0&&(r=So),e.theme!==r.theme&&e.theme||t||r.theme}var rS=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),YO=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,HO=/(^-|-$)/g;function D1(e){return e.replace(YO,"-").replace(HO,"")}var FO=/(a)(d)/gi,j1=function(e){return String.fromCharCode(e+(e>25?39:97))};function kp(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=j1(t%52)+r;return(j1(t%52)+r).replace(FO,"$1-$2")}var hh,ls=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},nS=function(e){return ls(5381,e)};function iS(e){return kp(nS(e)>>>0)}function VO(e){return e.displayName||e.name||"Component"}function mh(e){return typeof e=="string"&&!0}var oS=typeof Symbol=="function"&&Symbol.for,sS=oS?Symbol.for("react.memo"):60115,UO=oS?Symbol.for("react.forward_ref"):60112,$O={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},BO={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},aS={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},WO=((hh={})[UO]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},hh[sS]=aS,hh);function E1(e){return("type"in(t=e)&&t.type.$$typeof)===sS?aS:"$$typeof"in e?WO[e.$$typeof]:$O;var t}var GO=Object.defineProperty,KO=Object.getOwnPropertyNames,A1=Object.getOwnPropertySymbols,XO=Object.getOwnPropertyDescriptor,QO=Object.getPrototypeOf,T1=Object.prototype;function lS(e,t,r){if(typeof t!="string"){if(T1){var n=QO(t);n&&n!==T1&&lS(e,n,r)}var i=KO(t);A1&&(i=i.concat(A1(t)));for(var o=E1(e),a=E1(t),c=0;c0?" Args: ".concat(t.join(", ")):""))}var qO=function(){function e(t){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=t}return e.prototype.indexOfGroup=function(t){for(var r=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,i=n.length,o=i;t>=o;)if((o<<=1)<0)throw ko(16,"".concat(t));this.groupSizes=new Uint32Array(o),this.groupSizes.set(n),this.length=o;for(var a=i;a=this.length||this.groupSizes[t]===0)return r;for(var n=this.groupSizes[t],i=this.indexOfGroup(t),o=i+n,a=i;a=0)&&(r[i]=e[i]);return r}function lO(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}function cO(e,t){return e.button===0&&(!t||t==="_self")&&!lO(e)}const uO=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset"];function dO(e,t){return OR({basename:t==null?void 0:t.basename,future:fl({},t==null?void 0:t.future,{v7_prependBasename:!0}),history:eR({window:t==null?void 0:t.window}),hydrationData:(t==null?void 0:t.hydrationData)||fO(),routes:e,mapRouteProperties:sO}).initialize()}function fO(){var e;let t=(e=window)==null?void 0:e.__staticRouterHydrationData;return t&&t.errors&&(t=fl({},t,{errors:hO(t.errors)})),t}function hO(e){if(!e)return null;let t=Object.entries(e),r={};for(let[n,i]of t)if(i&&i.__type==="RouteErrorResponse")r[n]=new tg(i.status,i.statusText,i.data,i.internal===!0);else if(i&&i.__type==="Error"){let o=new Error(i.message);o.stack="",r[n]=o}else r[n]=i;return r}const mO=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",pO=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,wc=I.forwardRef(function(t,r){let{onClick:n,relative:i,reloadDocument:o,replace:a,state:c,target:d,to:h,preventScrollReset:g}=t,v=aO(t,uO),{basename:_}=I.useContext(Us),k,C=!1;if(typeof h=="string"&&pO.test(h)&&(k=h,mO))try{let w=new URL(window.location.href),S=h.startsWith("//")?new URL(w.protocol+h):new URL(h),E=Fs(S.pathname,_);S.origin===w.origin&&E!=null?h=E+S.search+S.hash:C=!0}catch{}let D=VR(h,{relative:i}),j=gO(h,{replace:a,state:c,target:d,preventScrollReset:g,relative:i});function y(w){n&&n(w),w.defaultPrevented||j(w)}return I.createElement("a",fl({},v,{href:k||D,onClick:C||o?n:y,ref:r,target:d}))});var S1;(function(e){e.UseScrollRestoration="useScrollRestoration",e.UseSubmitImpl="useSubmitImpl",e.UseFetcher="useFetcher"})(S1||(S1={}));var b1;(function(e){e.UseFetchers="useFetchers",e.UseScrollRestoration="useScrollRestoration"})(b1||(b1={}));function gO(e,t){let{target:r,replace:n,state:i,preventScrollReset:o,relative:a}=t===void 0?{}:t,c=ht(),d=si(),h=K_(e,{relative:a});return I.useCallback(g=>{if(cO(g,r)){g.preventDefault();let v=n!==void 0?n:_o(d)===_o(h);c(e,{replace:v,state:i,preventScrollReset:o,relative:a})}},[d,c,h,n,i,r,e,o,a])}var Ot=function(){return Ot=Object.assign||function(t){for(var r,n=1,i=arguments.length;n0?Tt($s,--Mr):0,Rs--,yt===10&&(Rs=1,bd--),yt}function Zr(){return yt=Mr2||Sp(yt)>3?"":" "}function EO(e,t){for(;--t&&Zr()&&!(yt<48||yt>102||yt>57&&yt<65||yt>70&&yt<97););return Cd(e,Jc()+(t<6&&fo()==32&&Zr()==32))}function bp(e){for(;Zr();)switch(yt){case e:return Mr;case 34:case 39:e!==34&&e!==39&&bp(yt);break;case 40:e===41&&bp(e);break;case 92:Zr();break}return Mr}function AO(e,t){for(;Zr()&&e+yt!==47+10;)if(e+yt===42+42&&fo()===47)break;return"/*"+Cd(t,Mr-1)+"*"+og(e===47?e:Zr())}function TO(e){for(;!Sp(fo());)Zr();return Cd(e,Mr)}function RO(e){return DO(eu("",null,null,null,[""],e=CO(e),0,[0],e))}function eu(e,t,r,n,i,o,a,c,d){for(var h=0,g=0,v=a,_=0,k=0,C=0,D=1,j=1,y=1,w=0,S="",E=i,T=o,R=n,P=S;j;)switch(C=w,w=Zr()){case 40:if(C!=108&&Tt(P,v-1)==58){Zc(P+=ye(fh(w),"&","&\f"),"&\f")!=-1&&(y=-1);break}case 34:case 39:case 91:P+=fh(w);break;case 9:case 10:case 13:case 32:P+=jO(C);break;case 92:P+=EO(Jc()-1,7);continue;case 47:switch(fo()){case 42:case 47:xc(OO(AO(Zr(),Jc()),t,r),d);break;default:P+="/"}break;case 123*D:c[h++]=$n(P)*y;case 125*D:case 59:case 0:switch(w){case 0:case 125:j=0;case 59+g:y==-1&&(P=ye(P,/\f/g,"")),k>0&&$n(P)-v&&xc(k>32?C1(P+";",n,r,v-1):C1(ye(P," ","")+";",n,r,v-2),d);break;case 59:P+=";";default:if(xc(R=k1(P,t,r,h,g,i,c,S,E=[],T=[],v),o),w===123)if(g===0)eu(P,t,R,R,E,o,v,c,T);else switch(_===99&&Tt(P,3)===110?100:_){case 100:case 108:case 109:case 115:eu(e,R,R,n&&xc(k1(e,R,R,0,0,i,c,S,i,E=[],v),T),i,T,v,c,n?E:T);break;default:eu(P,R,R,R,[""],T,0,c,T)}}h=g=k=0,D=y=1,S=P="",v=a;break;case 58:v=1+$n(P),k=C;default:if(D<1){if(w==123)--D;else if(w==125&&D++==0&&kO()==125)continue}switch(P+=og(w),w*D){case 38:y=g>0?1:(P+="\f",-1);break;case 44:c[h++]=($n(P)-1)*y,y=1;break;case 64:fo()===45&&(P+=fh(Zr())),_=fo(),g=v=$n(S=P+=TO(Jc())),w++;break;case 45:C===45&&$n(P)==2&&(D=0)}}return o}function k1(e,t,r,n,i,o,a,c,d,h,g){for(var v=i-1,_=i===0?o:[""],k=sg(_),C=0,D=0,j=0;C0?_[y]+" "+w:ye(w,/&\f/g,_[y])))&&(d[j++]=S);return kd(e,t,r,i===0?Sd:c,d,h,g)}function OO(e,t,r){return kd(e,t,r,Q_,og(bO()),Ts(e,2,-2),0)}function C1(e,t,r,n){return kd(e,t,r,ig,Ts(e,0,n),Ts(e,n+1,-1),n)}function eS(e,t,r){switch(_O(e,t)){case 5103:return Me+"print-"+e+e;case 5737:case 4201:case 3177:case 3433:case 1641:case 4457:case 2921:case 5572:case 6356:case 5844:case 3191:case 6645:case 3005:case 6391:case 5879:case 5623:case 6135:case 4599:case 4855:case 4215:case 6389:case 5109:case 5365:case 5621:case 3829:return Me+e+e;case 4789:return Va+e+e;case 5349:case 4246:case 4810:case 6968:case 2756:return Me+e+Va+e+We+e+e;case 5936:switch(Tt(e,t+11)){case 114:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb")+e;case 108:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"tb-rl")+e;case 45:return Me+e+We+ye(e,/[svh]\w+-[tblr]{2}/,"lr")+e}case 6828:case 4268:case 2903:return Me+e+We+e+e;case 6165:return Me+e+We+"flex-"+e+e;case 5187:return Me+e+ye(e,/(\w+).+(:[^]+)/,Me+"box-$1$2"+We+"flex-$1$2")+e;case 5443:return Me+e+We+"flex-item-"+ye(e,/flex-|-self/g,"")+(vi(e,/flex-|baseline/)?"":We+"grid-row-"+ye(e,/flex-|-self/g,""))+e;case 4675:return Me+e+We+"flex-line-pack"+ye(e,/align-content|flex-|-self/g,"")+e;case 5548:return Me+e+We+ye(e,"shrink","negative")+e;case 5292:return Me+e+We+ye(e,"basis","preferred-size")+e;case 6060:return Me+"box-"+ye(e,"-grow","")+Me+e+We+ye(e,"grow","positive")+e;case 4554:return Me+ye(e,/([^-])(transform)/g,"$1"+Me+"$2")+e;case 6187:return ye(ye(ye(e,/(zoom-|grab)/,Me+"$1"),/(image-set)/,Me+"$1"),e,"")+e;case 5495:case 3959:return ye(e,/(image-set\([^]*)/,Me+"$1$`$1");case 4968:return ye(ye(e,/(.+:)(flex-)?(.*)/,Me+"box-pack:$3"+We+"flex-pack:$3"),/s.+-b[^;]+/,"justify")+Me+e+e;case 4200:if(!vi(e,/flex-|baseline/))return We+"grid-column-align"+Ts(e,t)+e;break;case 2592:case 3360:return We+ye(e,"template-","")+e;case 4384:case 3616:return r&&r.some(function(n,i){return t=i,vi(n.props,/grid-\w+-end/)})?~Zc(e+(r=r[t].value),"span")?e:We+ye(e,"-start","")+e+We+"grid-row-span:"+(~Zc(r,"span")?vi(r,/\d+/):+vi(r,/\d+/)-+vi(e,/\d+/))+";":We+ye(e,"-start","")+e;case 4896:case 4128:return r&&r.some(function(n){return vi(n.props,/grid-\w+-start/)})?e:We+ye(ye(e,"-end","-span"),"span ","")+e;case 4095:case 3583:case 4068:case 2532:return ye(e,/(.+)-inline(.+)/,Me+"$1$2")+e;case 8116:case 7059:case 5753:case 5535:case 5445:case 5701:case 4933:case 4677:case 5533:case 5789:case 5021:case 4765:if($n(e)-1-t>6)switch(Tt(e,t+1)){case 109:if(Tt(e,t+4)!==45)break;case 102:return ye(e,/(.+:)(.+)-([^]+)/,"$1"+Me+"$2-$3$1"+Va+(Tt(e,t+3)==108?"$3":"$2-$3"))+e;case 115:return~Zc(e,"stretch")?eS(ye(e,"stretch","fill-available"),t,r)+e:e}break;case 5152:case 5920:return ye(e,/(.+?):(\d+)(\s*\/\s*(span)?\s*(\d+))?(.*)/,function(n,i,o,a,c,d,h){return We+i+":"+o+h+(a?We+i+"-span:"+(c?d:+d-+o)+h:"")+e});case 4949:if(Tt(e,t+6)===121)return ye(e,":",":"+Me)+e;break;case 6444:switch(Tt(e,Tt(e,14)===45?18:11)){case 120:return ye(e,/(.+:)([^;\s!]+)(;|(\s+)?!.+)?/,"$1"+Me+(Tt(e,14)===45?"inline-":"")+"box$3$1"+Me+"$2$3$1"+We+"$2box$3")+e;case 100:return ye(e,":",":"+We)+e}break;case 5719:case 2647:case 2135:case 3927:case 2391:return ye(e,"scroll-","scroll-snap-")+e}return e}function Fa(e,t){for(var r="",n=sg(e),i=0;i-1&&!e.return)switch(e.type){case ig:e.return=eS(e.value,e.length,r);return;case q_:return Fa([ya(e,{value:ye(e.value,"@","@"+Me)})],n);case Sd:if(e.length)return SO(e.props,function(i){switch(vi(i,/(::plac\w+|:read-\w+)/)){case":read-only":case":read-write":return Fa([ya(e,{props:[ye(i,/:(read-\w+)/,":"+Va+"$1")]})],n);case"::placeholder":return Fa([ya(e,{props:[ye(i,/:(plac\w+)/,":"+Me+"input-$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,":"+Va+"$1")]}),ya(e,{props:[ye(i,/:(plac\w+)/,We+"input-$1")]})],n)}return""})}}var IO={animationIterationCount:1,aspectRatio:1,borderImageOutset:1,borderImageSlice:1,borderImageWidth:1,boxFlex:1,boxFlexGroup:1,boxOrdinalGroup:1,columnCount:1,columns:1,flex:1,flexGrow:1,flexPositive:1,flexShrink:1,flexNegative:1,flexOrder:1,gridRow:1,gridRowEnd:1,gridRowSpan:1,gridRowStart:1,gridColumn:1,gridColumnEnd:1,gridColumnSpan:1,gridColumnStart:1,msGridRow:1,msGridRowSpan:1,msGridColumn:1,msGridColumnSpan:1,fontWeight:1,lineHeight:1,opacity:1,order:1,orphans:1,tabSize:1,widows:1,zIndex:1,zoom:1,WebkitLineClamp:1,fillOpacity:1,floodOpacity:1,stopOpacity:1,strokeDasharray:1,strokeDashoffset:1,strokeMiterlimit:1,strokeOpacity:1,strokeWidth:1},Os=typeof process<"u"&&process.env!==void 0&&({}.REACT_APP_SC_ATTR||{}.SC_ATTR)||"data-styled",ag=typeof window<"u"&&"HTMLElement"in window,NO=!!(typeof SC_DISABLE_SPEEDY=="boolean"?SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==void 0&&{}.REACT_APP_SC_DISABLE_SPEEDY!==""?{}.REACT_APP_SC_DISABLE_SPEEDY!=="false"&&{}.REACT_APP_SC_DISABLE_SPEEDY:typeof process<"u"&&process.env!==void 0&&{}.SC_DISABLE_SPEEDY!==void 0&&{}.SC_DISABLE_SPEEDY!==""&&{}.SC_DISABLE_SPEEDY!=="false"&&{}.SC_DISABLE_SPEEDY),zO={},lg=Object.freeze([]),So=Object.freeze({});function tS(e,t,r){return r===void 0&&(r=So),e.theme!==r.theme&&e.theme||t||r.theme}var rS=new Set(["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","big","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","keygen","label","legend","li","link","main","map","mark","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rp","rt","ruby","s","samp","script","section","select","small","source","span","strong","style","sub","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","title","tr","track","u","ul","use","var","video","wbr","circle","clipPath","defs","ellipse","foreignObject","g","image","line","linearGradient","marker","mask","path","pattern","polygon","polyline","radialGradient","rect","stop","svg","text","tspan"]),YO=/[!"#$%&'()*+,./:;<=>?@[\\\]^`{|}~-]+/g,HO=/(^-|-$)/g;function D1(e){return e.replace(YO,"-").replace(HO,"")}var VO=/(a)(d)/gi,j1=function(e){return String.fromCharCode(e+(e>25?39:97))};function kp(e){var t,r="";for(t=Math.abs(e);t>52;t=t/52|0)r=j1(t%52)+r;return(j1(t%52)+r).replace(VO,"$1-$2")}var hh,ls=function(e,t){for(var r=t.length;r;)e=33*e^t.charCodeAt(--r);return e},nS=function(e){return ls(5381,e)};function iS(e){return kp(nS(e)>>>0)}function FO(e){return e.displayName||e.name||"Component"}function mh(e){return typeof e=="string"&&!0}var oS=typeof Symbol=="function"&&Symbol.for,sS=oS?Symbol.for("react.memo"):60115,UO=oS?Symbol.for("react.forward_ref"):60112,$O={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},BO={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},aS={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},WO=((hh={})[UO]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},hh[sS]=aS,hh);function E1(e){return("type"in(t=e)&&t.type.$$typeof)===sS?aS:"$$typeof"in e?WO[e.$$typeof]:$O;var t}var GO=Object.defineProperty,KO=Object.getOwnPropertyNames,A1=Object.getOwnPropertySymbols,XO=Object.getOwnPropertyDescriptor,QO=Object.getPrototypeOf,T1=Object.prototype;function lS(e,t,r){if(typeof t!="string"){if(T1){var n=QO(t);n&&n!==T1&&lS(e,n,r)}var i=KO(t);A1&&(i=i.concat(A1(t)));for(var o=E1(e),a=E1(t),c=0;c0?" Args: ".concat(t.join(", ")):""))}var qO=function(){function e(t){this.groupSizes=new Uint32Array(512),this.length=512,this.tag=t}return e.prototype.indexOfGroup=function(t){for(var r=0,n=0;n=this.groupSizes.length){for(var n=this.groupSizes,i=n.length,o=i;t>=o;)if((o<<=1)<0)throw ko(16,"".concat(t));this.groupSizes=new Uint32Array(o),this.groupSizes.set(n),this.length=o;for(var a=i;a=this.length||this.groupSizes[t]===0)return r;for(var n=this.groupSizes[t],i=this.indexOfGroup(t),o=i+n,a=i;a=0;h--){var g=d[h];if(g&&g.nodeType===1&&g.hasAttribute(Os))return g}}(r),o=i!==void 0?i.nextSibling:null;n.setAttribute(Os,"active"),n.setAttribute("data-styled-version","6.0.0-rc.1");var a=nP();return a&&n.setAttribute("nonce",a),r.insertBefore(n,o),n},iP=function(){function e(t){this.element=cS(t),this.element.appendChild(document.createTextNode("")),this.sheet=function(r){if(r.sheet)return r.sheet;for(var n=document.styleSheets,i=0,o=n.length;i=0){var n=document.createTextNode(r);return this.element.insertBefore(n,this.nodes[t]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(t){this.element.removeChild(this.nodes[t]),this.length--},e.prototype.getRule=function(t){return t0&&(_+="".concat(b,","))}),i+="".concat(g).concat(v,'{content:"').concat(_,'"}').concat(`/*!sc*/ -`)},a=0;a0?".".concat(t):_},g=d.slice();a.prefix&&g.unshift(LO),g.push(function(_){_.type===Sd&&_.value.includes("&")&&(_.props[0]=_.props[0].replace(lP,r).replace(n,h))},PO);var v=function(_,b,k,D){b===void 0&&(b=""),k===void 0&&(k=""),D===void 0&&(D="&"),t=D,r=b,n=new RegExp("\\".concat(r,"\\b"),"g");var j=_.replace(cP,""),y=RO(k||b?"".concat(k," ").concat(b," { ").concat(j," }"):j);return a.namespace&&(y=uS(y,a.namespace)),function(w,S){for(var E=[],T=0,R=void 0;T="A"&&e<="Z"};function O1(e){for(var t="",r=0;r>>0);if(!r.hasNameForId(this.componentId,a)){var c=n(o,".".concat(a),void 0,this.componentId);r.insertRules(this.componentId,a,c)}i=ao(i,a),this.staticRulesId=a}else{for(var d=ls(this.baseHash,n.hash),h="",g=0;g>>0);r.hasNameForId(this.componentId,b)||r.insertRules(this.componentId,b,n(h,".".concat(b),void 0,this.componentId)),i=ao(i,b)}}return i},e}(),ug=Rt.createContext(void 0);ug.Consumer;function dg(){return I.useContext(ug)}function gP(e){var t=dg(),r=I.useMemo(function(){return function(n,i){if(!n)throw ko(14);if(bo(n)){var o=n(i);return o}if(Array.isArray(n)||typeof n!="object")throw ko(8);return i?Ot(Ot({},i),n):n}(e.theme,t)},[e.theme,t]);return e.children?Rt.createElement(ug.Provider,{value:r},e.children):null}var gh={};function vP(e,t,r){var n=cg(e),i=e,o=!mh(e),a=t.attrs,c=a===void 0?lg:a,d=t.componentId,h=d===void 0?function(T,R){var P=typeof T!="string"?"sc":D1(T);gh[P]=(gh[P]||0)+1;var O="".concat(P,"-").concat(iS("6.0.0-rc.1"+P+gh[P]));return R?"".concat(R,"-").concat(O):O}(t.displayName,t.parentComponentId):d,g=t.displayName,v=g===void 0?function(T){return mh(T)?"styled.".concat(T):"Styled(".concat(VO(T),")")}(e):g,_=t.displayName&&t.componentId?"".concat(D1(t.displayName),"-").concat(t.componentId):t.componentId||h,b=n&&i.attrs?i.attrs.concat(c).filter(Boolean):c,k=t.shouldForwardProp;if(n&&i.shouldForwardProp){var D=i.shouldForwardProp;if(t.shouldForwardProp){var j=t.shouldForwardProp;k=function(T,R){return D(T,R)&&j(T,R)}}else k=D}var y=new pP(r,_,n?i.componentStyle:void 0),w=y.isStatic&&c.length===0;function S(T,R){return function(P,O,z,Y){var ee=P.attrs,te=P.componentStyle,G=P.defaultProps,lt=P.foldedComponentIds,Ee=P.styledComponentId,ze=P.target,mt=dg(),$=Ep(),le=P.shouldForwardProp||$.shouldForwardProp,Q=function(zt,rr,Yr){for(var Hr,mr=Ot(Ot({},rr),{className:void 0,theme:Yr}),Ki=0;Ki2&&Pu.registerId(this.componentId+t),this.removeStyles(t,n),this.createStyles(t,r,n,i)},e}();function wP(e){for(var t=[],r=1;r=0;h--){var g=d[h];if(g&&g.nodeType===1&&g.hasAttribute(Os))return g}}(r),o=i!==void 0?i.nextSibling:null;n.setAttribute(Os,"active"),n.setAttribute("data-styled-version","6.0.0-rc.1");var a=nP();return a&&n.setAttribute("nonce",a),r.insertBefore(n,o),n},iP=function(){function e(t){this.element=cS(t),this.element.appendChild(document.createTextNode("")),this.sheet=function(r){if(r.sheet)return r.sheet;for(var n=document.styleSheets,i=0,o=n.length;i=0){var n=document.createTextNode(r);return this.element.insertBefore(n,this.nodes[t]||null),this.length++,!0}return!1},e.prototype.deleteRule=function(t){this.element.removeChild(this.nodes[t]),this.length--},e.prototype.getRule=function(t){return t0&&(_+="".concat(k,","))}),i+="".concat(g).concat(v,'{content:"').concat(_,'"}').concat(`/*!sc*/ +`)},a=0;a0?".".concat(t):_},g=d.slice();a.prefix&&g.unshift(LO),g.push(function(_){_.type===Sd&&_.value.includes("&")&&(_.props[0]=_.props[0].replace(lP,r).replace(n,h))},PO);var v=function(_,k,C,D){k===void 0&&(k=""),C===void 0&&(C=""),D===void 0&&(D="&"),t=D,r=k,n=new RegExp("\\".concat(r,"\\b"),"g");var j=_.replace(cP,""),y=RO(C||k?"".concat(C," ").concat(k," { ").concat(j," }"):j);return a.namespace&&(y=uS(y,a.namespace)),function(w,S){for(var E=[],T=0,R=void 0;T="A"&&e<="Z"};function O1(e){for(var t="",r=0;r>>0);if(!r.hasNameForId(this.componentId,a)){var c=n(o,".".concat(a),void 0,this.componentId);r.insertRules(this.componentId,a,c)}i=ao(i,a),this.staticRulesId=a}else{for(var d=ls(this.baseHash,n.hash),h="",g=0;g>>0);r.hasNameForId(this.componentId,k)||r.insertRules(this.componentId,k,n(h,".".concat(k),void 0,this.componentId)),i=ao(i,k)}}return i},e}(),ug=Rt.createContext(void 0);ug.Consumer;function dg(){return I.useContext(ug)}function gP(e){var t=dg(),r=I.useMemo(function(){return function(n,i){if(!n)throw ko(14);if(bo(n)){var o=n(i);return o}if(Array.isArray(n)||typeof n!="object")throw ko(8);return i?Ot(Ot({},i),n):n}(e.theme,t)},[e.theme,t]);return e.children?Rt.createElement(ug.Provider,{value:r},e.children):null}var gh={};function vP(e,t,r){var n=cg(e),i=e,o=!mh(e),a=t.attrs,c=a===void 0?lg:a,d=t.componentId,h=d===void 0?function(T,R){var P=typeof T!="string"?"sc":D1(T);gh[P]=(gh[P]||0)+1;var O="".concat(P,"-").concat(iS("6.0.0-rc.1"+P+gh[P]));return R?"".concat(R,"-").concat(O):O}(t.displayName,t.parentComponentId):d,g=t.displayName,v=g===void 0?function(T){return mh(T)?"styled.".concat(T):"Styled(".concat(FO(T),")")}(e):g,_=t.displayName&&t.componentId?"".concat(D1(t.displayName),"-").concat(t.componentId):t.componentId||h,k=n&&i.attrs?i.attrs.concat(c).filter(Boolean):c,C=t.shouldForwardProp;if(n&&i.shouldForwardProp){var D=i.shouldForwardProp;if(t.shouldForwardProp){var j=t.shouldForwardProp;C=function(T,R){return D(T,R)&&j(T,R)}}else C=D}var y=new pP(r,_,n?i.componentStyle:void 0),w=y.isStatic&&c.length===0;function S(T,R){return function(P,O,z,Y){var ee=P.attrs,te=P.componentStyle,G=P.defaultProps,lt=P.foldedComponentIds,Ee=P.styledComponentId,ze=P.target,mt=dg(),$=Ep(),le=P.shouldForwardProp||$.shouldForwardProp,Q=function(zt,rr,Yr){for(var Hr,mr=Ot(Ot({},rr),{className:void 0,theme:Yr}),Ki=0;Ki2&&Pu.registerId(this.componentId+t),this.removeStyles(t,n),this.createStyles(t,r,n,i)},e}();function wP(e){for(var t=[],r=1;rwS=e,FP=()=>wS,VP=I.createContext(null);var Rp={},UP={get exports(){return Rp},set exports(e){Rp=e}},Ie={};/** @license React v16.13.1 + */var Dd=I,RP=Tp;function OP(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var PP=typeof Object.is=="function"?Object.is:OP,MP=RP.useSyncExternalStore,LP=Dd.useRef,IP=Dd.useEffect,NP=Dd.useMemo,zP=Dd.useDebugValue;yS.useSyncExternalStoreWithSelector=function(e,t,r,n,i){var o=LP(null);if(o.current===null){var a={hasValue:!1,value:null};o.current=a}else a=o.current;o=NP(function(){function d(k){if(!h){if(h=!0,g=k,k=n(k),i!==void 0&&a.hasValue){var C=a.value;if(i(C,k))return v=C}return v=k}if(C=v,PP(g,k))return C;var D=n(k);return i!==void 0&&i(C,D)?C:(g=k,v=D)}var h=!1,g,v,_=r===void 0?null:r;return[function(){return d(t())},_===null?void 0:function(){return d(_())}]},[t,r,n,i]);var c=MP(e,o[0],o[1]);return IP(function(){a.hasValue=!0,a.value=c},[c]),zP(c),c};(function(e){e.exports=yS})(TP);function YP(e){e()}let wS=YP;const HP=e=>wS=e,VP=()=>wS,FP=I.createContext(null);var Rp={},UP={get exports(){return Rp},set exports(e){Rp=e}},Ie={};/** @license React v16.13.1 * react-is.production.min.js * * Copyright (c) Facebook, Inc. and its affiliates. @@ -98,7 +98,7 @@ Error generating stack: `+o.message+` * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. - */var pg=Symbol.for("react.element"),gg=Symbol.for("react.portal"),Nd=Symbol.for("react.fragment"),zd=Symbol.for("react.strict_mode"),Yd=Symbol.for("react.profiler"),Hd=Symbol.for("react.provider"),Fd=Symbol.for("react.context"),ZP=Symbol.for("react.server_context"),Vd=Symbol.for("react.forward_ref"),Ud=Symbol.for("react.suspense"),$d=Symbol.for("react.suspense_list"),Bd=Symbol.for("react.memo"),Wd=Symbol.for("react.lazy"),JP=Symbol.for("react.offscreen"),bS;bS=Symbol.for("react.module.reference");function Lr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case pg:switch(e=e.type,e){case Nd:case Yd:case zd:case Ud:case $d:return e;default:switch(e=e&&e.$$typeof,e){case ZP:case Fd:case Vd:case Wd:case Bd:case Hd:return e;default:return t}}case gg:return t}}}Ne.ContextConsumer=Fd;Ne.ContextProvider=Hd;Ne.Element=pg;Ne.ForwardRef=Vd;Ne.Fragment=Nd;Ne.Lazy=Wd;Ne.Memo=Bd;Ne.Portal=gg;Ne.Profiler=Yd;Ne.StrictMode=zd;Ne.Suspense=Ud;Ne.SuspenseList=$d;Ne.isAsyncMode=function(){return!1};Ne.isConcurrentMode=function(){return!1};Ne.isContextConsumer=function(e){return Lr(e)===Fd};Ne.isContextProvider=function(e){return Lr(e)===Hd};Ne.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===pg};Ne.isForwardRef=function(e){return Lr(e)===Vd};Ne.isFragment=function(e){return Lr(e)===Nd};Ne.isLazy=function(e){return Lr(e)===Wd};Ne.isMemo=function(e){return Lr(e)===Bd};Ne.isPortal=function(e){return Lr(e)===gg};Ne.isProfiler=function(e){return Lr(e)===Yd};Ne.isStrictMode=function(e){return Lr(e)===zd};Ne.isSuspense=function(e){return Lr(e)===Ud};Ne.isSuspenseList=function(e){return Lr(e)===$d};Ne.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Nd||e===Yd||e===zd||e===Ud||e===$d||e===JP||typeof e=="object"&&e!==null&&(e.$$typeof===Wd||e.$$typeof===Bd||e.$$typeof===Hd||e.$$typeof===Fd||e.$$typeof===Vd||e.$$typeof===bS||e.getModuleId!==void 0)};Ne.typeOf=Lr;(function(e){e.exports=Ne})(qP);function e4(){const e=FP();let t=null,r=null;return{clear(){t=null,r=null},notify(){e(()=>{let n=t;for(;n;)n.callback(),n=n.next})},get(){let n=[],i=t;for(;i;)n.push(i),i=i.next;return n},subscribe(n){let i=!0,o=r={callback:n,next:null,prev:r};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const N1={notify(){},get:()=>[]};function t4(e,t){let r,n=N1;function i(v){return d(),n.subscribe(v)}function o(){n.notify()}function a(){g.onStateChange&&g.onStateChange()}function c(){return!!r}function d(){r||(r=t?t.addNestedSub(a):e.subscribe(a),n=e4())}function h(){r&&(r(),r=void 0,n.clear(),n=N1)}const g={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:a,isSubscribed:c,trySubscribe:d,tryUnsubscribe:h,getListeners:()=>n};return g}const r4=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",n4=r4?I.useLayoutEffect:I.useEffect;function i4({store:e,context:t,children:r,serverState:n}){const i=I.useMemo(()=>{const c=t4(e);return{store:e,subscription:c,getServerState:n?()=>n:void 0}},[e,n]),o=I.useMemo(()=>e.getState(),[e]);n4(()=>{const{subscription:c}=i;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),o!==e.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[i,o]);const a=t||VP;return Rt.createElement(a.Provider,{value:i},r)}HP(su.unstable_batchedUpdates);const o4=wP` + */var pg=Symbol.for("react.element"),gg=Symbol.for("react.portal"),Nd=Symbol.for("react.fragment"),zd=Symbol.for("react.strict_mode"),Yd=Symbol.for("react.profiler"),Hd=Symbol.for("react.provider"),Vd=Symbol.for("react.context"),ZP=Symbol.for("react.server_context"),Fd=Symbol.for("react.forward_ref"),Ud=Symbol.for("react.suspense"),$d=Symbol.for("react.suspense_list"),Bd=Symbol.for("react.memo"),Wd=Symbol.for("react.lazy"),JP=Symbol.for("react.offscreen"),bS;bS=Symbol.for("react.module.reference");function Lr(e){if(typeof e=="object"&&e!==null){var t=e.$$typeof;switch(t){case pg:switch(e=e.type,e){case Nd:case Yd:case zd:case Ud:case $d:return e;default:switch(e=e&&e.$$typeof,e){case ZP:case Vd:case Fd:case Wd:case Bd:case Hd:return e;default:return t}}case gg:return t}}}Ne.ContextConsumer=Vd;Ne.ContextProvider=Hd;Ne.Element=pg;Ne.ForwardRef=Fd;Ne.Fragment=Nd;Ne.Lazy=Wd;Ne.Memo=Bd;Ne.Portal=gg;Ne.Profiler=Yd;Ne.StrictMode=zd;Ne.Suspense=Ud;Ne.SuspenseList=$d;Ne.isAsyncMode=function(){return!1};Ne.isConcurrentMode=function(){return!1};Ne.isContextConsumer=function(e){return Lr(e)===Vd};Ne.isContextProvider=function(e){return Lr(e)===Hd};Ne.isElement=function(e){return typeof e=="object"&&e!==null&&e.$$typeof===pg};Ne.isForwardRef=function(e){return Lr(e)===Fd};Ne.isFragment=function(e){return Lr(e)===Nd};Ne.isLazy=function(e){return Lr(e)===Wd};Ne.isMemo=function(e){return Lr(e)===Bd};Ne.isPortal=function(e){return Lr(e)===gg};Ne.isProfiler=function(e){return Lr(e)===Yd};Ne.isStrictMode=function(e){return Lr(e)===zd};Ne.isSuspense=function(e){return Lr(e)===Ud};Ne.isSuspenseList=function(e){return Lr(e)===$d};Ne.isValidElementType=function(e){return typeof e=="string"||typeof e=="function"||e===Nd||e===Yd||e===zd||e===Ud||e===$d||e===JP||typeof e=="object"&&e!==null&&(e.$$typeof===Wd||e.$$typeof===Bd||e.$$typeof===Hd||e.$$typeof===Vd||e.$$typeof===Fd||e.$$typeof===bS||e.getModuleId!==void 0)};Ne.typeOf=Lr;(function(e){e.exports=Ne})(qP);function e4(){const e=VP();let t=null,r=null;return{clear(){t=null,r=null},notify(){e(()=>{let n=t;for(;n;)n.callback(),n=n.next})},get(){let n=[],i=t;for(;i;)n.push(i),i=i.next;return n},subscribe(n){let i=!0,o=r={callback:n,next:null,prev:r};return o.prev?o.prev.next=o:t=o,function(){!i||t===null||(i=!1,o.next?o.next.prev=o.prev:r=o.prev,o.prev?o.prev.next=o.next:t=o.next)}}}}const N1={notify(){},get:()=>[]};function t4(e,t){let r,n=N1;function i(v){return d(),n.subscribe(v)}function o(){n.notify()}function a(){g.onStateChange&&g.onStateChange()}function c(){return!!r}function d(){r||(r=t?t.addNestedSub(a):e.subscribe(a),n=e4())}function h(){r&&(r(),r=void 0,n.clear(),n=N1)}const g={addNestedSub:i,notifyNestedSubs:o,handleChangeWrapper:a,isSubscribed:c,trySubscribe:d,tryUnsubscribe:h,getListeners:()=>n};return g}const r4=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",n4=r4?I.useLayoutEffect:I.useEffect;function i4({store:e,context:t,children:r,serverState:n}){const i=I.useMemo(()=>{const c=t4(e);return{store:e,subscription:c,getServerState:n?()=>n:void 0}},[e,n]),o=I.useMemo(()=>e.getState(),[e]);n4(()=>{const{subscription:c}=i;return c.onStateChange=c.notifyNestedSubs,c.trySubscribe(),o!==e.getState()&&c.notifyNestedSubs(),()=>{c.tryUnsubscribe(),c.onStateChange=void 0}},[i,o]);const a=t||FP;return Rt.createElement(a.Provider,{value:i},r)}HP(su.unstable_batchedUpdates);const o4=wP` *{ box-sizing: border-box; } @@ -467,7 +467,7 @@ Error generating stack: `+o.message+` border-radius: 0.24rem; border: 0.02rem solid #7680DD; margin-left: 0.24rem; -`,ES=I.createContext({color:"dark",mode:"default",activeId:"home"}),Y4=new Map([["products","product"],["rdma","product"],["solutions","solution"],["resources1","resource"],["resources2","resource"],["news-honor-dynamic","resource"],["tech-talk","resource"],["events","resource"],["blogs","resource"],["clients","client"],["company1","company"],["company2","company"],["job-description","company"]]),H4=({items:e,color:t="dark",mode:r="default"})=>{const n=ht(),i=si(),o=Y4.get(i.pathname.split("/")[1]);return l.jsx(ES.Provider,{value:{color:t,mode:r,activeId:o},children:l.jsx(M4,{color:t,mode:r,children:l.jsxs(L4,{children:[l.jsx(I4,{src:jS,alt:"达坦科技",onClick:()=>n("/")}),l.jsx(N4,{}),window.innerWidth>425?l.jsx(P4,{items:e}):null,l.jsx(z4,{onClick:()=>window.location.href="https://datenlord.github.io/",children:"中/英"})]})})})},AS=[{key:"product",label:"产品",children:[{key:"service",label:"DatenLord Cloud Service",url:"/service"},{key:"app",label:"DatenLord Appliance",url:"/app"}]},{key:"solution",label:"解决方案",children:[{key:"ai",label:"AI 推理",url:"/solutions/ai"},{key:"storage",label:"高性能存储",url:"/solutions/storage"},{key:"networks",label:"高性能网络",url:"/solutions/networks"}]},{key:"resource",label:"资源",children:[{key:"tech-share",label:"技术分享",url:"/resources2/tech-share"},{key:"dynamics",label:"达坦动态",url:"/resources2/dynamics"},{key:"blog",label:"技术博客",url:"/resources2/blog"}]},{key:"community",label:"社区",children:[{key:"open-source-community",label:"开源社区",url:"/community"},{key:"open-source-project",label:"开源项目",url:"/community"},{key:"learning-community",label:"学习社区",url:"/community"}]},{key:"company",label:"公司",children:[{key:"about-us",label:"关于我们",url:"/company1/about-us"},{key:"join-us",label:"加入我们",url:"/company2/join-us"},{key:"contact-us",label:"联系我们",url:"/company2/contact-us"}]}],{Paragraph:F4}=Pe,{CNBodyLarge:TS}=F4,V4=f.footer` +`,ES=I.createContext({color:"dark",mode:"default",activeId:"home"}),Y4=new Map([["products","product"],["rdma","product"],["solutions","solution"],["resources1","resource"],["resources2","resource"],["news-honor-dynamic","resource"],["tech-talk","resource"],["events","resource"],["blogs","resource"],["clients","client"],["company1","company"],["company2","company"],["job-description","company"]]),H4=({items:e,color:t="dark",mode:r="default"})=>{const n=ht(),i=si(),o=Y4.get(i.pathname.split("/")[1]);return l.jsx(ES.Provider,{value:{color:t,mode:r,activeId:o},children:l.jsx(M4,{color:t,mode:r,children:l.jsxs(L4,{children:[l.jsx(I4,{src:jS,alt:"达坦科技",onClick:()=>n("/")}),l.jsx(N4,{}),window.innerWidth>425?l.jsx(P4,{items:e}):null,l.jsx(z4,{onClick:()=>window.location.href="https://datenlord.github.io/",children:"中/英"})]})})})},AS=[{key:"product",label:"产品",children:[{key:"service",label:"DatenLord Cloud Service",url:"/service"},{key:"app",label:"DatenLord Appliance",url:"/app"}]},{key:"solution",label:"解决方案",children:[{key:"ai",label:"AI 推理",url:"/solutions/ai"},{key:"storage",label:"高性能存储",url:"/solutions/storage"},{key:"networks",label:"高性能网络",url:"/solutions/networks"}]},{key:"resource",label:"资源",children:[{key:"tech-share",label:"技术分享",url:"/resources2/tech-share"},{key:"dynamics",label:"达坦动态",url:"/resources2/dynamics"},{key:"blog",label:"技术博客",url:"/resources2/blog"}]},{key:"community",label:"社区",children:[{key:"open-source-community",label:"开源社区",url:"/community"},{key:"open-source-project",label:"开源项目",url:"/community"},{key:"learning-community",label:"学习社区",url:"/community"}]},{key:"company",label:"公司",children:[{key:"about-us",label:"关于我们",url:"/company1/about-us"},{key:"join-us",label:"加入我们",url:"/company2/join-us"},{key:"contact-us",label:"联系我们",url:"/company2/contact-us"}]}],{Paragraph:V4}=Pe,{CNBodyLarge:TS}=V4,F4=f.footer` color: #fff; background-color: ${e=>e.theme.themeDark}; `,U4=f.div` @@ -508,13 +508,13 @@ Error generating stack: `+o.message+` border-bottom: 1px solid #fff; `,q4=f(TS)` padding-top: 0.14rem; -`,Z4=()=>{const e=ht();return l.jsx(l.Fragment,{children:l.jsx(V4,{children:l.jsxs(U4,{children:[l.jsxs(Q4,{children:[l.jsx($4,{src:jS}),l.jsx(B4,{children:AS.map(({key:t,label:r,children:n})=>l.jsxs(W4,{children:[l.jsx(G4,{children:r}),l.jsx(K4,{children:(n||[]).map(({key:i,label:o,url:a})=>l.jsx(X4,{onClick:()=>{a&&e(a)},children:l.jsx(TS,{children:o})},i))})]},t))})]}),l.jsx(q4,{style:{textAlign:"center"},children:"北京达坦科技有限公司©2023版权所有"})]})})})},J4=f.div` +`,Z4=()=>{const e=ht();return l.jsx(l.Fragment,{children:l.jsx(F4,{children:l.jsxs(U4,{children:[l.jsxs(Q4,{children:[l.jsx($4,{src:jS}),l.jsx(B4,{children:AS.map(({key:t,label:r,children:n})=>l.jsxs(W4,{children:[l.jsx(G4,{children:r}),l.jsx(K4,{children:(n||[]).map(({key:i,label:o,url:a})=>l.jsx(X4,{onClick:()=>{a&&e(a)},children:l.jsx(TS,{children:o})},i))})]},t))})]}),l.jsx(q4,{style:{textAlign:"center"},children:"北京达坦科技有限公司©2023版权所有"})]})})})},J4=f.div` height: 0.72rem; -`,eM=()=>{const e=si(),[t,r]=I.useState("down"),[n,i]=I.useState(!1);I.useEffect(()=>{let d=window.scrollY,h=!1;const g=()=>{const _=window.scrollY;if(_>1e3?i(!0):i(!1),Math.abs(_-d)<0){h=!1;return}r(_>d?"down":"up"),d=_>0?_:0,h=!1},v=()=>{h||(window.requestAnimationFrame(g),h=!0)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[t]);const o=()=>n&&t==="up"?"fixed":"default",a=()=>e.pathname.split("/")[1]==="job-description"||(e.pathname.split("/")[1]==="blogs"||e.pathname.split("/")[1]==="events"||e.pathname.split("/")[1]==="highlights"||e.pathname.split("/")[1]==="news-honor-dynamic")&&e.pathname.split("/")[2]||n&&t==="up"?"dark":"transparent";return l.jsxs(l.Fragment,{children:[l.jsx(H4,{items:AS,mode:o(),color:a()}),o()==="fixed"&&l.jsx(J4,{}),l.jsx(iO,{}),l.jsx(Z4,{})]})};var RS={},OS={},Gd={},PS={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0},r=t;e.default=r})(PS);var tM="Expected a function",z1=0/0,rM="[object Symbol]",nM=/^\s+|\s+$/g,iM=/^[-+]0x[0-9a-f]+$/i,oM=/^0b[01]+$/i,sM=/^0o[0-7]+$/i,aM=parseInt,lM=typeof Go=="object"&&Go&&Go.Object===Object&&Go,cM=typeof self=="object"&&self&&self.Object===Object&&self,uM=lM||cM||Function("return this")(),dM=Object.prototype,fM=dM.toString,hM=Math.max,mM=Math.min,yh=function(){return uM.Date.now()};function pM(e,t,r){var n,i,o,a,c,d,h=0,g=!1,v=!1,_=!0;if(typeof e!="function")throw new TypeError(tM);t=Y1(t)||0,Op(r)&&(g=!!r.leading,v="maxWait"in r,o=v?hM(Y1(r.maxWait)||0,t):o,_="trailing"in r?!!r.trailing:_);function b(R){var P=n,O=i;return n=i=void 0,h=R,a=e.apply(O,P),a}function k(R){return h=R,c=setTimeout(y,t),g?b(R):a}function D(R){var P=R-d,O=R-h,z=t-P;return v?mM(z,o-O):z}function j(R){var P=R-d,O=R-h;return d===void 0||P>=t||P<0||v&&O>=o}function y(){var R=yh();if(j(R))return w(R);c=setTimeout(y,D(R))}function w(R){return c=void 0,_&&n?b(R):(n=i=void 0,a)}function S(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function E(){return c===void 0?a:w(yh())}function T(){var R=yh(),P=j(R);if(n=arguments,i=this,d=R,P){if(c===void 0)return k(d);if(v)return c=setTimeout(y,t),b(d)}return c===void 0&&(c=setTimeout(y,t)),a}return T.cancel=S,T.flush=E,T}function Op(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function gM(e){return!!e&&typeof e=="object"}function vM(e){return typeof e=="symbol"||gM(e)&&fM.call(e)==rM}function Y1(e){if(typeof e=="number")return e;if(vM(e))return z1;if(Op(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=Op(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(nM,"");var r=oM.test(e);return r||sM.test(e)?aM(e.slice(2),r?2:8):iM.test(e)?z1:+e}var yM=pM,Ms={},wM={get exports(){return Ms},set exports(e){Ms=e}};/*! +`,eM=()=>{const e=si(),[t,r]=I.useState("down"),[n,i]=I.useState(!1);I.useEffect(()=>{let d=window.scrollY,h=!1;const g=()=>{const _=window.scrollY;if(_>1e3?i(!0):i(!1),Math.abs(_-d)<0){h=!1;return}r(_>d?"down":"up"),d=_>0?_:0,h=!1},v=()=>{h||(window.requestAnimationFrame(g),h=!0)};return window.addEventListener("scroll",v),()=>window.removeEventListener("scroll",v)},[t]);const o=()=>n&&t==="up"?"fixed":"default",a=()=>e.pathname.split("/")[1]==="job-description"||(e.pathname.split("/")[1]==="blogs"||e.pathname.split("/")[1]==="events"||e.pathname.split("/")[1]==="highlights"||e.pathname.split("/")[1]==="news-honor-dynamic")&&e.pathname.split("/")[2]||n&&t==="up"?"dark":"transparent";return l.jsxs(l.Fragment,{children:[l.jsx(H4,{items:AS,mode:o(),color:a()}),o()==="fixed"&&l.jsx(J4,{}),l.jsx(iO,{}),l.jsx(Z4,{})]})};var RS={},OS={},Gd={},PS={};(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t={animating:!1,autoplaying:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,dragging:!1,edgeDragged:!1,initialized:!1,lazyLoadedList:[],listHeight:null,listWidth:null,scrolling:!1,slideCount:null,slideHeight:null,slideWidth:null,swipeLeft:null,swiped:!1,swiping:!1,touchObject:{startX:0,startY:0,curX:0,curY:0},trackStyle:{},trackWidth:0,targetSlide:0},r=t;e.default=r})(PS);var tM="Expected a function",z1=0/0,rM="[object Symbol]",nM=/^\s+|\s+$/g,iM=/^[-+]0x[0-9a-f]+$/i,oM=/^0b[01]+$/i,sM=/^0o[0-7]+$/i,aM=parseInt,lM=typeof Go=="object"&&Go&&Go.Object===Object&&Go,cM=typeof self=="object"&&self&&self.Object===Object&&self,uM=lM||cM||Function("return this")(),dM=Object.prototype,fM=dM.toString,hM=Math.max,mM=Math.min,yh=function(){return uM.Date.now()};function pM(e,t,r){var n,i,o,a,c,d,h=0,g=!1,v=!1,_=!0;if(typeof e!="function")throw new TypeError(tM);t=Y1(t)||0,Op(r)&&(g=!!r.leading,v="maxWait"in r,o=v?hM(Y1(r.maxWait)||0,t):o,_="trailing"in r?!!r.trailing:_);function k(R){var P=n,O=i;return n=i=void 0,h=R,a=e.apply(O,P),a}function C(R){return h=R,c=setTimeout(y,t),g?k(R):a}function D(R){var P=R-d,O=R-h,z=t-P;return v?mM(z,o-O):z}function j(R){var P=R-d,O=R-h;return d===void 0||P>=t||P<0||v&&O>=o}function y(){var R=yh();if(j(R))return w(R);c=setTimeout(y,D(R))}function w(R){return c=void 0,_&&n?k(R):(n=i=void 0,a)}function S(){c!==void 0&&clearTimeout(c),h=0,n=d=i=c=void 0}function E(){return c===void 0?a:w(yh())}function T(){var R=yh(),P=j(R);if(n=arguments,i=this,d=R,P){if(c===void 0)return C(d);if(v)return c=setTimeout(y,t),k(d)}return c===void 0&&(c=setTimeout(y,t)),a}return T.cancel=S,T.flush=E,T}function Op(e){var t=typeof e;return!!e&&(t=="object"||t=="function")}function gM(e){return!!e&&typeof e=="object"}function vM(e){return typeof e=="symbol"||gM(e)&&fM.call(e)==rM}function Y1(e){if(typeof e=="number")return e;if(vM(e))return z1;if(Op(e)){var t=typeof e.valueOf=="function"?e.valueOf():e;e=Op(t)?t+"":t}if(typeof e!="string")return e===0?e:+e;e=e.replace(nM,"");var r=oM.test(e);return r||sM.test(e)?aM(e.slice(2),r?2:8):iM.test(e)?z1:+e}var yM=pM,Ms={},wM={get exports(){return Ms},set exports(e){Ms=e}};/*! Copyright (c) 2018 Jed Watson. Licensed under the MIT License (MIT), see http://jedwatson.github.io/classnames -*/(function(e){(function(){var t={}.hasOwnProperty;function r(){for(var n=[],i=0;i0?1:0):0};W.lazySlidesOnLeft=LS;var IS=function(t){return t.centerMode?Math.floor((t.slidesToShow-1)/2)+1+(parseInt(t.centerPadding)>0?1:0):t.slidesToShow};W.lazySlidesOnRight=IS;var Mu=function(t){return t&&t.offsetWidth||0};W.getWidth=Mu;var xg=function(t){return t&&t.offsetHeight||0};W.getHeight=xg;var _g=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,n,i,o,a;return n=t.startX-t.curX,i=t.startY-t.curY,o=Math.atan2(i,n),a=Math.round(o*180/Math.PI),a<0&&(a=360-Math.abs(a)),a<=45&&a>=0||a<=360&&a>=315?"left":a>=135&&a<=225?"right":r===!0?a>=35&&a<=135?"up":"down":"vertical"};W.getSwipeDirection=_g;var Sg=function(t){var r=!0;return t.infinite||(t.centerMode&&t.currentSlide>=t.slideCount-1||t.slideCount<=t.slidesToShow||t.currentSlide>=t.slideCount-t.slidesToShow)&&(r=!1),r};W.canGoNext=Sg;var kM=function(t,r){var n={};return r.forEach(function(i){return n[i]=t[i]}),n};W.extractObject=kM;var CM=function(t){var r=xM.default.Children.count(t.children),n=t.listRef,i=Math.ceil(Mu(n)),o=t.trackRef&&t.trackRef.node,a=Math.ceil(Mu(o)),c;if(t.vertical)c=i;else{var d=t.centerMode&&parseInt(t.centerPadding)*2;typeof t.centerPadding=="string"&&t.centerPadding.slice(-1)==="%"&&(d*=i/100),c=Math.ceil((i-d)/t.slidesToShow)}var h=n&&xg(n.querySelector('[data-index="0"]')),g=h*t.slidesToShow,v=t.currentSlide===void 0?t.initialSlide:t.currentSlide;t.rtl&&t.currentSlide===void 0&&(v=r-1-t.initialSlide);var _=t.lazyLoadedList||[],b=vg(Ze(Ze({},t),{},{currentSlide:v,lazyLoadedList:_}));_=_.concat(b);var k={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:_};return t.autoplaying===null&&t.autoplay&&(k.autoplaying="playing"),k};W.initializedState=CM;var DM=function(t){var r=t.waitForAnimate,n=t.animating,i=t.fade,o=t.infinite,a=t.index,c=t.slideCount,d=t.lazyLoad,h=t.currentSlide,g=t.centerMode,v=t.slidesToScroll,_=t.slidesToShow,b=t.useCSS,k=t.lazyLoadedList;if(r&&n)return{};var D=a,j,y,w,S={},E={},T=o?a:MS(a,0,c-1);if(i){if(!o&&(a<0||a>=c))return{};a<0?D=a+c:a>=c&&(D=a-c),d&&k.indexOf(D)<0&&(k=k.concat(D)),S={animating:!0,currentSlide:D,lazyLoadedList:k,targetSlide:D},E={animating:!1,targetSlide:D}}else j=D,D<0?(j=D+c,o?c%v!==0&&(j=c-c%v):j=0):!Sg(t)&&D>h?D=j=h:g&&D>=c?(D=o?c:c-1,j=o?0:c-1):D>=c&&(j=D-c,o?c%v!==0&&(j=0):j=c-_),!o&&D+_>=c&&(j=c-_),y=gl(Ze(Ze({},t),{},{slideIndex:D})),w=gl(Ze(Ze({},t),{},{slideIndex:j})),o||(y===w&&(D=j),y=w),d&&(k=k.concat(vg(Ze(Ze({},t),{},{currentSlide:D})))),b?(S={animating:!0,currentSlide:j,trackStyle:bg(Ze(Ze({},t),{},{left:y})),lazyLoadedList:k,targetSlide:T},E={animating:!1,currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),swipeLeft:null,targetSlide:T}):S={currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:k,targetSlide:T};return{state:S,nextState:E}};W.slideHandler=DM;var jM=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,_=t.targetSlide,b=t.lazyLoad,k=t.infinite;if(a=g%d!==0,n=a?0:(g-v)%d,r.message==="previous")o=n===0?d:h-n,c=v-o,b&&!k&&(i=v-o,c=i===-1?g-1:i),k||(c=_-d);else if(r.message==="next")o=n===0?d:n,c=v+o,b&&!k&&(c=(v+d)%g+n),k||(c=_+d);else if(r.message==="dots")c=r.index*r.slidesToScroll;else if(r.message==="children"){if(c=r.index,k){var D=HS(Ze(Ze({},t),{},{targetSlide:c}));c>r.currentSlide&&D==="left"?c=c-g:c10)return{scrolling:!0};c&&(w.swipeLength=z);var Y=(d?-1:1)*(w.curX>w.startX?1:-1);c&&(Y=w.curY>w.startY?1:-1);var ee=Math.ceil(D/j),te=_g(r.touchObject,c),G=w.swipeLength;return y||(h===0&&(te==="right"||te==="down")||h+1>=ee&&(te==="left"||te==="up")||!Sg(r)&&(te==="left"||te==="up"))&&(G=w.swipeLength*g,v===!1&&_&&(_(te),P.edgeDragged=!0)),!b&&S&&(S(te),P.swiped=!0),o?R=O+G*(E/T)*Y:d?R=O-G*Y:R=O+G*Y,c&&(R=O+G*Y),P=Ze(Ze({},P),{},{touchObject:w,swipeLeft:R,trackStyle:pl(Ze(Ze({},r),{},{left:R}))}),Math.abs(w.curX-w.startX)10&&(P.swiping=!0,ho(t)),P}};W.swipeMove=TM;var RM=function(t,r){var n=r.dragging,i=r.swipe,o=r.touchObject,a=r.listWidth,c=r.touchThreshold,d=r.verticalSwiping,h=r.listHeight,g=r.swipeToSlide,v=r.scrolling,_=r.onSwipe,b=r.targetSlide,k=r.currentSlide,D=r.infinite;if(!n)return i&&ho(t),{};var j=d?h/c:a/c,y=_g(o,d),w={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(v||!o.swipeLength)return w;if(o.swipeLength>j){ho(t),_&&_(y);var S,E,T=D?k:b;switch(y){case"left":case"up":E=T+Mp(r),S=g?Pp(r,E):E,w.currentDirection=0;break;case"right":case"down":E=T-Mp(r),S=g?Pp(r,E):E,w.currentDirection=1;break;default:S=T}w.triggerSlideHandler=S}else{var R=gl(r);w.trackStyle=bg(Ze(Ze({},r),{},{left:R}))}return w};W.swipeEnd=RM;var NS=function(t){for(var r=t.infinite?t.slideCount*2:t.slideCount,n=t.infinite?t.slidesToShow*-1:0,i=t.infinite?t.slidesToShow*-1:0,o=[];nn[n.length-1])r=n[n.length-1];else for(var o in n){if(rt.swipeLeft*-1)return n=d,!1}else if(d.offsetLeft-r+Mu(d)/2>t.swipeLeft*-1)return n=d,!1;return!0}),!n)return 0;var a=t.rtl===!0?t.slideCount-t.currentSlide:t.currentSlide,c=Math.abs(n.dataset.index-a)||1;return c}else return t.slidesToScroll};W.getSlideCount=Mp;var Kd=function(t,r){return r.reduce(function(n,i){return n&&t.hasOwnProperty(i)},!0)?null:console.error("Keys Missing:",t)};W.checkSpecKeys=Kd;var pl=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var r,n,i=t.slideCount+2*t.slidesToShow;t.vertical?n=i*t.slideHeight:r=YS(t)*t.slideWidth;var o={opacity:1,transition:"",WebkitTransition:""};if(t.useTransform){var a=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",c=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",d=t.vertical?"translateY("+t.left+"px)":"translateX("+t.left+"px)";o=Ze(Ze({},o),{},{WebkitTransform:a,transform:c,msTransform:d})}else t.vertical?o.top=t.left:o.left=t.left;return t.fade&&(o={opacity:1}),r&&(o.width=r),n&&(o.height=n),window&&!window.addEventListener&&window.attachEvent&&(t.vertical?o.marginTop=t.left+"px":o.marginLeft=t.left+"px"),o};W.getTrackCSS=pl;var bg=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var r=pl(t);return t.useTransform?(r.WebkitTransition="-webkit-transform "+t.speed+"ms "+t.cssEase,r.transition="transform "+t.speed+"ms "+t.cssEase):t.vertical?r.transition="top "+t.speed+"ms "+t.cssEase:r.transition="left "+t.speed+"ms "+t.cssEase,r};W.getTrackAnimateCSS=bg;var gl=function(t){if(t.unslick)return 0;Kd(t,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var r=t.slideIndex,n=t.trackRef,i=t.infinite,o=t.centerMode,a=t.slideCount,c=t.slidesToShow,d=t.slidesToScroll,h=t.slideWidth,g=t.listWidth,v=t.variableWidth,_=t.slideHeight,b=t.fade,k=t.vertical,D=0,j,y,w=0;if(b||t.slideCount===1)return 0;var S=0;if(i?(S=-Ua(t),a%d!==0&&r+d>a&&(S=-(r>a?c-(r-a):a%d)),o&&(S+=parseInt(c/2))):(a%d!==0&&r+d>a&&(S=c-a%d),o&&(S=parseInt(c/2))),D=S*h,w=S*_,k?j=r*_*-1+w:j=r*h*-1+D,v===!0){var E,T=n&&n.node;if(E=r+Ua(t),y=T&&T.childNodes[E],j=y?y.offsetLeft*-1:0,o===!0){E=i?r+Ua(t):r,y=T&&T.children[E],j=0;for(var R=0;Rt.currentSlide?t.targetSlide>t.currentSlide+FS(t)?"left":"right":t.targetSlide0&&(a+=1),i&&r%2===0&&(a+=1),a}return i?0:r-1};W.slidesOnRight=FS;var VS=function(t){var r=t.slidesToShow,n=t.centerMode,i=t.rtl,o=t.centerPadding;if(n){var a=(r-1)/2+1;return parseInt(o)>0&&(a+=1),!i&&r%2===0&&(a+=1),a}return i?r-1:0};W.slidesOnLeft=VS;var OM=function(){return!!(typeof window<"u"&&window.document&&window.document.createElement)};W.canUseDOM=OM;var Xd={};function Lp(e){return Lp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Lp(e)}Object.defineProperty(Xd,"__esModule",{value:!0});Xd.Track=void 0;var xi=US(I),wh=US(Ms),xh=W;function US(e){return e&&e.__esModule?e:{default:e}}function Ip(){return Ip=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Lu(e){return Lu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Lu(e)}function V1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ir(e){for(var t=1;t=t.slideCount,t.centerMode?(o=Math.floor(t.slidesToShow/2),n=(a-t.currentSlide)%t.slideCount===0,a>t.currentSlide-o-1&&a<=t.currentSlide+o&&(r=!0)):r=t.currentSlide<=a&&a=t.slideCount?c=t.targetSlide-t.slideCount:c=t.targetSlide;var d=a===c;return{"slick-slide":!0,"slick-active":r,"slick-center":n,"slick-cloned":i,"slick-current":d}},YM=function(t){var r={};return(t.variableWidth===void 0||t.variableWidth===!1)&&(r.width=t.slideWidth),t.fade&&(r.position="relative",t.vertical?r.top=-t.index*parseInt(t.slideHeight):r.left=-t.index*parseInt(t.slideWidth),r.opacity=t.currentSlide===t.index?1:0,t.useCSS&&(r.transition="opacity "+t.speed+"ms "+t.cssEase+", visibility "+t.speed+"ms "+t.cssEase)),r},Sh=function(t,r){return t.key||r},HM=function(t){var r,n=[],i=[],o=[],a=xi.default.Children.count(t.children),c=(0,xh.lazyStartIndex)(t),d=(0,xh.lazyEndIndex)(t);return xi.default.Children.forEach(t.children,function(h,g){var v,_={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=xi.default.createElement("div",null);var b=YM(ir(ir({},t),{},{index:g})),k=v.props.className||"",D=_h(ir(ir({},t),{},{index:g}));if(n.push(xi.default.cloneElement(v,{key:"original"+Sh(v,g),"data-index":g,className:(0,wh.default)(D,k),tabIndex:"-1","aria-hidden":!D["slick-active"],style:ir(ir({outline:"none"},v.props.style||{}),b),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(_)}})),t.infinite&&t.fade===!1){var j=a-g;j<=(0,xh.getPreClones)(t)&&a!==t.slidesToShow&&(r=-j,r>=c&&(v=h),D=_h(ir(ir({},t),{},{index:r})),i.push(xi.default.cloneElement(v,{key:"precloned"+Sh(v,r),"data-index":r,tabIndex:"-1",className:(0,wh.default)(D,k),"aria-hidden":!D["slick-active"],style:ir(ir({},v.props.style||{}),b),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(_)}}))),a!==t.slidesToShow&&(r=a+g,r"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Iu(e){return Iu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Iu(e)}var ZM=function(t){var r;return t.infinite?r=Math.ceil(t.slideCount/t.slidesToScroll):r=Math.ceil((t.slideCount-t.slidesToShow)/t.slidesToScroll)+1,r},JM=function(e){GM(r,e);var t=KM(r);function r(){return BM(this,r),t.apply(this,arguments)}return WM(r,[{key:"clickHandler",value:function(i,o){o.preventDefault(),this.props.clickHandler(i)}},{key:"render",value:function(){for(var i=this.props,o=i.onMouseEnter,a=i.onMouseOver,c=i.onMouseLeave,d=i.infinite,h=i.slidesToScroll,g=i.slidesToShow,v=i.slideCount,_=i.currentSlide,b=ZM({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),k={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],j=0;j=E&&_<=w:_===E}),R={message:"dots",index:j,slidesToScroll:h,currentSlide:_},P=this.clickHandler.bind(this,R);D=D.concat(Sc.default.createElement("li",{key:j,className:T},Sc.default.cloneElement(this.props.customPaging(j),{onClick:P})))}return Sc.default.cloneElement(this.props.appendDots(D),UM({className:this.props.dotsClass},k))}}]),r}(Sc.default.PureComponent);Qd.Dots=JM;var Ls={};function Vp(e){return Vp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Vp(e)}Object.defineProperty(Ls,"__esModule",{value:!0});Ls.PrevArrow=Ls.NextArrow=void 0;var vs=WS(I),BS=WS(Ms),eL=W;function WS(e){return e&&e.__esModule?e:{default:e}}function Nu(){return Nu=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Yu(e){return Yu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Yu(e)}var oL=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-prev":!0},o=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(this.props.currentSlide===0||this.props.slideCount<=this.props.slidesToShow)&&(i["slick-disabled"]=!0,o=null);var a={key:"0","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.prevArrow?d=vs.default.cloneElement(this.props.prevArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"0",type:"button"},a)," ","Previous"),d}}]),r}(vs.default.PureComponent);Ls.PrevArrow=oL;var sL=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-next":!0},o=this.clickHandler.bind(this,{message:"next"});(0,eL.canGoNext)(this.props)||(i["slick-disabled"]=!0,o=null);var a={key:"1","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.nextArrow?d=vs.default.cloneElement(this.props.nextArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"1",type:"button"},a)," ","Next"),d}}]),r}(vs.default.PureComponent);Ls.NextArrow=sL;var qS=function(){if(typeof Map<"u")return Map;function e(t,r){var n=-1;return t.some(function(i,o){return i[0]===r?(n=o,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),i=this.__entries__[n];return i&&i[1]},t.prototype.set=function(r,n){var i=e(this.__entries__,r);~i?this.__entries__[i][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,i=e(n,r);~i&&n.splice(i,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var i=0,o=this.__entries__;i0},e.prototype.connect_=function(){!$p||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),fL?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!$p||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,i=dL.some(function(o){return!!~n.indexOf(o)});i&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ZS=function(e,t){for(var r=0,n=Object.keys(t);r"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)||(r.set(t,new _L(t)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element>"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)&&(r.delete(t),r.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(r){r.isActive()&&t.activeObservations_.push(r)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var t=this.callbackCtx_,r=this.activeObservations_.map(function(n){return new SL(n.target,n.broadcastRect())});this.callback_.call(t,r,t),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),eb=typeof WeakMap<"u"?new WeakMap:new qS,tb=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=hL.getInstance(),n=new bL(t,r,this);eb.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){tb.prototype[e]=function(){var t;return(t=eb.get(this))[e].apply(t,arguments)}});var kL=function(){return typeof Hu.ResizeObserver<"u"?Hu.ResizeObserver:tb}();const CL=Object.freeze(Object.defineProperty({__proto__:null,default:kL},Symbol.toStringTag,{value:"Module"})),DL=DE(CL);Object.defineProperty(Gd,"__esModule",{value:!0});Gd.InnerSlider=void 0;var Qt=Rl(I),jL=Rl(PS),EL=Rl(yM),AL=Rl(Ms),rt=W,TL=Xd,RL=Qd,X1=Ls,OL=Rl(DL);function Rl(e){return e&&e.__esModule?e:{default:e}}function Vu(e){return Vu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Vu(e)}function Uu(){return Uu=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function ML(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}function Q1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function de(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function $u(e){return $u=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},$u(e)}function Se(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var FL=function(e){NL(r,e);var t=zL(r);function r(n){var i;LL(this,r),i=t.call(this,n),Se(_e(i),"listRefHandler",function(a){return i.list=a}),Se(_e(i),"trackRefHandler",function(a){return i.track=a}),Se(_e(i),"adaptHeight",function(){if(i.props.adaptiveHeight&&i.list){var a=i.list.querySelector('[data-index="'.concat(i.state.currentSlide,'"]'));i.list.style.height=(0,rt.getHeight)(a)+"px"}}),Se(_e(i),"componentDidMount",function(){if(i.props.onInit&&i.props.onInit(),i.props.lazyLoad){var a=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));a.length>0&&(i.setState(function(d){return{lazyLoadedList:d.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a))}var c=de({listRef:i.list,trackRef:i.track},i.props);i.updateState(c,!0,function(){i.adaptHeight(),i.props.autoplay&&i.autoPlay("update")}),i.props.lazyLoad==="progressive"&&(i.lazyLoadTimer=setInterval(i.progressiveLazyLoad,1e3)),i.ro=new OL.default(function(){i.state.animating?(i.onWindowResized(!1),i.callbackTimers.push(setTimeout(function(){return i.onWindowResized()},i.props.speed))):i.onWindowResized()}),i.ro.observe(i.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),function(d){d.onfocus=i.props.pauseOnFocus?i.onSlideFocus:null,d.onblur=i.props.pauseOnFocus?i.onSlideBlur:null}),window.addEventListener?window.addEventListener("resize",i.onWindowResized):window.attachEvent("onresize",i.onWindowResized)}),Se(_e(i),"componentWillUnmount",function(){i.animationEndCallback&&clearTimeout(i.animationEndCallback),i.lazyLoadTimer&&clearInterval(i.lazyLoadTimer),i.callbackTimers.length&&(i.callbackTimers.forEach(function(a){return clearTimeout(a)}),i.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",i.onWindowResized):window.detachEvent("onresize",i.onWindowResized),i.autoplayTimer&&clearInterval(i.autoplayTimer),i.ro.disconnect()}),Se(_e(i),"componentDidUpdate",function(a){if(i.checkImagesLoad(),i.props.onReInit&&i.props.onReInit(),i.props.lazyLoad){var c=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));c.length>0&&(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(c)}}),i.props.onLazyLoad&&i.props.onLazyLoad(c))}i.adaptHeight();var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state),h=i.didPropsChange(a);h&&i.updateState(d,h,function(){i.state.currentSlide>=Qt.default.Children.count(i.props.children)&&i.changeSlide({message:"index",index:Qt.default.Children.count(i.props.children)-i.props.slidesToShow,currentSlide:i.state.currentSlide}),i.props.autoplay?i.autoPlay("update"):i.pause("paused")})}),Se(_e(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,EL.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(_e(i),"resizeWindow",function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,c=!!(i.track&&i.track.node);if(c){var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state);i.updateState(d,a,function(){i.props.autoplay?i.autoPlay("update"):i.pause("paused")}),i.setState({animating:!1}),clearTimeout(i.animationEndCallback),delete i.animationEndCallback}}),Se(_e(i),"updateState",function(a,c,d){var h=(0,rt.initializedState)(a);a=de(de(de({},a),h),{},{slideIndex:h.currentSlide});var g=(0,rt.getTrackLeft)(a);a=de(de({},a),{},{left:g});var v=(0,rt.getTrackCSS)(a);(c||Qt.default.Children.count(i.props.children)!==Qt.default.Children.count(a.children))&&(h.trackStyle=v),i.setState(h,d)}),Se(_e(i),"ssrInit",function(){if(i.props.variableWidth){var a=0,c=0,d=[],h=(0,rt.getPreClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length})),g=(0,rt.getPostClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length}));i.props.children.forEach(function(P){d.push(P.props.style.width),a+=P.props.style.width});for(var v=0;v=c&&i.onWindowResized()};if(!h.onclick)h.onclick=function(){return h.parentNode.focus()};else{var v=h.onclick;h.onclick=function(){v(),h.parentNode.focus()}}h.onload||(i.props.lazyLoad?h.onload=function(){i.adaptHeight(),i.callbackTimers.push(setTimeout(i.onWindowResized,i.props.speed))}:(h.onload=g,h.onerror=function(){g(),i.props.onLazyLoadError&&i.props.onLazyLoadError()}))})}),Se(_e(i),"progressiveLazyLoad",function(){for(var a=[],c=de(de({},i.props),i.state),d=i.state.currentSlide;d=-(0,rt.getPreClones)(c);h--)if(i.state.lazyLoadedList.indexOf(h)<0){a.push(h);break}a.length>0?(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a)):i.lazyLoadTimer&&(clearInterval(i.lazyLoadTimer),delete i.lazyLoadTimer)}),Se(_e(i),"slideHandler",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=i.props,h=d.asNavFor,g=d.beforeChange,v=d.onLazyLoad,_=d.speed,b=d.afterChange,k=i.state.currentSlide,D=(0,rt.slideHandler)(de(de(de({index:a},i.props),i.state),{},{trackRef:i.track,useCSS:i.props.useCSS&&!c})),j=D.state,y=D.nextState;if(j){g&&g(k,j.currentSlide);var w=j.lazyLoadedList.filter(function(S){return i.state.lazyLoadedList.indexOf(S)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),b&&b(k),delete i.animationEndCallback),i.setState(j,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var S=y.animating,E=PL(y,["animating"]);i.setState(E,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:S})},10)),b&&b(j.currentSlide),delete i.animationEndCallback})},_))})}}),Se(_e(i),"changeSlide",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=de(de({},i.props),i.state),h=(0,rt.changeSlide)(d,a);if(!(h!==0&&!h)&&(c===!0?i.slideHandler(h,c):i.slideHandler(h),i.props.autoplay&&i.autoPlay("update"),i.props.focusOnSelect)){var g=i.list.querySelectorAll(".slick-current");g[0]&&g[0].focus()}}),Se(_e(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(_e(i),"keyHandler",function(a){var c=(0,rt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(_e(i),"selectHandler",function(a){i.changeSlide(a)}),Se(_e(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(_e(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(_e(i),"swipeStart",function(a){i.props.verticalSwiping&&i.disableBodyScroll();var c=(0,rt.swipeStart)(a,i.props.swipe,i.props.draggable);c!==""&&i.setState(c)}),Se(_e(i),"swipeMove",function(a){var c=(0,rt.swipeMove)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));c&&(c.swiping&&(i.clickable=!1),i.setState(c))}),Se(_e(i),"swipeEnd",function(a){var c=(0,rt.swipeEnd)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));if(c){var d=c.triggerSlideHandler;delete c.triggerSlideHandler,i.setState(c),d!==void 0&&(i.slideHandler(d),i.props.verticalSwiping&&i.enableBodyScroll())}}),Se(_e(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(_e(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(_e(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(_e(i),"slickGoTo",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(a=Number(a),isNaN(a))return"";i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"index",index:a,currentSlide:i.state.currentSlide},c)},0))}),Se(_e(i),"play",function(){var a;if(i.props.rtl)a=i.state.currentSlide-i.props.slidesToScroll;else if((0,rt.canGoNext)(de(de({},i.props),i.state)))a=i.state.currentSlide+i.props.slidesToScroll;else return!1;i.slideHandler(a)}),Se(_e(i),"autoPlay",function(a){i.autoplayTimer&&clearInterval(i.autoplayTimer);var c=i.state.autoplaying;if(a==="update"){if(c==="hovered"||c==="focused"||c==="paused")return}else if(a==="leave"){if(c==="paused"||c==="focused")return}else if(a==="blur"&&(c==="paused"||c==="hovered"))return;i.autoplayTimer=setInterval(i.play,i.props.autoplaySpeed+50),i.setState({autoplaying:"playing"})}),Se(_e(i),"pause",function(a){i.autoplayTimer&&(clearInterval(i.autoplayTimer),i.autoplayTimer=null);var c=i.state.autoplaying;a==="paused"?i.setState({autoplaying:"paused"}):a==="focused"?(c==="hovered"||c==="playing")&&i.setState({autoplaying:"focused"}):c==="playing"&&i.setState({autoplaying:"hovered"})}),Se(_e(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(_e(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(_e(i),"render",function(){var a=(0,AL.default)("slick-slider",i.props.className,{"slick-vertical":i.props.vertical,"slick-initialized":!0}),c=de(de({},i.props),i.state),d=(0,rt.extractObject)(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),h=i.props.pauseOnHover;d=de(de({},d),{},{onMouseEnter:h?i.onTrackOver:null,onMouseLeave:h?i.onTrackLeave:null,onMouseOver:h?i.onTrackOver:null,focusOnSelect:i.props.focusOnSelect&&i.clickable?i.selectHandler:null});var g;if(i.props.dots===!0&&i.state.slideCount>=i.props.slidesToShow){var v=(0,rt.extractObject)(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),_=i.props.pauseOnDotsHover;v=de(de({},v),{},{clickHandler:i.changeSlide,onMouseEnter:_?i.onDotsLeave:null,onMouseOver:_?i.onDotsOver:null,onMouseLeave:_?i.onDotsLeave:null}),g=Qt.default.createElement(RL.Dots,v)}var b,k,D=(0,rt.extractObject)(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);D.clickHandler=i.changeSlide,i.props.arrows&&(b=Qt.default.createElement(X1.PrevArrow,D),k=Qt.default.createElement(X1.NextArrow,D));var j=null;i.props.vertical&&(j={height:i.state.listHeight});var y=null;i.props.vertical===!1?i.props.centerMode===!0&&(y={padding:"0px "+i.props.centerPadding}):i.props.centerMode===!0&&(y={padding:i.props.centerPadding+" 0px"});var w=de(de({},j),y),S=i.props.touchMove,E={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:S?i.swipeStart:null,onMouseMove:i.state.dragging&&S?i.swipeMove:null,onMouseUp:S?i.swipeEnd:null,onMouseLeave:i.state.dragging&&S?i.swipeEnd:null,onTouchStart:S?i.swipeStart:null,onTouchMove:i.state.dragging&&S?i.swipeMove:null,onTouchEnd:S?i.touchEnd:null,onTouchCancel:i.state.dragging&&S?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(E={className:"slick-list"},T={className:a}),Qt.default.createElement("div",T,i.props.unslick?"":b,Qt.default.createElement("div",Uu({ref:i.listRefHandler},E),Qt.default.createElement(TL.Track,Uu({ref:i.trackRefHandler},d),i.props.children)),i.props.unslick?"":k,i.props.unslick?"":g)}),i.list=null,i.track=null,i.state=de(de({},jL.default),{},{currentSlide:i.props.initialSlide,slideCount:Qt.default.Children.count(i.props.children)}),i.callbackTimers=[],i.clickable=!0,i.debouncedResize=null;var o=i.ssrInit();return i.state=de(de({},i.state),o),i}return IL(r,[{key:"didPropsChange",value:function(i){for(var o=!1,a=0,c=Object.keys(this.props);a"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function E(O){return E=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},E(O)}function T(O,z,Y){return z in O?Object.defineProperty(O,z,{value:Y,enumerable:!0,configurable:!0,writable:!0}):O[z]=Y,O}var R=(0,a.canUseDOM)()&&qL(),P=function(O){k(Y,O);var z=j(Y);function Y(ee){var te;return v(this,Y),te=z.call(this,ee),T(w(te),"innerSliderRefHandler",function(G){return te.innerSlider=G}),T(w(te),"slickPrev",function(){return te.innerSlider.slickPrev()}),T(w(te),"slickNext",function(){return te.innerSlider.slickNext()}),T(w(te),"slickGoTo",function(G){var lt=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return te.innerSlider.slickGoTo(G,lt)}),T(w(te),"slickPause",function(){return te.innerSlider.pause("paused")}),T(w(te),"slickPlay",function(){return te.innerSlider.autoPlay("play")}),te.state={breakpoint:null},te._responsiveMediaHandlers=[],te}return b(Y,[{key:"media",value:function(te,G){R.register(te,G),this._responsiveMediaHandlers.push({query:te,handler:G})}},{key:"componentDidMount",value:function(){var te=this;if(this.props.responsive){var G=this.props.responsive.map(function(Ee){return Ee.breakpoint});G.sort(function(Ee,ze){return Ee-ze}),G.forEach(function(Ee,ze){var mt;ze===0?mt=(0,i.default)({minWidth:0,maxWidth:Ee}):mt=(0,i.default)({minWidth:G[ze-1]+1,maxWidth:Ee}),(0,a.canUseDOM)()&&te.media(mt,function(){te.setState({breakpoint:Ee})})});var lt=(0,i.default)({minWidth:G.slice(-1)[0]});(0,a.canUseDOM)()&&this.media(lt,function(){te.setState({breakpoint:null})})}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach(function(te){R.unregister(te.query,te.handler)})}},{key:"render",value:function(){var te=this,G,lt;this.state.breakpoint?(lt=this.props.responsive.filter(function(Ve){return Ve.breakpoint===te.state.breakpoint}),G=lt[0].settings==="unslick"?"unslick":g(g(g({},o.default),this.props),lt[0].settings)):G=g(g({},o.default),this.props),G.centerMode&&(G.slidesToScroll>1,G.slidesToScroll=1),G.fade&&(G.slidesToShow>1,G.slidesToScroll>1,G.slidesToShow=1,G.slidesToScroll=1);var Ee=r.default.Children.toArray(this.props.children);Ee=Ee.filter(function(Ve){return typeof Ve=="string"?!!Ve.trim():!!Ve}),G.variableWidth&&(G.rows>1||G.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),G.variableWidth=!1);for(var ze=[],mt=null,$=0;$=Ee.length));he+=1)ue.push(r.default.cloneElement(Ee[he],{key:100*$+10*Q+he,tabIndex:-1,style:{width:"".concat(100/G.slidesPerRow,"%"),display:"inline-block"}}));le.push(r.default.createElement("div",{key:10*$+Q},ue))}G.variableWidth?ze.push(r.default.createElement("div",{key:$,style:{width:mt}},le)):ze.push(r.default.createElement("div",{key:$},le))}if(G==="unslick"){var st="regular slider "+(this.props.className||"");return r.default.createElement("div",{className:st},Ee)}else ze.length<=G.slidesToShow&&(G.unslick=!0);return r.default.createElement(n.InnerSlider,d({style:this.props.style,ref:this.innerSliderRefHandler},G),ze)}}]),Y}(r.default.Component);e.default=P})(OS);(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(OS);function r(i){return i&&i.__esModule?i:{default:i}}var n=t.default;e.default=n})(RS);const ZL=Cx(RS),yn=f.button` +*/(function(e){(function(){var t={}.hasOwnProperty;function r(){for(var n=[],i=0;i0?1:0):0};W.lazySlidesOnLeft=LS;var IS=function(t){return t.centerMode?Math.floor((t.slidesToShow-1)/2)+1+(parseInt(t.centerPadding)>0?1:0):t.slidesToShow};W.lazySlidesOnRight=IS;var Mu=function(t){return t&&t.offsetWidth||0};W.getWidth=Mu;var xg=function(t){return t&&t.offsetHeight||0};W.getHeight=xg;var _g=function(t){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,n,i,o,a;return n=t.startX-t.curX,i=t.startY-t.curY,o=Math.atan2(i,n),a=Math.round(o*180/Math.PI),a<0&&(a=360-Math.abs(a)),a<=45&&a>=0||a<=360&&a>=315?"left":a>=135&&a<=225?"right":r===!0?a>=35&&a<=135?"up":"down":"vertical"};W.getSwipeDirection=_g;var Sg=function(t){var r=!0;return t.infinite||(t.centerMode&&t.currentSlide>=t.slideCount-1||t.slideCount<=t.slidesToShow||t.currentSlide>=t.slideCount-t.slidesToShow)&&(r=!1),r};W.canGoNext=Sg;var kM=function(t,r){var n={};return r.forEach(function(i){return n[i]=t[i]}),n};W.extractObject=kM;var CM=function(t){var r=xM.default.Children.count(t.children),n=t.listRef,i=Math.ceil(Mu(n)),o=t.trackRef&&t.trackRef.node,a=Math.ceil(Mu(o)),c;if(t.vertical)c=i;else{var d=t.centerMode&&parseInt(t.centerPadding)*2;typeof t.centerPadding=="string"&&t.centerPadding.slice(-1)==="%"&&(d*=i/100),c=Math.ceil((i-d)/t.slidesToShow)}var h=n&&xg(n.querySelector('[data-index="0"]')),g=h*t.slidesToShow,v=t.currentSlide===void 0?t.initialSlide:t.currentSlide;t.rtl&&t.currentSlide===void 0&&(v=r-1-t.initialSlide);var _=t.lazyLoadedList||[],k=vg(Ze(Ze({},t),{},{currentSlide:v,lazyLoadedList:_}));_=_.concat(k);var C={slideCount:r,slideWidth:c,listWidth:i,trackWidth:a,currentSlide:v,slideHeight:h,listHeight:g,lazyLoadedList:_};return t.autoplaying===null&&t.autoplay&&(C.autoplaying="playing"),C};W.initializedState=CM;var DM=function(t){var r=t.waitForAnimate,n=t.animating,i=t.fade,o=t.infinite,a=t.index,c=t.slideCount,d=t.lazyLoad,h=t.currentSlide,g=t.centerMode,v=t.slidesToScroll,_=t.slidesToShow,k=t.useCSS,C=t.lazyLoadedList;if(r&&n)return{};var D=a,j,y,w,S={},E={},T=o?a:MS(a,0,c-1);if(i){if(!o&&(a<0||a>=c))return{};a<0?D=a+c:a>=c&&(D=a-c),d&&C.indexOf(D)<0&&(C=C.concat(D)),S={animating:!0,currentSlide:D,lazyLoadedList:C,targetSlide:D},E={animating:!1,targetSlide:D}}else j=D,D<0?(j=D+c,o?c%v!==0&&(j=c-c%v):j=0):!Sg(t)&&D>h?D=j=h:g&&D>=c?(D=o?c:c-1,j=o?0:c-1):D>=c&&(j=D-c,o?c%v!==0&&(j=0):j=c-_),!o&&D+_>=c&&(j=c-_),y=gl(Ze(Ze({},t),{},{slideIndex:D})),w=gl(Ze(Ze({},t),{},{slideIndex:j})),o||(y===w&&(D=j),y=w),d&&(C=C.concat(vg(Ze(Ze({},t),{},{currentSlide:D})))),k?(S={animating:!0,currentSlide:j,trackStyle:bg(Ze(Ze({},t),{},{left:y})),lazyLoadedList:C,targetSlide:T},E={animating:!1,currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),swipeLeft:null,targetSlide:T}):S={currentSlide:j,trackStyle:pl(Ze(Ze({},t),{},{left:w})),lazyLoadedList:C,targetSlide:T};return{state:S,nextState:E}};W.slideHandler=DM;var jM=function(t,r){var n,i,o,a,c,d=t.slidesToScroll,h=t.slidesToShow,g=t.slideCount,v=t.currentSlide,_=t.targetSlide,k=t.lazyLoad,C=t.infinite;if(a=g%d!==0,n=a?0:(g-v)%d,r.message==="previous")o=n===0?d:h-n,c=v-o,k&&!C&&(i=v-o,c=i===-1?g-1:i),C||(c=_-d);else if(r.message==="next")o=n===0?d:n,c=v+o,k&&!C&&(c=(v+d)%g+n),C||(c=_+d);else if(r.message==="dots")c=r.index*r.slidesToScroll;else if(r.message==="children"){if(c=r.index,C){var D=HS(Ze(Ze({},t),{},{targetSlide:c}));c>r.currentSlide&&D==="left"?c=c-g:c10)return{scrolling:!0};c&&(w.swipeLength=z);var Y=(d?-1:1)*(w.curX>w.startX?1:-1);c&&(Y=w.curY>w.startY?1:-1);var ee=Math.ceil(D/j),te=_g(r.touchObject,c),G=w.swipeLength;return y||(h===0&&(te==="right"||te==="down")||h+1>=ee&&(te==="left"||te==="up")||!Sg(r)&&(te==="left"||te==="up"))&&(G=w.swipeLength*g,v===!1&&_&&(_(te),P.edgeDragged=!0)),!k&&S&&(S(te),P.swiped=!0),o?R=O+G*(E/T)*Y:d?R=O-G*Y:R=O+G*Y,c&&(R=O+G*Y),P=Ze(Ze({},P),{},{touchObject:w,swipeLeft:R,trackStyle:pl(Ze(Ze({},r),{},{left:R}))}),Math.abs(w.curX-w.startX)10&&(P.swiping=!0,ho(t)),P}};W.swipeMove=TM;var RM=function(t,r){var n=r.dragging,i=r.swipe,o=r.touchObject,a=r.listWidth,c=r.touchThreshold,d=r.verticalSwiping,h=r.listHeight,g=r.swipeToSlide,v=r.scrolling,_=r.onSwipe,k=r.targetSlide,C=r.currentSlide,D=r.infinite;if(!n)return i&&ho(t),{};var j=d?h/c:a/c,y=_g(o,d),w={dragging:!1,edgeDragged:!1,scrolling:!1,swiping:!1,swiped:!1,swipeLeft:null,touchObject:{}};if(v||!o.swipeLength)return w;if(o.swipeLength>j){ho(t),_&&_(y);var S,E,T=D?C:k;switch(y){case"left":case"up":E=T+Mp(r),S=g?Pp(r,E):E,w.currentDirection=0;break;case"right":case"down":E=T-Mp(r),S=g?Pp(r,E):E,w.currentDirection=1;break;default:S=T}w.triggerSlideHandler=S}else{var R=gl(r);w.trackStyle=bg(Ze(Ze({},r),{},{left:R}))}return w};W.swipeEnd=RM;var NS=function(t){for(var r=t.infinite?t.slideCount*2:t.slideCount,n=t.infinite?t.slidesToShow*-1:0,i=t.infinite?t.slidesToShow*-1:0,o=[];nn[n.length-1])r=n[n.length-1];else for(var o in n){if(rt.swipeLeft*-1)return n=d,!1}else if(d.offsetLeft-r+Mu(d)/2>t.swipeLeft*-1)return n=d,!1;return!0}),!n)return 0;var a=t.rtl===!0?t.slideCount-t.currentSlide:t.currentSlide,c=Math.abs(n.dataset.index-a)||1;return c}else return t.slidesToScroll};W.getSlideCount=Mp;var Kd=function(t,r){return r.reduce(function(n,i){return n&&t.hasOwnProperty(i)},!0)?null:console.error("Keys Missing:",t)};W.checkSpecKeys=Kd;var pl=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth"]);var r,n,i=t.slideCount+2*t.slidesToShow;t.vertical?n=i*t.slideHeight:r=YS(t)*t.slideWidth;var o={opacity:1,transition:"",WebkitTransition:""};if(t.useTransform){var a=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",c=t.vertical?"translate3d(0px, "+t.left+"px, 0px)":"translate3d("+t.left+"px, 0px, 0px)",d=t.vertical?"translateY("+t.left+"px)":"translateX("+t.left+"px)";o=Ze(Ze({},o),{},{WebkitTransform:a,transform:c,msTransform:d})}else t.vertical?o.top=t.left:o.left=t.left;return t.fade&&(o={opacity:1}),r&&(o.width=r),n&&(o.height=n),window&&!window.addEventListener&&window.attachEvent&&(t.vertical?o.marginTop=t.left+"px":o.marginLeft=t.left+"px"),o};W.getTrackCSS=pl;var bg=function(t){Kd(t,["left","variableWidth","slideCount","slidesToShow","slideWidth","speed","cssEase"]);var r=pl(t);return t.useTransform?(r.WebkitTransition="-webkit-transform "+t.speed+"ms "+t.cssEase,r.transition="transform "+t.speed+"ms "+t.cssEase):t.vertical?r.transition="top "+t.speed+"ms "+t.cssEase:r.transition="left "+t.speed+"ms "+t.cssEase,r};W.getTrackAnimateCSS=bg;var gl=function(t){if(t.unslick)return 0;Kd(t,["slideIndex","trackRef","infinite","centerMode","slideCount","slidesToShow","slidesToScroll","slideWidth","listWidth","variableWidth","slideHeight"]);var r=t.slideIndex,n=t.trackRef,i=t.infinite,o=t.centerMode,a=t.slideCount,c=t.slidesToShow,d=t.slidesToScroll,h=t.slideWidth,g=t.listWidth,v=t.variableWidth,_=t.slideHeight,k=t.fade,C=t.vertical,D=0,j,y,w=0;if(k||t.slideCount===1)return 0;var S=0;if(i?(S=-Ua(t),a%d!==0&&r+d>a&&(S=-(r>a?c-(r-a):a%d)),o&&(S+=parseInt(c/2))):(a%d!==0&&r+d>a&&(S=c-a%d),o&&(S=parseInt(c/2))),D=S*h,w=S*_,C?j=r*_*-1+w:j=r*h*-1+D,v===!0){var E,T=n&&n.node;if(E=r+Ua(t),y=T&&T.childNodes[E],j=y?y.offsetLeft*-1:0,o===!0){E=i?r+Ua(t):r,y=T&&T.children[E],j=0;for(var R=0;Rt.currentSlide?t.targetSlide>t.currentSlide+VS(t)?"left":"right":t.targetSlide0&&(a+=1),i&&r%2===0&&(a+=1),a}return i?0:r-1};W.slidesOnRight=VS;var FS=function(t){var r=t.slidesToShow,n=t.centerMode,i=t.rtl,o=t.centerPadding;if(n){var a=(r-1)/2+1;return parseInt(o)>0&&(a+=1),!i&&r%2===0&&(a+=1),a}return i?r-1:0};W.slidesOnLeft=FS;var OM=function(){return!!(typeof window<"u"&&window.document&&window.document.createElement)};W.canUseDOM=OM;var Xd={};function Lp(e){return Lp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Lp(e)}Object.defineProperty(Xd,"__esModule",{value:!0});Xd.Track=void 0;var xi=US(I),wh=US(Ms),xh=W;function US(e){return e&&e.__esModule?e:{default:e}}function Ip(){return Ip=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Lu(e){return Lu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Lu(e)}function F1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function ir(e){for(var t=1;t=t.slideCount,t.centerMode?(o=Math.floor(t.slidesToShow/2),n=(a-t.currentSlide)%t.slideCount===0,a>t.currentSlide-o-1&&a<=t.currentSlide+o&&(r=!0)):r=t.currentSlide<=a&&a=t.slideCount?c=t.targetSlide-t.slideCount:c=t.targetSlide;var d=a===c;return{"slick-slide":!0,"slick-active":r,"slick-center":n,"slick-cloned":i,"slick-current":d}},YM=function(t){var r={};return(t.variableWidth===void 0||t.variableWidth===!1)&&(r.width=t.slideWidth),t.fade&&(r.position="relative",t.vertical?r.top=-t.index*parseInt(t.slideHeight):r.left=-t.index*parseInt(t.slideWidth),r.opacity=t.currentSlide===t.index?1:0,t.useCSS&&(r.transition="opacity "+t.speed+"ms "+t.cssEase+", visibility "+t.speed+"ms "+t.cssEase)),r},Sh=function(t,r){return t.key||r},HM=function(t){var r,n=[],i=[],o=[],a=xi.default.Children.count(t.children),c=(0,xh.lazyStartIndex)(t),d=(0,xh.lazyEndIndex)(t);return xi.default.Children.forEach(t.children,function(h,g){var v,_={message:"children",index:g,slidesToScroll:t.slidesToScroll,currentSlide:t.currentSlide};!t.lazyLoad||t.lazyLoad&&t.lazyLoadedList.indexOf(g)>=0?v=h:v=xi.default.createElement("div",null);var k=YM(ir(ir({},t),{},{index:g})),C=v.props.className||"",D=_h(ir(ir({},t),{},{index:g}));if(n.push(xi.default.cloneElement(v,{key:"original"+Sh(v,g),"data-index":g,className:(0,wh.default)(D,C),tabIndex:"-1","aria-hidden":!D["slick-active"],style:ir(ir({outline:"none"},v.props.style||{}),k),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(_)}})),t.infinite&&t.fade===!1){var j=a-g;j<=(0,xh.getPreClones)(t)&&a!==t.slidesToShow&&(r=-j,r>=c&&(v=h),D=_h(ir(ir({},t),{},{index:r})),i.push(xi.default.cloneElement(v,{key:"precloned"+Sh(v,r),"data-index":r,tabIndex:"-1",className:(0,wh.default)(D,C),"aria-hidden":!D["slick-active"],style:ir(ir({},v.props.style||{}),k),onClick:function(w){v.props&&v.props.onClick&&v.props.onClick(w),t.focusOnSelect&&t.focusOnSelect(_)}}))),a!==t.slidesToShow&&(r=a+g,r"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Iu(e){return Iu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Iu(e)}var ZM=function(t){var r;return t.infinite?r=Math.ceil(t.slideCount/t.slidesToScroll):r=Math.ceil((t.slideCount-t.slidesToShow)/t.slidesToScroll)+1,r},JM=function(e){GM(r,e);var t=KM(r);function r(){return BM(this,r),t.apply(this,arguments)}return WM(r,[{key:"clickHandler",value:function(i,o){o.preventDefault(),this.props.clickHandler(i)}},{key:"render",value:function(){for(var i=this.props,o=i.onMouseEnter,a=i.onMouseOver,c=i.onMouseLeave,d=i.infinite,h=i.slidesToScroll,g=i.slidesToShow,v=i.slideCount,_=i.currentSlide,k=ZM({slideCount:v,slidesToScroll:h,slidesToShow:g,infinite:d}),C={onMouseEnter:o,onMouseOver:a,onMouseLeave:c},D=[],j=0;j=E&&_<=w:_===E}),R={message:"dots",index:j,slidesToScroll:h,currentSlide:_},P=this.clickHandler.bind(this,R);D=D.concat(Sc.default.createElement("li",{key:j,className:T},Sc.default.cloneElement(this.props.customPaging(j),{onClick:P})))}return Sc.default.cloneElement(this.props.appendDots(D),UM({className:this.props.dotsClass},C))}}]),r}(Sc.default.PureComponent);Qd.Dots=JM;var Ls={};function Fp(e){return Fp=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fp(e)}Object.defineProperty(Ls,"__esModule",{value:!0});Ls.PrevArrow=Ls.NextArrow=void 0;var vs=WS(I),BS=WS(Ms),eL=W;function WS(e){return e&&e.__esModule?e:{default:e}}function Nu(){return Nu=Object.assign||function(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function Yu(e){return Yu=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},Yu(e)}var oL=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-prev":!0},o=this.clickHandler.bind(this,{message:"previous"});!this.props.infinite&&(this.props.currentSlide===0||this.props.slideCount<=this.props.slidesToShow)&&(i["slick-disabled"]=!0,o=null);var a={key:"0","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.prevArrow?d=vs.default.cloneElement(this.props.prevArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"0",type:"button"},a)," ","Previous"),d}}]),r}(vs.default.PureComponent);Ls.PrevArrow=oL;var sL=function(e){XS(r,e);var t=QS(r);function r(){return GS(this,r),t.apply(this,arguments)}return KS(r,[{key:"clickHandler",value:function(i,o){o&&o.preventDefault(),this.props.clickHandler(i,o)}},{key:"render",value:function(){var i={"slick-arrow":!0,"slick-next":!0},o=this.clickHandler.bind(this,{message:"next"});(0,eL.canGoNext)(this.props)||(i["slick-disabled"]=!0,o=null);var a={key:"1","data-role":"none",className:(0,BS.default)(i),style:{display:"block"},onClick:o},c={currentSlide:this.props.currentSlide,slideCount:this.props.slideCount},d;return this.props.nextArrow?d=vs.default.cloneElement(this.props.nextArrow,zu(zu({},a),c)):d=vs.default.createElement("button",Nu({key:"1",type:"button"},a)," ","Next"),d}}]),r}(vs.default.PureComponent);Ls.NextArrow=sL;var qS=function(){if(typeof Map<"u")return Map;function e(t,r){var n=-1;return t.some(function(i,o){return i[0]===r?(n=o,!0):!1}),n}return function(){function t(){this.__entries__=[]}return Object.defineProperty(t.prototype,"size",{get:function(){return this.__entries__.length},enumerable:!0,configurable:!0}),t.prototype.get=function(r){var n=e(this.__entries__,r),i=this.__entries__[n];return i&&i[1]},t.prototype.set=function(r,n){var i=e(this.__entries__,r);~i?this.__entries__[i][1]=n:this.__entries__.push([r,n])},t.prototype.delete=function(r){var n=this.__entries__,i=e(n,r);~i&&n.splice(i,1)},t.prototype.has=function(r){return!!~e(this.__entries__,r)},t.prototype.clear=function(){this.__entries__.splice(0)},t.prototype.forEach=function(r,n){n===void 0&&(n=null);for(var i=0,o=this.__entries__;i0},e.prototype.connect_=function(){!$p||this.connected_||(document.addEventListener("transitionend",this.onTransitionEnd_),window.addEventListener("resize",this.refresh),fL?(this.mutationsObserver_=new MutationObserver(this.refresh),this.mutationsObserver_.observe(document,{attributes:!0,childList:!0,characterData:!0,subtree:!0})):(document.addEventListener("DOMSubtreeModified",this.refresh),this.mutationEventsAdded_=!0),this.connected_=!0)},e.prototype.disconnect_=function(){!$p||!this.connected_||(document.removeEventListener("transitionend",this.onTransitionEnd_),window.removeEventListener("resize",this.refresh),this.mutationsObserver_&&this.mutationsObserver_.disconnect(),this.mutationEventsAdded_&&document.removeEventListener("DOMSubtreeModified",this.refresh),this.mutationsObserver_=null,this.mutationEventsAdded_=!1,this.connected_=!1)},e.prototype.onTransitionEnd_=function(t){var r=t.propertyName,n=r===void 0?"":r,i=dL.some(function(o){return!!~n.indexOf(o)});i&&this.refresh()},e.getInstance=function(){return this.instance_||(this.instance_=new e),this.instance_},e.instance_=null,e}(),ZS=function(e,t){for(var r=0,n=Object.keys(t);r"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)||(r.set(t,new _L(t)),this.controller_.addObserver(this),this.controller_.refresh())}},e.prototype.unobserve=function(t){if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");if(!(typeof Element>"u"||!(Element instanceof Object))){if(!(t instanceof Is(t).Element))throw new TypeError('parameter 1 is not of type "Element".');var r=this.observations_;r.has(t)&&(r.delete(t),r.size||this.controller_.removeObserver(this))}},e.prototype.disconnect=function(){this.clearActive(),this.observations_.clear(),this.controller_.removeObserver(this)},e.prototype.gatherActive=function(){var t=this;this.clearActive(),this.observations_.forEach(function(r){r.isActive()&&t.activeObservations_.push(r)})},e.prototype.broadcastActive=function(){if(this.hasActive()){var t=this.callbackCtx_,r=this.activeObservations_.map(function(n){return new SL(n.target,n.broadcastRect())});this.callback_.call(t,r,t),this.clearActive()}},e.prototype.clearActive=function(){this.activeObservations_.splice(0)},e.prototype.hasActive=function(){return this.activeObservations_.length>0},e}(),eb=typeof WeakMap<"u"?new WeakMap:new qS,tb=function(){function e(t){if(!(this instanceof e))throw new TypeError("Cannot call a class as a function.");if(!arguments.length)throw new TypeError("1 argument required, but only 0 present.");var r=hL.getInstance(),n=new bL(t,r,this);eb.set(this,n)}return e}();["observe","unobserve","disconnect"].forEach(function(e){tb.prototype[e]=function(){var t;return(t=eb.get(this))[e].apply(t,arguments)}});var kL=function(){return typeof Hu.ResizeObserver<"u"?Hu.ResizeObserver:tb}();const CL=Object.freeze(Object.defineProperty({__proto__:null,default:kL},Symbol.toStringTag,{value:"Module"})),DL=DE(CL);Object.defineProperty(Gd,"__esModule",{value:!0});Gd.InnerSlider=void 0;var Qt=Rl(I),jL=Rl(PS),EL=Rl(yM),AL=Rl(Ms),rt=W,TL=Xd,RL=Qd,X1=Ls,OL=Rl(DL);function Rl(e){return e&&e.__esModule?e:{default:e}}function Fu(e){return Fu=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},Fu(e)}function Uu(){return Uu=Object.assign||function(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function ML(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}function Q1(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function de(e){for(var t=1;t"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function $u(e){return $u=Object.setPrototypeOf?Object.getPrototypeOf:function(r){return r.__proto__||Object.getPrototypeOf(r)},$u(e)}function Se(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}var VL=function(e){NL(r,e);var t=zL(r);function r(n){var i;LL(this,r),i=t.call(this,n),Se(_e(i),"listRefHandler",function(a){return i.list=a}),Se(_e(i),"trackRefHandler",function(a){return i.track=a}),Se(_e(i),"adaptHeight",function(){if(i.props.adaptiveHeight&&i.list){var a=i.list.querySelector('[data-index="'.concat(i.state.currentSlide,'"]'));i.list.style.height=(0,rt.getHeight)(a)+"px"}}),Se(_e(i),"componentDidMount",function(){if(i.props.onInit&&i.props.onInit(),i.props.lazyLoad){var a=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));a.length>0&&(i.setState(function(d){return{lazyLoadedList:d.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a))}var c=de({listRef:i.list,trackRef:i.track},i.props);i.updateState(c,!0,function(){i.adaptHeight(),i.props.autoplay&&i.autoPlay("update")}),i.props.lazyLoad==="progressive"&&(i.lazyLoadTimer=setInterval(i.progressiveLazyLoad,1e3)),i.ro=new OL.default(function(){i.state.animating?(i.onWindowResized(!1),i.callbackTimers.push(setTimeout(function(){return i.onWindowResized()},i.props.speed))):i.onWindowResized()}),i.ro.observe(i.list),document.querySelectorAll&&Array.prototype.forEach.call(document.querySelectorAll(".slick-slide"),function(d){d.onfocus=i.props.pauseOnFocus?i.onSlideFocus:null,d.onblur=i.props.pauseOnFocus?i.onSlideBlur:null}),window.addEventListener?window.addEventListener("resize",i.onWindowResized):window.attachEvent("onresize",i.onWindowResized)}),Se(_e(i),"componentWillUnmount",function(){i.animationEndCallback&&clearTimeout(i.animationEndCallback),i.lazyLoadTimer&&clearInterval(i.lazyLoadTimer),i.callbackTimers.length&&(i.callbackTimers.forEach(function(a){return clearTimeout(a)}),i.callbackTimers=[]),window.addEventListener?window.removeEventListener("resize",i.onWindowResized):window.detachEvent("onresize",i.onWindowResized),i.autoplayTimer&&clearInterval(i.autoplayTimer),i.ro.disconnect()}),Se(_e(i),"componentDidUpdate",function(a){if(i.checkImagesLoad(),i.props.onReInit&&i.props.onReInit(),i.props.lazyLoad){var c=(0,rt.getOnDemandLazySlides)(de(de({},i.props),i.state));c.length>0&&(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(c)}}),i.props.onLazyLoad&&i.props.onLazyLoad(c))}i.adaptHeight();var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state),h=i.didPropsChange(a);h&&i.updateState(d,h,function(){i.state.currentSlide>=Qt.default.Children.count(i.props.children)&&i.changeSlide({message:"index",index:Qt.default.Children.count(i.props.children)-i.props.slidesToShow,currentSlide:i.state.currentSlide}),i.props.autoplay?i.autoPlay("update"):i.pause("paused")})}),Se(_e(i),"onWindowResized",function(a){i.debouncedResize&&i.debouncedResize.cancel(),i.debouncedResize=(0,EL.default)(function(){return i.resizeWindow(a)},50),i.debouncedResize()}),Se(_e(i),"resizeWindow",function(){var a=arguments.length>0&&arguments[0]!==void 0?arguments[0]:!0,c=!!(i.track&&i.track.node);if(c){var d=de(de({listRef:i.list,trackRef:i.track},i.props),i.state);i.updateState(d,a,function(){i.props.autoplay?i.autoPlay("update"):i.pause("paused")}),i.setState({animating:!1}),clearTimeout(i.animationEndCallback),delete i.animationEndCallback}}),Se(_e(i),"updateState",function(a,c,d){var h=(0,rt.initializedState)(a);a=de(de(de({},a),h),{},{slideIndex:h.currentSlide});var g=(0,rt.getTrackLeft)(a);a=de(de({},a),{},{left:g});var v=(0,rt.getTrackCSS)(a);(c||Qt.default.Children.count(i.props.children)!==Qt.default.Children.count(a.children))&&(h.trackStyle=v),i.setState(h,d)}),Se(_e(i),"ssrInit",function(){if(i.props.variableWidth){var a=0,c=0,d=[],h=(0,rt.getPreClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length})),g=(0,rt.getPostClones)(de(de(de({},i.props),i.state),{},{slideCount:i.props.children.length}));i.props.children.forEach(function(P){d.push(P.props.style.width),a+=P.props.style.width});for(var v=0;v=c&&i.onWindowResized()};if(!h.onclick)h.onclick=function(){return h.parentNode.focus()};else{var v=h.onclick;h.onclick=function(){v(),h.parentNode.focus()}}h.onload||(i.props.lazyLoad?h.onload=function(){i.adaptHeight(),i.callbackTimers.push(setTimeout(i.onWindowResized,i.props.speed))}:(h.onload=g,h.onerror=function(){g(),i.props.onLazyLoadError&&i.props.onLazyLoadError()}))})}),Se(_e(i),"progressiveLazyLoad",function(){for(var a=[],c=de(de({},i.props),i.state),d=i.state.currentSlide;d=-(0,rt.getPreClones)(c);h--)if(i.state.lazyLoadedList.indexOf(h)<0){a.push(h);break}a.length>0?(i.setState(function(g){return{lazyLoadedList:g.lazyLoadedList.concat(a)}}),i.props.onLazyLoad&&i.props.onLazyLoad(a)):i.lazyLoadTimer&&(clearInterval(i.lazyLoadTimer),delete i.lazyLoadTimer)}),Se(_e(i),"slideHandler",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=i.props,h=d.asNavFor,g=d.beforeChange,v=d.onLazyLoad,_=d.speed,k=d.afterChange,C=i.state.currentSlide,D=(0,rt.slideHandler)(de(de(de({index:a},i.props),i.state),{},{trackRef:i.track,useCSS:i.props.useCSS&&!c})),j=D.state,y=D.nextState;if(j){g&&g(C,j.currentSlide);var w=j.lazyLoadedList.filter(function(S){return i.state.lazyLoadedList.indexOf(S)<0});v&&w.length>0&&v(w),!i.props.waitForAnimate&&i.animationEndCallback&&(clearTimeout(i.animationEndCallback),k&&k(C),delete i.animationEndCallback),i.setState(j,function(){h&&i.asNavForIndex!==a&&(i.asNavForIndex=a,h.innerSlider.slideHandler(a)),y&&(i.animationEndCallback=setTimeout(function(){var S=y.animating,E=PL(y,["animating"]);i.setState(E,function(){i.callbackTimers.push(setTimeout(function(){return i.setState({animating:S})},10)),k&&k(j.currentSlide),delete i.animationEndCallback})},_))})}}),Se(_e(i),"changeSlide",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,d=de(de({},i.props),i.state),h=(0,rt.changeSlide)(d,a);if(!(h!==0&&!h)&&(c===!0?i.slideHandler(h,c):i.slideHandler(h),i.props.autoplay&&i.autoPlay("update"),i.props.focusOnSelect)){var g=i.list.querySelectorAll(".slick-current");g[0]&&g[0].focus()}}),Se(_e(i),"clickHandler",function(a){i.clickable===!1&&(a.stopPropagation(),a.preventDefault()),i.clickable=!0}),Se(_e(i),"keyHandler",function(a){var c=(0,rt.keyHandler)(a,i.props.accessibility,i.props.rtl);c!==""&&i.changeSlide({message:c})}),Se(_e(i),"selectHandler",function(a){i.changeSlide(a)}),Se(_e(i),"disableBodyScroll",function(){var a=function(d){d=d||window.event,d.preventDefault&&d.preventDefault(),d.returnValue=!1};window.ontouchmove=a}),Se(_e(i),"enableBodyScroll",function(){window.ontouchmove=null}),Se(_e(i),"swipeStart",function(a){i.props.verticalSwiping&&i.disableBodyScroll();var c=(0,rt.swipeStart)(a,i.props.swipe,i.props.draggable);c!==""&&i.setState(c)}),Se(_e(i),"swipeMove",function(a){var c=(0,rt.swipeMove)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));c&&(c.swiping&&(i.clickable=!1),i.setState(c))}),Se(_e(i),"swipeEnd",function(a){var c=(0,rt.swipeEnd)(a,de(de(de({},i.props),i.state),{},{trackRef:i.track,listRef:i.list,slideIndex:i.state.currentSlide}));if(c){var d=c.triggerSlideHandler;delete c.triggerSlideHandler,i.setState(c),d!==void 0&&(i.slideHandler(d),i.props.verticalSwiping&&i.enableBodyScroll())}}),Se(_e(i),"touchEnd",function(a){i.swipeEnd(a),i.clickable=!0}),Se(_e(i),"slickPrev",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"previous"})},0))}),Se(_e(i),"slickNext",function(){i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"next"})},0))}),Se(_e(i),"slickGoTo",function(a){var c=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(a=Number(a),isNaN(a))return"";i.callbackTimers.push(setTimeout(function(){return i.changeSlide({message:"index",index:a,currentSlide:i.state.currentSlide},c)},0))}),Se(_e(i),"play",function(){var a;if(i.props.rtl)a=i.state.currentSlide-i.props.slidesToScroll;else if((0,rt.canGoNext)(de(de({},i.props),i.state)))a=i.state.currentSlide+i.props.slidesToScroll;else return!1;i.slideHandler(a)}),Se(_e(i),"autoPlay",function(a){i.autoplayTimer&&clearInterval(i.autoplayTimer);var c=i.state.autoplaying;if(a==="update"){if(c==="hovered"||c==="focused"||c==="paused")return}else if(a==="leave"){if(c==="paused"||c==="focused")return}else if(a==="blur"&&(c==="paused"||c==="hovered"))return;i.autoplayTimer=setInterval(i.play,i.props.autoplaySpeed+50),i.setState({autoplaying:"playing"})}),Se(_e(i),"pause",function(a){i.autoplayTimer&&(clearInterval(i.autoplayTimer),i.autoplayTimer=null);var c=i.state.autoplaying;a==="paused"?i.setState({autoplaying:"paused"}):a==="focused"?(c==="hovered"||c==="playing")&&i.setState({autoplaying:"focused"}):c==="playing"&&i.setState({autoplaying:"hovered"})}),Se(_e(i),"onDotsOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onDotsLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onTrackOver",function(){return i.props.autoplay&&i.pause("hovered")}),Se(_e(i),"onTrackLeave",function(){return i.props.autoplay&&i.state.autoplaying==="hovered"&&i.autoPlay("leave")}),Se(_e(i),"onSlideFocus",function(){return i.props.autoplay&&i.pause("focused")}),Se(_e(i),"onSlideBlur",function(){return i.props.autoplay&&i.state.autoplaying==="focused"&&i.autoPlay("blur")}),Se(_e(i),"render",function(){var a=(0,AL.default)("slick-slider",i.props.className,{"slick-vertical":i.props.vertical,"slick-initialized":!0}),c=de(de({},i.props),i.state),d=(0,rt.extractObject)(c,["fade","cssEase","speed","infinite","centerMode","focusOnSelect","currentSlide","lazyLoad","lazyLoadedList","rtl","slideWidth","slideHeight","listHeight","vertical","slidesToShow","slidesToScroll","slideCount","trackStyle","variableWidth","unslick","centerPadding","targetSlide","useCSS"]),h=i.props.pauseOnHover;d=de(de({},d),{},{onMouseEnter:h?i.onTrackOver:null,onMouseLeave:h?i.onTrackLeave:null,onMouseOver:h?i.onTrackOver:null,focusOnSelect:i.props.focusOnSelect&&i.clickable?i.selectHandler:null});var g;if(i.props.dots===!0&&i.state.slideCount>=i.props.slidesToShow){var v=(0,rt.extractObject)(c,["dotsClass","slideCount","slidesToShow","currentSlide","slidesToScroll","clickHandler","children","customPaging","infinite","appendDots"]),_=i.props.pauseOnDotsHover;v=de(de({},v),{},{clickHandler:i.changeSlide,onMouseEnter:_?i.onDotsLeave:null,onMouseOver:_?i.onDotsOver:null,onMouseLeave:_?i.onDotsLeave:null}),g=Qt.default.createElement(RL.Dots,v)}var k,C,D=(0,rt.extractObject)(c,["infinite","centerMode","currentSlide","slideCount","slidesToShow","prevArrow","nextArrow"]);D.clickHandler=i.changeSlide,i.props.arrows&&(k=Qt.default.createElement(X1.PrevArrow,D),C=Qt.default.createElement(X1.NextArrow,D));var j=null;i.props.vertical&&(j={height:i.state.listHeight});var y=null;i.props.vertical===!1?i.props.centerMode===!0&&(y={padding:"0px "+i.props.centerPadding}):i.props.centerMode===!0&&(y={padding:i.props.centerPadding+" 0px"});var w=de(de({},j),y),S=i.props.touchMove,E={className:"slick-list",style:w,onClick:i.clickHandler,onMouseDown:S?i.swipeStart:null,onMouseMove:i.state.dragging&&S?i.swipeMove:null,onMouseUp:S?i.swipeEnd:null,onMouseLeave:i.state.dragging&&S?i.swipeEnd:null,onTouchStart:S?i.swipeStart:null,onTouchMove:i.state.dragging&&S?i.swipeMove:null,onTouchEnd:S?i.touchEnd:null,onTouchCancel:i.state.dragging&&S?i.swipeEnd:null,onKeyDown:i.props.accessibility?i.keyHandler:null},T={className:a,dir:"ltr",style:i.props.style};return i.props.unslick&&(E={className:"slick-list"},T={className:a}),Qt.default.createElement("div",T,i.props.unslick?"":k,Qt.default.createElement("div",Uu({ref:i.listRefHandler},E),Qt.default.createElement(TL.Track,Uu({ref:i.trackRefHandler},d),i.props.children)),i.props.unslick?"":C,i.props.unslick?"":g)}),i.list=null,i.track=null,i.state=de(de({},jL.default),{},{currentSlide:i.props.initialSlide,slideCount:Qt.default.Children.count(i.props.children)}),i.callbackTimers=[],i.clickable=!0,i.debouncedResize=null;var o=i.ssrInit();return i.state=de(de({},i.state),o),i}return IL(r,[{key:"didPropsChange",value:function(i){for(var o=!1,a=0,c=Object.keys(this.props);a"u"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy=="function")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch{return!1}}function E(O){return E=Object.setPrototypeOf?Object.getPrototypeOf:function(Y){return Y.__proto__||Object.getPrototypeOf(Y)},E(O)}function T(O,z,Y){return z in O?Object.defineProperty(O,z,{value:Y,enumerable:!0,configurable:!0,writable:!0}):O[z]=Y,O}var R=(0,a.canUseDOM)()&&qL(),P=function(O){C(Y,O);var z=j(Y);function Y(ee){var te;return v(this,Y),te=z.call(this,ee),T(w(te),"innerSliderRefHandler",function(G){return te.innerSlider=G}),T(w(te),"slickPrev",function(){return te.innerSlider.slickPrev()}),T(w(te),"slickNext",function(){return te.innerSlider.slickNext()}),T(w(te),"slickGoTo",function(G){var lt=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;return te.innerSlider.slickGoTo(G,lt)}),T(w(te),"slickPause",function(){return te.innerSlider.pause("paused")}),T(w(te),"slickPlay",function(){return te.innerSlider.autoPlay("play")}),te.state={breakpoint:null},te._responsiveMediaHandlers=[],te}return k(Y,[{key:"media",value:function(te,G){R.register(te,G),this._responsiveMediaHandlers.push({query:te,handler:G})}},{key:"componentDidMount",value:function(){var te=this;if(this.props.responsive){var G=this.props.responsive.map(function(Ee){return Ee.breakpoint});G.sort(function(Ee,ze){return Ee-ze}),G.forEach(function(Ee,ze){var mt;ze===0?mt=(0,i.default)({minWidth:0,maxWidth:Ee}):mt=(0,i.default)({minWidth:G[ze-1]+1,maxWidth:Ee}),(0,a.canUseDOM)()&&te.media(mt,function(){te.setState({breakpoint:Ee})})});var lt=(0,i.default)({minWidth:G.slice(-1)[0]});(0,a.canUseDOM)()&&this.media(lt,function(){te.setState({breakpoint:null})})}}},{key:"componentWillUnmount",value:function(){this._responsiveMediaHandlers.forEach(function(te){R.unregister(te.query,te.handler)})}},{key:"render",value:function(){var te=this,G,lt;this.state.breakpoint?(lt=this.props.responsive.filter(function(Fe){return Fe.breakpoint===te.state.breakpoint}),G=lt[0].settings==="unslick"?"unslick":g(g(g({},o.default),this.props),lt[0].settings)):G=g(g({},o.default),this.props),G.centerMode&&(G.slidesToScroll>1,G.slidesToScroll=1),G.fade&&(G.slidesToShow>1,G.slidesToScroll>1,G.slidesToShow=1,G.slidesToScroll=1);var Ee=r.default.Children.toArray(this.props.children);Ee=Ee.filter(function(Fe){return typeof Fe=="string"?!!Fe.trim():!!Fe}),G.variableWidth&&(G.rows>1||G.slidesPerRow>1)&&(console.warn("variableWidth is not supported in case of rows > 1 or slidesPerRow > 1"),G.variableWidth=!1);for(var ze=[],mt=null,$=0;$=Ee.length));he+=1)ue.push(r.default.cloneElement(Ee[he],{key:100*$+10*Q+he,tabIndex:-1,style:{width:"".concat(100/G.slidesPerRow,"%"),display:"inline-block"}}));le.push(r.default.createElement("div",{key:10*$+Q},ue))}G.variableWidth?ze.push(r.default.createElement("div",{key:$,style:{width:mt}},le)):ze.push(r.default.createElement("div",{key:$},le))}if(G==="unslick"){var st="regular slider "+(this.props.className||"");return r.default.createElement("div",{className:st},Ee)}else ze.length<=G.slidesToShow&&(G.unslick=!0);return r.default.createElement(n.InnerSlider,d({style:this.props.style,ref:this.innerSliderRefHandler},G),ze)}}]),Y}(r.default.Component);e.default=P})(OS);(function(e){Object.defineProperty(e,"__esModule",{value:!0}),e.default=void 0;var t=r(OS);function r(i){return i&&i.__esModule?i:{default:i}}var n=t.default;e.default=n})(RS);const ZL=C2(RS),yn=f.button` padding-block: 0.12rem; padding-inline: 0.34rem; color: inherit; @@ -651,9 +651,9 @@ Error generating stack: `+o.message+` `,M3=f.img` width: 100%; margin-bottom: -0.24rem; -`,L3=()=>l.jsx(R3,{children:l.jsxs(O3,{children:[l.jsx(P3,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 的发展引起算力资源的紧张、分散和昂贵"}),l.jsxs(ow,{children:[l.jsxs(sw,{children:[l.jsxs(bc,{children:[l.jsx(kc,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。"}),"GPU 算力供不应求,供需极度不平衡。这进一步",l.jsx(kc,{children:"推高"}),"了原本因设计和制造成本以及市场垄断等因素就",l.jsx(kc,{children:"已经高企不下的GPU 算力价格"}),"。"]}),l.jsxs(bc,{children:["GPU 算力资源优先满足 AI 训练场景,这造成 ",l.jsx(kc,{children:"AI 推断场景的 GPU 算力资源具有分散或碎片化"}),"的特点。"]})]}),l.jsx(aw,{src:E3})]})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(M3,{src:A3})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"将云计算资源复用的方式引入 AI 算力资源分配管理"}),l.jsxs(ow,{children:[l.jsx(aw,{src:T3}),l.jsxs(sw,{children:[l.jsx(bc,{children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能; "}),l.jsx(bc,{children:" 高性能RDMA网络,实现多节点内存共享,加速大模型的分发、加载。"})]})]})]})]})}),I3="/zh-cn/assets/logo-dark-027b6609.svg",N3="/zh-cn/assets/xline-logo-126dc1a3.svg",lw="/zh-cn/assets/cone-62ca8bad.png",{Heading:z3,Paragraph:Y3}=Pe,{CNHead4:Zd,CNTitleLarge:H3}=z3,{CNBodyLarge:Jd}=Y3,F3=f.section` +`,L3=()=>l.jsx(R3,{children:l.jsxs(O3,{children:[l.jsx(P3,{children:"DatenLord 存储+网络的融合方案解决 AI 算力资源问题"}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 的发展引起算力资源的紧张、分散和昂贵"}),l.jsxs(ow,{children:[l.jsxs(sw,{children:[l.jsxs(bc,{children:[l.jsx(kc,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。"}),"GPU 算力供不应求,供需极度不平衡。这进一步",l.jsx(kc,{children:"推高"}),"了原本因设计和制造成本以及市场垄断等因素就",l.jsx(kc,{children:"已经高企不下的GPU 算力价格"}),"。"]}),l.jsxs(bc,{children:["GPU 算力资源优先满足 AI 训练场景,这造成 ",l.jsx(kc,{children:"AI 推断场景的 GPU 算力资源具有分散或碎片化"}),"的特点。"]})]}),l.jsx(aw,{src:E3})]})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"AI 算力资源的分散和昂贵对云计算带来的新问题"}),l.jsx(M3,{src:A3})]}),l.jsxs(Eh,{children:[l.jsx(Ah,{children:"将云计算资源复用的方式引入 AI 算力资源分配管理"}),l.jsxs(ow,{children:[l.jsx(aw,{src:T3}),l.jsxs(sw,{children:[l.jsx(bc,{children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能; "}),l.jsx(bc,{children:" 高性能RDMA网络,实现多节点内存共享,加速大模型的分发、加载。"})]})]})]})]})}),I3="/zh-cn/assets/logo-dark-027b6609.svg",N3="/zh-cn/assets/xline-logo-126dc1a3.svg",lw="/zh-cn/assets/cone-62ca8bad.png",{Heading:z3,Paragraph:Y3}=Pe,{CNHead4:Zd,CNTitleLarge:H3}=z3,{CNBodyLarge:Jd}=Y3,V3=f.section` background: #ededf6; -`,V3=f.div` +`,F3=f.div` display: flex; flex-direction: column; align-items: center; @@ -855,7 +855,7 @@ Error generating stack: `+o.message+` height: 0.22rem; background: #7680dd; border-radius: 50%; -`,Dg=()=>{const e=ht();return l.jsx(F3,{children:l.jsxs(V3,{children:[l.jsx(U3,{children:"开源产品"}),l.jsxs($3,{id:"datenlord",children:[l.jsxs(G3,{children:[l.jsx(Q3,{src:I3}),l.jsx(q3,{children:"DatenLord 高性能分布式存储"}),l.jsx(Z3,{children:"DatenLord 是开源高性能分布式存储平台,帮助企业实现在 AI + Cloud 场景下的高效数据访问需求。该平台为用户提供了丰富的系统结构,包括 Posix 文件接口, KV接口和面向对象存储接口等,用户可以根据需求选择适合自己的方式。DatenLord 使用了软硬件融合的方式,充分发挥软硬件的性能潜力,实现了极致的数据传输和读写性能。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://github.com/datenlord/datenlord",children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(uI,{}),l.jsx(hI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(gI,{}),l.jsx(vI,{})]})]}),l.jsxs(B3,{id:"xline",children:[l.jsxs(K3,{children:[l.jsx(tI,{src:N3}),l.jsxs(rI,{children:[l.jsx(J3,{children:"Xline 开源分布式KV存储系统"}),l.jsx(eI,{children:"保证数据在跨数据中心,跨云访问时的一致性, 方便业务系统实现多地多中心多活部署。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://xline.cloud/",children:"了解更多"})]}),l.jsxs(SI,{children:[l.jsx(hw,{}),l.jsx(bI,{}),l.jsx(hw,{})]})]}),l.jsxs(Th,{children:[l.jsx(dI,{}),l.jsx(mI,{}),l.jsx(lI,{}),l.jsx(cI,{}),l.jsx(yI,{}),l.jsx(wI,{}),l.jsx(nI,{src:lw}),l.jsx(iI,{src:lw})]})]}),l.jsxs(W3,{id:"rdma",children:[l.jsxs(X3,{children:[l.jsx(oI,{children:"RDMA 高性能网络"}),l.jsx(sI,{children:"跨云场景下,网络对数据访问的性能影响最为突出,DatenLord采用高性能网络RDMA来降低延迟并提高带宽。RDMA方面我们有多个相关的开源项目:"}),l.jsxs(aI,{children:[l.jsx(cw,{as:"li",children:"async-rdma"}),l.jsx(uw,{children:"是用Rust封装的RDMA异步API库,它为编写RDMA应用程序提供高级抽象和异步API接口。"}),l.jsx(cw,{as:"li",children:"open-rdma"}),l.jsx(uw,{children:"是RDMA协议的开源硬件实现,采用Bluespec和SpinalHDL实现,目前主要实现了RoCEv2协议,此外,我们还进行一些特定功能的拓展来提升RDMA的传输效率。"})]}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>{e("/rdma")},children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(fI,{}),l.jsx(pI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(xI,{}),l.jsx(_I,{})]})]})]})})},ib="/zh-cn/assets/icon-cpu-f816a729.svg",ob="/zh-cn/assets/icon-inbox-c658ae9a.svg",{Heading:kI,Paragraph:CI}=Pe,{CNHead4:sb}=kI,{CNBodyLarge:DI,CNMarkSmall:jI}=CI,EI=f.section` +`,Dg=()=>{const e=ht();return l.jsx(V3,{children:l.jsxs(F3,{children:[l.jsx(U3,{children:"开源产品"}),l.jsxs($3,{id:"datenlord",children:[l.jsxs(G3,{children:[l.jsx(Q3,{src:I3}),l.jsx(q3,{children:"DatenLord 高性能分布式存储"}),l.jsx(Z3,{children:"DatenLord 是开源高性能分布式存储平台,帮助企业实现在 AI + Cloud 场景下的高效数据访问需求。该平台为用户提供了丰富的系统结构,包括 Posix 文件接口, KV接口和面向对象存储接口等,用户可以根据需求选择适合自己的方式。DatenLord 使用了软硬件融合的方式,充分发挥软硬件的性能潜力,实现了极致的数据传输和读写性能。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://github.com/datenlord/datenlord",children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(uI,{}),l.jsx(hI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(gI,{}),l.jsx(vI,{})]})]}),l.jsxs(B3,{id:"xline",children:[l.jsxs(K3,{children:[l.jsx(tI,{src:N3}),l.jsxs(rI,{children:[l.jsx(J3,{children:"Xline 开源分布式KV存储系统"}),l.jsx(eI,{children:"保证数据在跨数据中心,跨云访问时的一致性, 方便业务系统实现多地多中心多活部署。"}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>window.location.href="https://xline.cloud/",children:"了解更多"})]}),l.jsxs(SI,{children:[l.jsx(hw,{}),l.jsx(bI,{}),l.jsx(hw,{})]})]}),l.jsxs(Th,{children:[l.jsx(dI,{}),l.jsx(mI,{}),l.jsx(lI,{}),l.jsx(cI,{}),l.jsx(yI,{}),l.jsx(wI,{}),l.jsx(nI,{src:lw}),l.jsx(iI,{src:lw})]})]}),l.jsxs(W3,{id:"rdma",children:[l.jsxs(X3,{children:[l.jsx(oI,{children:"RDMA 高性能网络"}),l.jsx(sI,{children:"跨云场景下,网络对数据访问的性能影响最为突出,DatenLord采用高性能网络RDMA来降低延迟并提高带宽。RDMA方面我们有多个相关的开源项目:"}),l.jsxs(aI,{children:[l.jsx(cw,{as:"li",children:"async-rdma"}),l.jsx(uw,{children:"是用Rust封装的RDMA异步API库,它为编写RDMA应用程序提供高级抽象和异步API接口。"}),l.jsx(cw,{as:"li",children:"open-rdma"}),l.jsx(uw,{children:"是RDMA协议的开源硬件实现,采用Bluespec和SpinalHDL实现,目前主要实现了RoCEv2协议,此外,我们还进行一些特定功能的拓展来提升RDMA的传输效率。"})]}),l.jsx(yn,{style:{width:"max-content",color:"#fff"},onClick:()=>{e("/rdma")},children:"了解更多"})]}),l.jsxs(Th,{children:[l.jsx(fI,{}),l.jsx(pI,{}),l.jsx(dw,{}),l.jsx(fw,{}),l.jsx(xI,{}),l.jsx(_I,{})]})]})]})})},ib="/zh-cn/assets/icon-cpu-f816a729.svg",ob="/zh-cn/assets/icon-inbox-c658ae9a.svg",{Heading:kI,Paragraph:CI}=Pe,{CNHead4:sb}=kI,{CNBodyLarge:DI,CNMarkSmall:jI}=CI,EI=f.section` background: #fff; `,AI=f.div` max-width: 1440px; @@ -931,10 +931,10 @@ Error generating stack: `+o.message+` height: 0.9rem; background: ${e=>e.bg}; border-radius: 50%; -`,FI=f.img` +`,VI=f.img` width: 90%; height: 90%; -`,VI=f.ul` +`,FI=f.ul` padding-left: 0.18rem; `,UI=f(DI)``,$I=f.div` width: 100%; @@ -945,7 +945,7 @@ Error generating stack: `+o.message+` border-radius: 0.16rem; padding-block: 0.04rem; margin-top: 0.18rem; -`,BI=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"/mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Project Internship",label_zh:"开源毕业设计",url:"",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],WI=()=>{const e=ht();return l.jsx(EI,{children:l.jsxs(AI,{children:[l.jsx(TI,{children:"学习社区"}),l.jsx(RI,{children:BI.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,url:a,content:c})=>l.jsxs(OI,{children:[l.jsxs(LI,{children:[l.jsx(HI,{bg:n,children:l.jsx(FI,{src:r})}),l.jsxs(II,{children:[l.jsx(tf,{bg:n}),l.jsx(NI,{bg:n}),l.jsx(zI,{bg:n}),l.jsx(YI,{bg:n})]})]}),l.jsx(PI,{children:i}),l.jsx(MI,{children:o}),l.jsx(VI,{children:c.map(({key:d,label:h})=>l.jsx(UI,{as:"li",children:h},d))}),a&&l.jsx($I,{onClick:()=>e("/mit",{replace:!0}),children:"了解详情"})]},t))})]})})},GI="/zh-cn/assets/bg-explore-0e46a645.png",KI="/zh-cn/assets/icon-arrow-right-black-87133825.svg",XI="/zh-cn/assets/icon-arrow-right-white-84c4ff12.svg",{Heading:QI}=Pe,{CNHead4:ab}=QI,qI=[{key:"first",content:"我们致力于探索前沿科技,拥抱创新与改变,并做持续的技术分享与思考。",url:"/tech-talk"},{key:"second",content:"我们一直深耕科学前沿技术的研究和软硬件融合创新的实践,并对外持续输出我们的创新观察。",url:"/blogs"}],ZI=f.section` +`,BI=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"/mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Project Internship",label_zh:"开源毕业设计",url:"",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],WI=()=>{const e=ht();return l.jsx(EI,{children:l.jsxs(AI,{children:[l.jsx(TI,{children:"学习社区"}),l.jsx(RI,{children:BI.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,url:a,content:c})=>l.jsxs(OI,{children:[l.jsxs(LI,{children:[l.jsx(HI,{bg:n,children:l.jsx(VI,{src:r})}),l.jsxs(II,{children:[l.jsx(tf,{bg:n}),l.jsx(NI,{bg:n}),l.jsx(zI,{bg:n}),l.jsx(YI,{bg:n})]})]}),l.jsx(PI,{children:i}),l.jsx(MI,{children:o}),l.jsx(FI,{children:c.map(({key:d,label:h})=>l.jsx(UI,{as:"li",children:h},d))}),a&&l.jsx($I,{onClick:()=>e("/mit",{replace:!0}),children:"了解详情"})]},t))})]})})},GI="/zh-cn/assets/bg-explore-0e46a645.png",KI="/zh-cn/assets/icon-arrow-right-black-87133825.svg",XI="/zh-cn/assets/icon-arrow-right-white-84c4ff12.svg",{Heading:QI}=Pe,{CNHead4:ab}=QI,qI=[{key:"first",content:"我们致力于探索前沿科技,拥抱创新与改变,并做持续的技术分享与思考。",url:"/tech-talk"},{key:"second",content:"我们一直深耕科学前沿技术的研究和软硬件融合创新的实践,并对外持续输出我们的创新观察。",url:"/blogs"}],ZI=f.section` background: ${e=>e.theme.themeDark}; background-image: url(${GI}); background-size: cover; @@ -1070,9 +1070,9 @@ Error generating stack: `+o.message+` background: linear-gradient(270deg, #7b7ce340, #926cd3); `,Y6=f(R6)` padding-inline: 0.24rem; -`,H6=f(O6)``,F6=f(cb)` +`,H6=f(O6)``,V6=f(cb)` padding-bottom: 0.39rem; -`,V6=f.ul` +`,F6=f.ul` padding-left: 0.24rem; padding-bottom: 0.39rem; `,U6=f(cb)``,$6=f.img` @@ -1080,7 +1080,7 @@ Error generating stack: `+o.message+` padding-bottom: 0.58rem; width: 4.18rem; float: right; -`,B6=[{key:"Async-RDMA",title:"Async-RDMA",subTitle:"Async-RDMA是一个框架,为编写远程Remote Direct Memory Access(RDMA)应用程序提供高级抽象和异步API。",main:[{key:1,type:"text",content:"RDMA可以实现从一台机器到另一台机器对内存的直接访问。这可以提高需要低延迟和高吞吐量的应用程序的性能。RDMA支持内核旁路和零拷贝,无需CPU的参与。"},{key:2,type:"text",content:"然而,用低级别的C语言库编写RDMA应用程序往往很困难,而且容易出错。为了让事情变得更简单,我们开发了Async-RDMA,它提供了易于使用的API,隐藏了底层RDMA操作的复杂性。有了Async-RDMA,大多数RDMA操作只需一行代码就能完成。它提供了以下几点主要的功能:"},{key:3,type:"list",items:[{key:1,text:"作为与RDMA端点建立连接的工具。"},{key:2,text:"作为在端点之间传输数据的高级异步API。"},{key:3,text:"作为管理RDMA内存区域的高级API。"},{key:4,text:"作为一个在幕后工作的框架来管理内存区域并异步执行RDMA请求。"}]}],url:"https://github.com/datenlord/async-rdma"},{key:"Open-RDMA",title:"Open-RDMA",subTitle:"Open-RDMA 是一个开源的、基于 RoCE v2 协议扩展优化的软硬件实现套件",main:[{key:1,type:"text",content:"RoCE v2(RDMA over Converged Ethernet version 2)是一个网络协议来在以太网上实现远程直接内存访问(RDMA)。它是对于原始RoCE标准的改进,为在以太网上执行RDMA提供了一种更有效且可扩展的方式。"},{key:2,type:"text",content:"Open-RDMA 套件的核心部分是基于 RoCE v2 协议进行再次扩展优化后的软硬件实现,充分发挥软硬件协同设计开发的优势,通过硬件加速实现高吞吐低延迟,通过软件用户态协议栈实现集中管理且高度可配置的传输策略,从而实现在不同网络环境下都可以发挥极致性能。项目采用 Bluespec SystemVerilog、C 和 Rust 来实现硬件及软件逻辑,从而确保开源项目的正确性和可维护性。"},{key:3,type:"text",content:"在测试及验证方面,我们积极采用开源验证工具,同时也开发了自己的验证工具。Open-RDMA 套件通过 Bluesim、Cocotb 工具来进行RTL级别的验证,通过自研的 RoCE-Sim 工具进行协议数据包级别的验证,通过 Distro-Sim 工具进行软硬件联合仿真验证和调试。"},{key:4,type:"text",content:"目前,我们已经实现了整个开源套件的基本框架,并正在逐步加入更多功能。"}],url:"https://github.com/datenlord/open-rdma",img:E6}],W6=({item:e})=>{const{title:t,subTitle:r,img:n,main:i,url:o}=e;return l.jsxs(L6,{children:[l.jsxs(I6,{children:[l.jsx(N6,{}),l.jsx(Y6,{children:t}),l.jsx(z6,{})]}),l.jsx(H6,{style:{paddingBottom:"0.41rem",color:"#000"},children:r}),n&&l.jsx($6,{src:n}),i.map(({key:a,type:c,content:d,items:h})=>c==="text"?l.jsx(F6,{children:d},a):c==="list"?l.jsx(V6,{children:h==null?void 0:h.map(({key:g,text:v})=>l.jsx(U6,{as:"li",children:v},g))},a):null),l.jsx(yn,{style:{color:"#fff",display:"block"},onClick:()=>{window.location.href=`${o}`},children:"了解更多"})]})},G6=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:j6,children:"RDMA"}),l.jsx(P6,{children:l.jsx(M6,{children:B6.map(e=>l.jsx(W6,{item:e},e.key))})})]})),K6="/zh-cn/assets/cover-4e87a707.png",X6="/zh-cn/assets/image-4f8ee5fd.png",Q6="data:image/png;base64,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",q6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7ZrfTyNVFMe/Z2a6cdVod6NPPjD7akzsQDRRo3affaBxIeFtC4LhbctfAPwF4BuxzdJNfFhDWetfQHky0cXiu8okJvgmNdFgls5cz51CGWBK57altOR+kmbm/pi53C/33nPm3gNoNBrNKRSnUiZbTVpWPRVVViq8V8GQY8WplDCQEWStR5VNzlWdjbyziyEmlgjC8G3AkONmmepwG3kiDaKHQiCJISeWCE18VDYeOxV5OzlThTDxEDcAA5rLR8Lk3I8pISgpyBhprKB+amL2p8Yd+SkKNGzk1euWWy46LrokM/+DnfDMpGyXSNQ28u9f+XrT0jpMfFldhMASVBD+QqkwtgpFGtYHj4iQFYB98b2o+L7/5NnjsSKugNbTQSADRXjEvAtFJmZ3cizAHv87liIFkBDShmmsP5ir7rFgNnrMJSKIO7hi2Lyug4wV7mQsC8PD1jYT2OLnUughsazDxx+9gU8+fDOybP0bF/t/HkIVnm4rbF6zZ3PFNnlUPLqFSvDH1WEL8jMGGeNc15Z5UggeMVs8IpxerEFBO3Eq3X7JxJ07t6LLbptQhc1rljuVO0kLgks+pkuF0cq5qi7/KlPz1dUjz8/xQvzoOD9pJfAdXx30gOsxkSYWQ6maZ+B+qdDwP6J4uua4m/mxnID/VSg79fnMThY9oO8iPPjieSa8APrwF8pr8Ya1d2QssQVp1jUMoyfOWt9FIDKaVkdOg2f5+GaP14Ca8EOjga2GNK/okv5PB6KR5q0vfoEilmWUw2nT9NLokv6LIMS9UELZG3x6bupIzxJdor8doEUI0CIgprP0/OcD/Lb3b2TZ/r66tzhoxBLhr4MXwe+m0no6EDr4jvf/xhDSciRYJuXYX3cRMkFENM6XIC0dHfhiu1lmkOu9bCjvJQwCLUU4tse5cN7EXHWLL+kgwRsdm4XRadwAtHWAFiFAiwAtQoAWAVqEAC0CtAgBageyfebkGPCyOrzPOMLHgOnz+SpxEwMrwsRslXeXsdI2jITkUeHFbrB3u1vKO7G25Ad3OhDG0R0pebgbp6JeEzDga8IJ77z9GsY/e6ttvV9//wffbv4BVYZCBHnU1+oYMMzdu+3rRKGnA7QIAYoiiOb2GXUav0D0eihVwwCgJIKAcJsJok+hyHFwRdP5ESL0vmtESQQSZ84Bk+zQpKEAd/rMdp3nmZU4zx0e+jiovWj7k/U6IVZYbxj2xA5wstkKuN4RZMRI22E9la3a9QT2TtL8bHEz70xf0s7pfmaH1M3/7pXXPnDb1VNfGAnLp7ewrUQQOmNf9shktpryuF44zzNP33PdKItQ+tqR2+qVUFZKBlPJqJHzsQIyzVNmUVjYOhOZJrDcNjCD8D26QB4JxBkFjaY6YGq+ans+d0xEhtztcidrREGA1cVygSelgpNFDORCGsROG34awliUcZL8f4s+FKJgpMm2F7jt2tErLMKqE8v6dCSCRApR9yAj39Nxn5ExRzL2CIoEgV4mtyVaxzbxGsLGS2yXCqNpKNKxsyQPZ/hT9T6rOB2OI4qGT6q4A50I0A+6/nbYyDtFvhQb5tJP8Vy0g6M7EjUScOuWUS6vjbroATKmcXJmx44sQ+f07APqeJhWcIXIOEahHjYZ471DQhzHrP4qduMuhhqNRqPRaDRx+B8VV8ixBtVqHgAAAABJRU5ErkJggg==",Z6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARySURBVHgB7Zo/b9tGGMafO1KGMtXO0qZdNHQqOshpUKBT6KLIGrWRgWxRXLtIp7qfoP4EjdOlRpwiDLoUiIOqn8DK1CF1mKFAgQKBNblbrAIBIjjkXd6zJJuyRYqk+U8Kf4BMUryzyId879577oCCgoKCgiFYkEK1hjWr63YVKcOY7Dzc/PQZEmasCIsNqyp1bFPJWWSBxPrWvfnvkSB8bIkSfs9MAAXD6ldLOw0kiK8I129ZFQlUkDFM45eRIHqo0hIL9Gq2kAL1FWubNgZSYHw4BIQaz4r6YAKJRYRr31g39BJ2tRJ+wARyZhGUAEzCpN0O/bM7mEDOJIJbAOprFx5uzifepydBZBGmRQBFJBGmSQBFaBFUCj1NAihCi9A059XN35wWARThkqU+dPMmpojYkqVJphABhQiHRGoTglJffmJA8CpJHXooTg2vGsEO9qv15Z21QBUFOrbgTWrA2whIYiLQKNCiTRUaIiGHD6tgPJizRb+na7hNuUzj0d35B0GqJBIOi0tWA+rCM4RymfWgZUO9CUKISu3Wn5Vx5aQjawPnrlzWcK6cTtPzqivQ7TqDw1l1rc2Nz9rj6oUSgWv8PnfKYarggwtlfLvyIdLg+e5L/Lz5HGHxfUTOQbLOjnpqf//zP7LGVwSp4QYSYn//AD/+9C/MX9vY7xwgSzzD4TpZZbbL45MQd5jkTQSByVX6c9XrtBJAvbYv6OavfP4u5mZnkCWeIti6qLlfFEfj682NYH1vfflpw2tG46QAV754D1njKQJj/LujvlrKx82Ni+3B4eKKtRvFis+jAIqRItBNVt03KZg03eelFA8kWAUecM4uSzksUl4FUIwUQUqKaXb8PovXw23B1r1P1uADhYNJ9Svu7548fZFLARQjRWCMnmR/n7amMlJwRi5dPI/3L5zDxx+9g7xxSoRrX/9Vc4cCpZ+B8u9xnJ+bOfzkkVMi0FswnPMzbNNgCNPMiGSJt/CWcUqEwwnXmEJgUhjZMJIQjfqyZTIRbVq+n24bmBA8k6WzTMFTF2m4u9i8U3iMSNhjVCijQ43z02Bvr4soJC7C3n+vIhkdaZJIOKiMEzlAt2dqQcrFLsLJjDNb+NUgpWIPBxqCH6kvGdoOxwJSRLcFeRm8t2yIwQhitsYqgpq2px8+tuQkWm4jJohTHYluuTMY5NE1rOuutVMUEg3arPlVj1WEEkfNPWniXsNUX9pZhcNvIwlKUALMqV0lBo11Wugna5Jx9VDW/KrHKoLbmFWhsHX3eP2CPsObrx1RoROxr45lYMPrJKT4g0LC6J1DhbJfwy/5i02Ek8YsE2JoJdtvvbBYRQrYNjf7IXEouGTKL0XLq3xsvUPPmHUfB3SmE6DXPsjHg2MG7jt1EFuCfzQB2+OZrXW/RIaUDsoGhef9oy98liTH2Sa4zZiq7pR3kSHy1Gy4MOAREnEmSy3kGDKPPReZxSaCruEmjZ7byCNkEj365ZJnGxX7oF91R8gR9GA607LUsKCgoKCgIGXeAELkjKtKm1m6AAAAAElFTkSuQmCC",J6="data:image/png;base64,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",eN="data:image/png;base64,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",{Heading:tN}=Pe,{CNHead4:rN}=tN,gw=f.div` +`,B6=[{key:"Async-RDMA",title:"Async-RDMA",subTitle:"Async-RDMA是一个框架,为编写远程Remote Direct Memory Access(RDMA)应用程序提供高级抽象和异步API。",main:[{key:1,type:"text",content:"RDMA可以实现从一台机器到另一台机器对内存的直接访问。这可以提高需要低延迟和高吞吐量的应用程序的性能。RDMA支持内核旁路和零拷贝,无需CPU的参与。"},{key:2,type:"text",content:"然而,用低级别的C语言库编写RDMA应用程序往往很困难,而且容易出错。为了让事情变得更简单,我们开发了Async-RDMA,它提供了易于使用的API,隐藏了底层RDMA操作的复杂性。有了Async-RDMA,大多数RDMA操作只需一行代码就能完成。它提供了以下几点主要的功能:"},{key:3,type:"list",items:[{key:1,text:"作为与RDMA端点建立连接的工具。"},{key:2,text:"作为在端点之间传输数据的高级异步API。"},{key:3,text:"作为管理RDMA内存区域的高级API。"},{key:4,text:"作为一个在幕后工作的框架来管理内存区域并异步执行RDMA请求。"}]}],url:"https://github.com/datenlord/async-rdma"},{key:"Open-RDMA",title:"Open-RDMA",subTitle:"Open-RDMA 是一个开源的、基于 RoCE v2 协议扩展优化的软硬件实现套件",main:[{key:1,type:"text",content:"RoCE v2(RDMA over Converged Ethernet version 2)是一个网络协议来在以太网上实现远程直接内存访问(RDMA)。它是对于原始RoCE标准的改进,为在以太网上执行RDMA提供了一种更有效且可扩展的方式。"},{key:2,type:"text",content:"Open-RDMA 套件的核心部分是基于 RoCE v2 协议进行再次扩展优化后的软硬件实现,充分发挥软硬件协同设计开发的优势,通过硬件加速实现高吞吐低延迟,通过软件用户态协议栈实现集中管理且高度可配置的传输策略,从而实现在不同网络环境下都可以发挥极致性能。项目采用 Bluespec SystemVerilog、C 和 Rust 来实现硬件及软件逻辑,从而确保开源项目的正确性和可维护性。"},{key:3,type:"text",content:"在测试及验证方面,我们积极采用开源验证工具,同时也开发了自己的验证工具。Open-RDMA 套件通过 Bluesim、Cocotb 工具来进行RTL级别的验证,通过自研的 RoCE-Sim 工具进行协议数据包级别的验证,通过 Distro-Sim 工具进行软硬件联合仿真验证和调试。"},{key:4,type:"text",content:"目前,我们已经实现了整个开源套件的基本框架,并正在逐步加入更多功能。"}],url:"https://github.com/datenlord/open-rdma",img:E6}],W6=({item:e})=>{const{title:t,subTitle:r,img:n,main:i,url:o}=e;return l.jsxs(L6,{children:[l.jsxs(I6,{children:[l.jsx(N6,{}),l.jsx(Y6,{children:t}),l.jsx(z6,{})]}),l.jsx(H6,{style:{paddingBottom:"0.41rem",color:"#000"},children:r}),n&&l.jsx($6,{src:n}),i.map(({key:a,type:c,content:d,items:h})=>c==="text"?l.jsx(V6,{children:d},a):c==="list"?l.jsx(F6,{children:h==null?void 0:h.map(({key:g,text:v})=>l.jsx(U6,{as:"li",children:v},g))},a):null),l.jsx(yn,{style:{color:"#fff",display:"block"},onClick:()=>{window.location.href=`${o}`},children:"了解更多"})]})},G6=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:j6,children:"RDMA"}),l.jsx(P6,{children:l.jsx(M6,{children:B6.map(e=>l.jsx(W6,{item:e},e.key))})})]})),K6="/zh-cn/assets/cover-4e87a707.png",X6="/zh-cn/assets/image-4f8ee5fd.png",Q6="data:image/png;base64,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",q6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAATiSURBVHgB7ZrfTyNVFMe/Z2a6cdVod6NPPjD7akzsQDRRo3affaBxIeFtC4LhbctfAPwF4BuxzdJNfFhDWetfQHky0cXiu8okJvgmNdFgls5cz51CGWBK57altOR+kmbm/pi53C/33nPm3gNoNBrNKRSnUiZbTVpWPRVVViq8V8GQY8WplDCQEWStR5VNzlWdjbyziyEmlgjC8G3AkONmmepwG3kiDaKHQiCJISeWCE18VDYeOxV5OzlThTDxEDcAA5rLR8Lk3I8pISgpyBhprKB+amL2p8Yd+SkKNGzk1euWWy46LrokM/+DnfDMpGyXSNQ28u9f+XrT0jpMfFldhMASVBD+QqkwtgpFGtYHj4iQFYB98b2o+L7/5NnjsSKugNbTQSADRXjEvAtFJmZ3cizAHv87liIFkBDShmmsP5ir7rFgNnrMJSKIO7hi2Lyug4wV7mQsC8PD1jYT2OLnUughsazDxx+9gU8+fDOybP0bF/t/HkIVnm4rbF6zZ3PFNnlUPLqFSvDH1WEL8jMGGeNc15Z5UggeMVs8IpxerEFBO3Eq3X7JxJ07t6LLbptQhc1rljuVO0kLgks+pkuF0cq5qi7/KlPz1dUjz8/xQvzoOD9pJfAdXx30gOsxkSYWQ6maZ+B+qdDwP6J4uua4m/mxnID/VSg79fnMThY9oO8iPPjieSa8APrwF8pr8Ya1d2QssQVp1jUMoyfOWt9FIDKaVkdOg2f5+GaP14Ca8EOjga2GNK/okv5PB6KR5q0vfoEilmWUw2nT9NLokv6LIMS9UELZG3x6bupIzxJdor8doEUI0CIgprP0/OcD/Lb3b2TZ/r66tzhoxBLhr4MXwe+m0no6EDr4jvf/xhDSciRYJuXYX3cRMkFENM6XIC0dHfhiu1lmkOu9bCjvJQwCLUU4tse5cN7EXHWLL+kgwRsdm4XRadwAtHWAFiFAiwAtQoAWAVqEAC0CtAgBageyfebkGPCyOrzPOMLHgOnz+SpxEwMrwsRslXeXsdI2jITkUeHFbrB3u1vKO7G25Ad3OhDG0R0pebgbp6JeEzDga8IJ77z9GsY/e6ttvV9//wffbv4BVYZCBHnU1+oYMMzdu+3rRKGnA7QIAYoiiOb2GXUav0D0eihVwwCgJIKAcJsJok+hyHFwRdP5ESL0vmtESQQSZ84Bk+zQpKEAd/rMdp3nmZU4zx0e+jiovWj7k/U6IVZYbxj2xA5wstkKuN4RZMRI22E9la3a9QT2TtL8bHEz70xf0s7pfmaH1M3/7pXXPnDb1VNfGAnLp7ewrUQQOmNf9shktpryuF44zzNP33PdKItQ+tqR2+qVUFZKBlPJqJHzsQIyzVNmUVjYOhOZJrDcNjCD8D26QB4JxBkFjaY6YGq+ans+d0xEhtztcidrREGA1cVygSelgpNFDORCGsROG34awliUcZL8f4s+FKJgpMm2F7jt2tErLMKqE8v6dCSCRApR9yAj39Nxn5ExRzL2CIoEgV4mtyVaxzbxGsLGS2yXCqNpKNKxsyQPZ/hT9T6rOB2OI4qGT6q4A50I0A+6/nbYyDtFvhQb5tJP8Vy0g6M7EjUScOuWUS6vjbroATKmcXJmx44sQ+f07APqeJhWcIXIOEahHjYZ471DQhzHrP4qduMuhhqNRqPRaDRx+B8VV8ixBtVqHgAAAABJRU5ErkJggg==",Z6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEEAAABACAYAAABFqxrgAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAARySURBVHgB7Zo/b9tGGMafO1KGMtXO0qZdNHQqOshpUKBT6KLIGrWRgWxRXLtIp7qfoP4EjdOlRpwiDLoUiIOqn8DK1CF1mKFAgQKBNblbrAIBIjjkXd6zJJuyRYqk+U8Kf4BMUryzyId879577oCCgoKCgiFYkEK1hjWr63YVKcOY7Dzc/PQZEmasCIsNqyp1bFPJWWSBxPrWvfnvkSB8bIkSfs9MAAXD6ldLOw0kiK8I129ZFQlUkDFM45eRIHqo0hIL9Gq2kAL1FWubNgZSYHw4BIQaz4r6YAKJRYRr31g39BJ2tRJ+wARyZhGUAEzCpN0O/bM7mEDOJIJbAOprFx5uzifepydBZBGmRQBFJBGmSQBFaBFUCj1NAihCi9A059XN35wWARThkqU+dPMmpojYkqVJphABhQiHRGoTglJffmJA8CpJHXooTg2vGsEO9qv15Z21QBUFOrbgTWrA2whIYiLQKNCiTRUaIiGHD6tgPJizRb+na7hNuUzj0d35B0GqJBIOi0tWA+rCM4RymfWgZUO9CUKISu3Wn5Vx5aQjawPnrlzWcK6cTtPzqivQ7TqDw1l1rc2Nz9rj6oUSgWv8PnfKYarggwtlfLvyIdLg+e5L/Lz5HGHxfUTOQbLOjnpqf//zP7LGVwSp4QYSYn//AD/+9C/MX9vY7xwgSzzD4TpZZbbL45MQd5jkTQSByVX6c9XrtBJAvbYv6OavfP4u5mZnkCWeIti6qLlfFEfj682NYH1vfflpw2tG46QAV754D1njKQJj/LujvlrKx82Ni+3B4eKKtRvFis+jAIqRItBNVt03KZg03eelFA8kWAUecM4uSzksUl4FUIwUQUqKaXb8PovXw23B1r1P1uADhYNJ9Svu7548fZFLARQjRWCMnmR/n7amMlJwRi5dPI/3L5zDxx+9g7xxSoRrX/9Vc4cCpZ+B8u9xnJ+bOfzkkVMi0FswnPMzbNNgCNPMiGSJt/CWcUqEwwnXmEJgUhjZMJIQjfqyZTIRbVq+n24bmBA8k6WzTMFTF2m4u9i8U3iMSNhjVCijQ43z02Bvr4soJC7C3n+vIhkdaZJIOKiMEzlAt2dqQcrFLsLJjDNb+NUgpWIPBxqCH6kvGdoOxwJSRLcFeRm8t2yIwQhitsYqgpq2px8+tuQkWm4jJohTHYluuTMY5NE1rOuutVMUEg3arPlVj1WEEkfNPWniXsNUX9pZhcNvIwlKUALMqV0lBo11Wugna5Jx9VDW/KrHKoLbmFWhsHX3eP2CPsObrx1RoROxr45lYMPrJKT4g0LC6J1DhbJfwy/5i02Ek8YsE2JoJdtvvbBYRQrYNjf7IXEouGTKL0XLq3xsvUPPmHUfB3SmE6DXPsjHg2MG7jt1EFuCfzQB2+OZrXW/RIaUDsoGhef9oy98liTH2Sa4zZiq7pR3kSHy1Gy4MOAREnEmSy3kGDKPPReZxSaCruEmjZ7byCNkEj365ZJnGxX7oF91R8gR9GA607LUsKCgoKCgIGXeAELkjKtKm1m6AAAAAElFTkSuQmCC",J6="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD4AAABACAYAAABC6cT1AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAlrSURBVHgB7VrNbxvHFX8zuxQsO21pX5L6Uropeg1lIYeeRDeFLwVaGpaB3ES1lpEeClN/Aal/oKbRQwzLqOSbgSo2U/RUoBDdAinQ1CV1DeCYpwRBApsBHMSwdmfy3uwH92N2ucslfQj4O4irmdmZfR/zmzdvBmCBBRZYYIHvDxi8QtQb/TKceFE2LbMSrbMsc9DdXxnBK8JcBSdBTS4a0uBvcYCaBKikviCBBB9IJo6YFN2DO2/3YE6Yi+BXftdvSA4b2HsNCgAVNcSfnn0MO+gNQ5ghZir4+tVHTQDewl7LMGOgEvZnqYCZCL5+9eMaY+ZekitLkEf4t8dtPgADBscGhOZyyYayEFBhTFTxk6rA2BoW65UnoWNZSgGF+KCw4OvX+jfwY5qaqhH2ftPisN+9ld9Kl3/frzMm66iEjWgdTQG0/oUi1p9a8Hcb/YpVggf4WA2WSwZDKcXO/d3VfZgB3n0Px7FkW6cAkGL74M5qB6bAVIKT0HYJDiOurSx8cHulnfTela3/VsE2qkh83nujrB9OCrAFjikj00lC++DOyg7kRG7BdUKTlbmES3/dXRlE29P8l8zcYBLqGtIbWcdwLs98xanVRmFbocIphM8luNbSDAbWSZxvnfDH05KGRNYat5UPkeQGIYI7AaPoe1mAwjdR2Buhwpxun0vw9av9w9DaLOEuaroRbKPmvgl7bjuH4E5CZxoB03Blq19FpR5CkP0lXMDv6WV5n0NGoJZbIaHJ0q+F2ZzWcRS6T+0kiJvWKThHc37WQhNoWqHVtoNlOOX2VFicAZks7jL4k8AAQ5ujeweWKaUYnGtUxwRsJmk+SHC4dg/v/6UY+0fnPArURaVcmvReJsHXt/rkUrXASytBIgsKHVWIqk8hOCS300WDkej3ZXF5EyZAxd2BTsmFD3ZXB6H6BKGD811pmDkEB4L3GENGN2HY3S0+DUwDNi0bp9h4vpMH9NLemWhx1CZ1qIKUqHAeywvsJSq0E3kpocvE6PhyOyvxTIP1a4/Q5fl4mZtg9VSLk4tCIDLDuXu3e3ssnGViRAWsgpHaZvfWql9++Vqf3HofiNXVB5zvwZxhveQdswTXIaPVJ7C60Qh1biphFJRSMIykXVMwPFUbFhSavMMyYGWeVg5C8QQTN/0CnF5pDJ8qOHN2SQokYIi0mKncyjbAj5jI9WmXho8jHcnNGybn+6H/TdFIbJtUoZg4EKGhFe96z4q0nIxKSBme6wsIu360Xxx2Ded/FUmxTCRn2+LDossa4R5+C3JSD3wy5r/FP9poLmWO89CuK+iylinq5CwxZTDYIBe/fzsuhEpDLUHL28JK+sOcX27w+uWtfgvdTxvv5wITSKS85jyHd45BJAvOWM1/lsjKoTqlyZFOGbQl1XWHxHOIUlbfPHcKLr7zBrz509dU+dNnL+F/j57Cvz/6qvLtC7uPYfGFIrwgbTlg4wlcrr/3n0r31i+G0XYpc5z9xO+MyagVaijhUbi5owzdPlwFOLg6XPzl6/CHrZ/5QhPOnF6Ci796A7b/+HNYPmGQlR5kDTt1KJWM0LcaxyWt1dPIreI9oEsPvWfaHNBvgjIeRjtRQmCAc9oVMAmkgN/8+iw9lpGUmjAl7jmc4wdFSNAVXbs0wX2tY0ztdySlpcp1ygCIKQMMw67R78V3XodJeHv1jLK6ZHwDikDKrwP/ab1HK3jU1TD3FQsrdcoAgFg71LhSypnyEmTB2bPLxHkVXR0q+IGTyR2Dcn7RsizItC2VkvmKwFOQIWVNxRLveWV0CkJljI3LolheNqAocAVAAmX1UKGQl2JlGaBldYqCcD3UvnDPyWxWo+2jZR6Y4EOJMj/+9Dmc/fEyTMKzpy/pJ21JC3sVYz9Cy0Be8CwDcD79AcGxgC719fH/n01sS8va09FL2gHGSNLdN0CQR9wpWQadMsbQ7v6SBQ8QBAYlFZgSXgz92effwt/+/lliu2e4nv/jn184O0CDd+ItvIBqPJ1M04qRakAZTo2UQ914aRbveQ9M8regAA5ur7bxZ/Cvj76E93cfw+Mnz/26Fy9sJfCf/vyJsjZiWxfjI3/QzmsUDm7SlOHWcGMIGqSErKRFN4mPoR9pskimBDMtF4ySaKPQ19/ffR4fjVJWEjY/2I1HbW4ypEJ7g1CFs+yFlIFLYT2QZBglhcBpsXrwBQwqFHn1YEq4SmviwUDn2BZNBs4yh7w05IL1rB9CV5eUVK5rgHYniBulalQZDLi/o4xFlwEkCk5aRGanD1HzBc+sacnoQUG4kVXmdZc2Nur0ROJBYXwnqNs1+q4umNxP6jd1HUd29TtFTW4UiaGngZvEbFLmFA3R9spJQHWWhiFyeKMk28H3hZEcV6SmnpDUuijxdfdfL4Zuw5xBCi6VYE86WdnB8UnYDNZTno9+LZM1vDKV/2Ow5q/oUn7YvXV+mDRGqsVdbfb8AmTWeVqd+sZtaQv55ImK0tCNo8dT5AUqQRJ1/SXYCB9isk7aWBPTyzRA4ASFSI6IZhsKwrHqcUWFw4JX6Z5MIO9OSUo8C1sJfXwwf4/s3/bK1dyWY09063tp40+M1eNWhyZapQYFQUubhBIeN5mHYPAbOI8bOLeOsP8ddfSUIjTl84J1KncfAJ3kTBp/ssVBZYi20Y384N09oyp0I6GE0ZllCXLhkZR8aP8Aet3Oee1y5qWsUo6uav634fL2QYYMTubTUs3R7MByrmNMHdRMHDN0t0Y+tAzWCB1ajPP3CklHWDrkOyaOnFEp7e6uTHSrPFAWVmGn2fKPmpFnYq6v8vrmYejlHMfEuQRXhLQE/ch1DLL8pWncnhKB9Et5MSbxRCZMcM4VLyPM3oSopcFpvBNc6ych/1UQzV2UaW4hYdakjctjK16DeTuGIWzCZQLtLaucQhOmu/wzg4s46kaDFF7mJEBwes5wXZs4phoZM7fQhOmve9E1LFtz3QutL22xM4uTETWOOmpOuu4VX+uzYhYX/NqxW0jgKIDZ4qYleDfv/NcQXLjvlFtWWVFYcAIFNHh6sRdz/TEGlE6SNgw4F0PLtIbRBh7BMYOvSVqXE+7D0sUE+xQvfK9mppd4cd5i9OVuI2eO+DpeBPO5tr1FGRPZwO7XoBgK3YdNw1wE96DY38bjZCnrlLDEtMGk3B26rzyiezK0JZ7npYK5Ch5FvYkB0DeYO5MQOamBEd10fNUXCRZYYIEFFvi+4Dvi/dtd2V8yIgAAAABJRU5ErkJggg==",eN="data:image/png;base64,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",{Heading:tN}=Pe,{CNHead4:rN}=tN,gw=f.div` background: #fff; `,vw=f.div` max-width: 1440px; @@ -1150,29 +1150,41 @@ Error generating stack: `+o.message+` padding-inline: 1.77rem; `,Cc=f.img` width: 100%; -`,gN=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:cN,children:"DatenLord Appliance"}),l.jsx(mN,{children:l.jsxs(pN,{children:[l.jsx(Cc,{src:uN}),l.jsx(Cc,{src:dN,style:{marginBottom:"0.82rem"}}),l.jsx(Cc,{src:fN,style:{marginBottom:"0.64rem"}}),l.jsx(Cc,{src:hN})]})})]})),vN="/zh-cn/assets/cover-e1b3c9e5.png",yN="/zh-cn/assets/image-4b1d6d29.png",wN="/zh-cn/assets/image1-5e136811.jpeg",{Heading:xN,Paragraph:sQ}=Pe,{CNHead4:jg,Heading2:_N}=xN,SN=f.main` +`,gN=f.div` + display: flex; + align-items: end; + gap: 0.24rem; +`,vN=f.div` + font-size: 0.58rem; + font-weight: 600; + color: #7680dd; +`,yN=f.div` + font-size: 0.32rem; + font-weight: 600; + line-height: 2; +`,wN=()=>(I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:cN,children:"DatenLord Appliance"}),l.jsx(mN,{children:l.jsxs(pN,{children:[l.jsxs(gN,{children:[l.jsx(vN,{children:"AI 推理一体机"}),l.jsx(yN,{children:"参考配置"})]}),l.jsx(Cc,{src:uN}),l.jsx(Cc,{src:dN,style:{marginBottom:"0.82rem"}}),l.jsx(Cc,{src:fN,style:{marginBottom:"0.64rem"}}),l.jsx(Cc,{src:hN})]})})]})),xN="/zh-cn/assets/cover-e1b3c9e5.png",_N="/zh-cn/assets/image-4b1d6d29.png",SN="/zh-cn/assets/image1-5e136811.jpeg",{Heading:bN,Paragraph:cQ}=Pe,{CNHead4:jg,Heading2:kN}=bN,CN=f.main` background: #EDEDF6; -`,bN=f.div` +`,DN=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.57rem; padding-inline: 1.22rem; -`,kN=f(jg)` +`,jN=f(jg)` text-align: center; padding-bottom: 0.58rem; -`,CN=f.section` +`,EN=f.section` display: flex; flex-direction: column; align-items: center; padding-block: 0.48rem; color: ${e=>e.theme.secondary02}; background: linear-gradient(90deg, #767ee5, #9966cc); -`,DN=f(_N)` +`,AN=f(kN)` padding-bottom: 0.06rem; -`,jN=f(jg)` +`,TN=f(jg)` padding-bottom: 0.4rem; -`,EN=f.img` +`,RN=f.img` display: block; width: 5.36rem; margin-inline: auto; @@ -1242,34 +1254,34 @@ Error generating stack: `+o.message+` padding-left: 0.16rem; `,Bu=f(Zt)` -`,AN=f.img` +`,ON=f.img` display: block; width: 70%; margin-inline: auto; margin-top: 0.36rem; -`,TN=()=>l.jsxs(Eg,{style:{background:"#EDEDF6"},id:"ai",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"AI 推理"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"用云计算的方式整合GPU算力,解决AI算力资源昂贵和分散的问题。用存储和网络来改善用户使用的体验,实现秒级启动、恢复"}),l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"GPU 算力供不应求,供需极度不平衡"}),l.jsx(Zt,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。GPU 算力供不应求,供需极度不平衡。这进一步推高了原本因设计和制造成本以及市场垄断等因素就已经高企不下的 GPU 算力价格。GPU 算力资源优先满足 AI 训练场景,这造成 AI 推断场景的 GPU 算力资源具有分散或碎片化的特点。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能"}),l.jsx(Ns,{children:"高性能网络 RDMA 实现多节点内存共享,加速大模型的分发、加载"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主营海外直播卖货的公司,运用大模型技术进行人工智能主播,实现业务的低成本横向拓展。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 该客户计划对直播场景进行大模型定制,形成自主可控的“直播场景大模型”。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 通过跨云技术,帮助客户落地“大模型”业务场景"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据同步机制"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据分发机制"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"灵活的管理和调整工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高级的安全措施"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]}),l.jsx(AN,{src:wN})]})]})]})]}),RN=()=>l.jsxs(Eg,{id:"networks",style:{background:"#EDEDF6"},children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能网络"}),l.jsx(Og,{})]}),l.jsx(Pg,{children:l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"大模型时代对高性能网络的能力诉求不断提高"}),l.jsx(Zt,{children:"随着大模型时代的到来,无论是模型训练环节中训练数据与 Checkpoint 的传输迁移,还是推理过程中多个模型之间的动态调度加载,都希望能够极限压榨网络以及总线上每一比特的带宽,从而换取更短的训练时间以及更小的请求响应延迟。随着训练推理集群规模的扩大以及业务复杂度的增加,网络中偶发的拥塞或故障不可避免,此外,每次网络拓扑发生变化后对网卡进行重新调参都是一项繁重的工作。能够迅速自主适应网络拓扑变化,并连续提供稳定数据传输能力的高性能网络,已然成为大模型时代必不可少的基础设施。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"基于经过优化的 RoCE v2 协议以及硬件加速的纠错编码技术,可以在恶劣的网络环境下提供高效的数据恢复以及重传机制。"}),l.jsx(Ns,{children:"通过深度的软硬件融合套件,实现全网流量的动态感知,智能决策系统可以针对各种网络环境迅速、自动地调整各节点软硬件参数,保持全网维持最佳吞吐。"})]})]})})]}),ON=()=>l.jsxs(Eg,{id:"storage",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能存储"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"统一的高性能跨云数据访问和跨云分布式元数据管理"}),l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"云之间的隔阂导致数据隔离和数据碎片化,在跨云访问数据时,访问速度和一致性将会受到影响。"}),l.jsx(Zt,{children:"随着AI应用的快速落地,多云架构成为企业级IT的主流选择。但是,云之间的隔阂导致数据隔离和数据碎片化。由于数据往往被绑定在一个特定的云厂商/数据中心里,无法自由访问。此外,跨云数据访问具有高延迟的特性,然而现有的分布式共识协议只限于在单个数据中心使用。因此,在跨云访问数据时,访问速度和一致性将会受到影响。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"无论数据存储在哪里,DatenLord 都可以通过缓存来加速跨云的数据访问,并提供统一的数据管理来实现数据的自动迁移和备份。"}),l.jsx(Ns,{children:"DatenLord 采用内核旁路架构,实现存储 IO 自行调度管理,以提升性能。再次,低延迟的跨云分布式共识协议保证了广域网场景下的高速和强一致性,同时保证系统中没有单点瓶颈。"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主要做中东、欧洲地区教育、社交和短剧的内容型娱乐公司。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 客户需要解决多国多数据中心间的数据同步、迁移、备份和自动化管理的问题。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 提供一体化的解决方案,帮助客户有效管理多国多数据中心的复杂性,提高业务的可用性和稳定性"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"多国多数据中心的数据实时同步"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高效的数据迁移和备份工具"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供自动化的管理工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),_w=()=>{const e=ht(),{sectionId:t}=Sn();return I.useEffect(()=>{const r=document.querySelector(`#${t}`);r?(r==null||r.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[t]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:vN,children:"解决方案"}),l.jsxs(SN,{children:[l.jsxs(bN,{children:[l.jsx(kN,{children:"解决方案"}),l.jsx(EN,{src:yN}),l.jsx(TN,{}),l.jsx(ON,{}),l.jsx(RN,{})]}),l.jsxs(CN,{id:"related-resource",children:[l.jsx(DN,{children:"· Related Resources ·"}),l.jsx(jN,{children:"相关资源"}),l.jsx(yn,{style:{background:"#FDCB6E",color:"#fff"},onClick:()=>e("/resources2"),children:"查看资源合集"})]})]})]})},PN="/zh-cn/assets/github-icon-35dda863.svg",MN="/zh-cn/assets/illustration-a72d48ba.png",{Heading:LN,Paragraph:IN}=Pe,{Heading3:NN,CNHead5S:mb}=LN,{CNBodyLarge:Ig,CNBodySmall:zN}=IN,YN=[{key:1,title:"社区—贡献意味着思考和学习",text:"开源不仅仅是在Github上贡献代码。在DatenLord,我们相信:贡献代码(给予)同样是一个思考和学习的过程。在不断收到开源社区反馈的过程中,我们能够构建彼此的信任与合作。我们也想借助于开源的社区平台吸引更多优秀的开发者参与到项目中来。"}],HN=[{key:1,text:"王恒宇是一名主修计算机科学的研究生。基于在软硬件融合方面的学术兴趣,他加入了async-rdma项目。在社区导师的指导下,他也随着项目的发展而逐步成长,并被邀请在一些实践研讨会上分享他使用Rust开发RDMA的实践经验。",quote:"“我在Async-rdma项目中收获了一段难忘的经历。DatenLord社区氛围很友好,我的导师是一位经验丰富的工程师,他鼓励我在验证我对项目的想法和假设的同时也要关注工程规范。这让我的视角从一个只关注实现产品原型的学生转变为一个同时也关注产品的可维护性和稳定性的专业工程师。”",link_text:"GitHub ID: GTwhy",url:"https://github.com/GTwhy"},{key:2,text:"李弘宇热衷于参与开源社区和Rust相关项目,所以参加了DatenLord的特别项目,想为Rust并入Linux内核添砖加瓦。在社区导师的指导下,他在贡献代码、编写文档和回复上游意见的过程中磨练了自己的Rust技能。",quote:"“在DatenLord中参与Rust for Linux项目的工作很有意义。这是一个友好互助的社区。即使在修改一个很小的bug时,我的导师也鼓励我认真权衡不同的选择。教导我不仅仅是要能够写出代码,更重要的是写出优雅的代码。我在社区中收获到的不仅是理论上的,更是极具实操价值的。”",link_text:"GitHub ID: Richardhongyu",url:"https://github.com/Richardhongyu"}],FN=f.section` +`,PN=()=>l.jsxs(Eg,{style:{background:"#EDEDF6"},id:"ai",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"AI 推理"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"用云计算的方式整合GPU算力,解决AI算力资源昂贵和分散的问题。用存储和网络来改善用户使用的体验,实现秒级启动、恢复"}),l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"GPU 算力供不应求,供需极度不平衡"}),l.jsx(Zt,{children:"AI 大模型对高性能 GPU 算力资源需求大爆发。GPU 算力供不应求,供需极度不平衡。这进一步推高了原本因设计和制造成本以及市场垄断等因素就已经高企不下的 GPU 算力价格。GPU 算力资源优先满足 AI 训练场景,这造成 AI 推断场景的 GPU 算力资源具有分散或碎片化的特点。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"优化缓存技术,实现数据预加载、异步持久化,进而提升数据访问的性能"}),l.jsx(Ns,{children:"高性能网络 RDMA 实现多节点内存共享,加速大模型的分发、加载"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主营海外直播卖货的公司,运用大模型技术进行人工智能主播,实现业务的低成本横向拓展。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 该客户计划对直播场景进行大模型定制,形成自主可控的“直播场景大模型”。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 通过跨云技术,帮助客户落地“大模型”业务场景"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据同步机制"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高效的数据分发机制"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"灵活的管理和调整工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"高级的安全措施"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]}),l.jsx(ON,{src:SN})]})]})]})]}),MN=()=>l.jsxs(Eg,{id:"networks",style:{background:"#EDEDF6"},children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能网络"}),l.jsx(Og,{})]}),l.jsx(Pg,{children:l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"大模型时代对高性能网络的能力诉求不断提高"}),l.jsx(Zt,{children:"随着大模型时代的到来,无论是模型训练环节中训练数据与 Checkpoint 的传输迁移,还是推理过程中多个模型之间的动态调度加载,都希望能够极限压榨网络以及总线上每一比特的带宽,从而换取更短的训练时间以及更小的请求响应延迟。随着训练推理集群规模的扩大以及业务复杂度的增加,网络中偶发的拥塞或故障不可避免,此外,每次网络拓扑发生变化后对网卡进行重新调参都是一项繁重的工作。能够迅速自主适应网络拓扑变化,并连续提供稳定数据传输能力的高性能网络,已然成为大模型时代必不可少的基础设施。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"基于经过优化的 RoCE v2 协议以及硬件加速的纠错编码技术,可以在恶劣的网络环境下提供高效的数据恢复以及重传机制。"}),l.jsx(Ns,{children:"通过深度的软硬件融合套件,实现全网流量的动态感知,智能决策系统可以针对各种网络环境迅速、自动地调整各节点软硬件参数,保持全网维持最佳吞吐。"})]})]})})]}),LN=()=>l.jsxs(Eg,{id:"storage",children:[l.jsxs(Ag,{children:[l.jsx(Rg,{}),l.jsx(Tg,{children:"高性能存储"}),l.jsx(Og,{})]}),l.jsxs(Pg,{children:[l.jsx(hb,{children:"统一的高性能跨云数据访问和跨云分布式元数据管理"}),l.jsxs(Mg,{children:[l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"问题"}),l.jsx(Lg,{children:"云之间的隔阂导致数据隔离和数据碎片化,在跨云访问数据时,访问速度和一致性将会受到影响。"}),l.jsx(Zt,{children:"随着AI应用的快速落地,多云架构成为企业级IT的主流选择。但是,云之间的隔阂导致数据隔离和数据碎片化。由于数据往往被绑定在一个特定的云厂商/数据中心里,无法自由访问。此外,跨云数据访问具有高延迟的特性,然而现有的分布式共识协议只限于在单个数据中心使用。因此,在跨云访问数据时,访问速度和一致性将会受到影响。"})]}),l.jsxs(Ni,{style:{width:"46%"},children:[l.jsx(zi,{children:"解决方案"}),l.jsx(Ns,{style:{marginBottom:"0.36rem"},children:"无论数据存储在哪里,DatenLord 都可以通过缓存来加速跨云的数据访问,并提供统一的数据管理来实现数据的自动迁移和备份。"}),l.jsx(Ns,{children:"DatenLord 采用内核旁路架构,实现存储 IO 自行调度管理,以提升性能。再次,低延迟的跨云分布式共识协议保证了广域网场景下的高速和强一致性,同时保证系统中没有单点瓶颈。"})]}),l.jsxs(Ni,{style:{width:"100%"},children:[l.jsx(zi,{children:"案例"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Bu,{children:"· 客户是一家主要做中东、欧洲地区教育、社交和短剧的内容型娱乐公司。"}),l.jsx(Bu,{style:{paddingBottom:"0.3rem"},children:"· 客户需要解决多国多数据中心间的数据同步、迁移、备份和自动化管理的问题。"}),l.jsx(vl,{children:"客户的需求和问题是什么?"}),l.jsx(Zt,{style:{color:"#7680DD"},children:"DatenLord Cloud Service 提供一体化的解决方案,帮助客户有效管理多国多数据中心的复杂性,提高业务的可用性和稳定性"}),l.jsxs(Zt,{children:[l.jsx("b",{children:"多国多数据中心的数据实时同步"}),"      确保大模型在不同数据中心之间的实时性和一致性。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高效的数据迁移和备份工具"}),"      确保大模型能够及时获取和处理最新的数据,提高业务的响应速度。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供自动化的管理工具"}),"      使客户能自主控制大模型,根据业务变化灵活调整。"]}),l.jsxs(Zt,{children:[l.jsx("b",{children:"提供高可用性和弹性伸缩的解决方案"}),"      包括数据加密、身份验证等,确保大模型在跨云环境中的安全运行。"]})]})]})]})]}),_w=()=>{const e=ht(),{sectionId:t}=Sn();return I.useEffect(()=>{const r=document.querySelector(`#${t}`);r?(r==null||r.scrollIntoView(),window.scrollBy(0,-32)):window.scrollTo(0,0)},[t]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:xN,children:"解决方案"}),l.jsxs(CN,{children:[l.jsxs(DN,{children:[l.jsx(jN,{children:"解决方案"}),l.jsx(RN,{src:_N}),l.jsx(PN,{}),l.jsx(LN,{}),l.jsx(MN,{})]}),l.jsxs(EN,{id:"related-resource",children:[l.jsx(AN,{children:"· Related Resources ·"}),l.jsx(TN,{children:"相关资源"}),l.jsx(yn,{style:{background:"#FDCB6E",color:"#fff"},onClick:()=>e("/resources2"),children:"查看资源合集"})]})]})]})},IN="/zh-cn/assets/github-icon-35dda863.svg",NN="/zh-cn/assets/illustration-a72d48ba.png",{Heading:zN,Paragraph:YN}=Pe,{Heading3:HN,CNHead5S:mb}=zN,{CNBodyLarge:Ig,CNBodySmall:VN}=YN,FN=[{key:1,title:"社区—贡献意味着思考和学习",text:"开源不仅仅是在Github上贡献代码。在DatenLord,我们相信:贡献代码(给予)同样是一个思考和学习的过程。在不断收到开源社区反馈的过程中,我们能够构建彼此的信任与合作。我们也想借助于开源的社区平台吸引更多优秀的开发者参与到项目中来。"}],UN=[{key:1,text:"王恒宇是一名主修计算机科学的研究生。基于在软硬件融合方面的学术兴趣,他加入了async-rdma项目。在社区导师的指导下,他也随着项目的发展而逐步成长,并被邀请在一些实践研讨会上分享他使用Rust开发RDMA的实践经验。",quote:"“我在Async-rdma项目中收获了一段难忘的经历。DatenLord社区氛围很友好,我的导师是一位经验丰富的工程师,他鼓励我在验证我对项目的想法和假设的同时也要关注工程规范。这让我的视角从一个只关注实现产品原型的学生转变为一个同时也关注产品的可维护性和稳定性的专业工程师。”",link_text:"GitHub ID: GTwhy",url:"https://github.com/GTwhy"},{key:2,text:"李弘宇热衷于参与开源社区和Rust相关项目,所以参加了DatenLord的特别项目,想为Rust并入Linux内核添砖加瓦。在社区导师的指导下,他在贡献代码、编写文档和回复上游意见的过程中磨练了自己的Rust技能。",quote:"“在DatenLord中参与Rust for Linux项目的工作很有意义。这是一个友好互助的社区。即使在修改一个很小的bug时,我的导师也鼓励我认真权衡不同的选择。教导我不仅仅是要能够写出代码,更重要的是写出优雅的代码。我在社区中收获到的不仅是理论上的,更是极具实操价值的。”",link_text:"GitHub ID: Richardhongyu",url:"https://github.com/Richardhongyu"}],$N=f.section` padding-bottom: 1.29rem; -`,VN=f.div` +`,BN=f.div` color: ${e=>e.theme.secondary02}; font-weight: 400; font-family: Bodoni Bd BT serif; font-size: 0.67rem; line-height: 0.804rem; text-transform: capitalize; -`,UN=f(NN)` +`,WN=f(HN)` margin-top: -0.22rem; padding-left: 0.16rem; padding-bottom: 0.71rem; font-family: Avenir Next sans-serif; -`,$N=f.div` +`,GN=f.div` height: 4.6rem; margin-bottom: 0.61rem; -`,BN=f.div` +`,KN=f.div` padding-bottom: 0.56rem; &:last-child { padding-bottom: 0; } -`,WN=f(mb)``,GN=f(Ig)``,KN=f.img` +`,XN=f(mb)``,QN=f(Ig)``,qN=f.img` float: right; margin-left: 0.33rem; margin-right: -0.33rem; @@ -1290,37 +1302,37 @@ Error generating stack: `+o.message+` font-size: 0.255rem; line-height: 1; text-transform: capitalize; -`;const XN=f.div` +`;const ZN=f.div` padding-top: 0.38rem; padding-bottom: 0.46rem; padding-inline: 0.63rem; background: #ffffff78; border-radius: 0.18rem; -`,QN=f(mb)``,qN=f.div` +`,JN=f(mb)``,e5=f.div` display: flex; justify-content: space-between; -`,ZN=f.div` +`,t5=f.div` width: 47%; -`,JN=f(Ig)` +`,r5=f(Ig)` padding-bottom: 0.26rem; -`,e5=f(zN)` +`,n5=f(VN)` margin-left: -0.14rem; margin-bottom: 0.33rem; padding-inline: 0.11rem; color: ${e=>e.theme.gray03}; border-left: 0.02rem solid; border-image: linear-gradient(to right, #767ee5, #9966cc) 1; -`,t5=f.div` +`,i5=f.div` display: flex; -`,r5=f(Ig)` +`,o5=f(Ig)` padding-right: 0.2rem; color: ${e=>e.theme.secondary01}; text-decoration-line: underline; -`,n5=f.img` +`,s5=f.img` width: 0.32rem; height: 0.32rem; -`,i5=()=>l.jsxs(FN,{children:[l.jsx(VN,{children:"Open Source Community"}),l.jsx(UN,{children:"开源社区"}),l.jsxs($N,{children:[l.jsx(KN,{src:MN}),YN.map(({key:e,title:t,text:r})=>l.jsxs(BN,{children:[l.jsx(WN,{style:{paddingBottom:"0.23rem"},children:t}),l.jsx(GN,{children:r})]},e))]}),l.jsxs(XN,{children:[l.jsx(QN,{style:{paddingBottom:"0.39rem"},children:"社区高光时刻"}),l.jsx(qN,{children:HN.map(({key:e,text:t,quote:r,link_text:n,url:i})=>l.jsxs(ZN,{children:[l.jsx(JN,{children:t}),l.jsx(e5,{children:r}),l.jsxs(t5,{children:[l.jsx(r5,{as:"a",href:i,children:n}),l.jsx(n5,{src:PN})]})]},e))})]})]}),o5="/zh-cn/assets/avatar-783be77c.png",{Heading:s5,Paragraph:a5}=Pe,{Heading3:pb,CNHead4:l5,CNHead5S:c5,CNHead5:u5}=s5,{CNBodyLarge:d5,CNMarkSmall:f5,CNBodyMedium:h5}=a5,m5=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Diploma Internship",label_zh:"开源毕业设计",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],p5=[{key:1,text:"参加开源毕设项目是我人生中一段难忘的经历。在这里,我不仅提升了自己的技能,学会与团队成员协同合作,而且有机会投身于实际项目中,亲身体验如何解决实际问题,感受开源精神的力量,并且深入开源社区,与志同道合的同伴们共同探讨世界上最前沿、最具挑战性的工程问题。"},{key:2,text:"参加开源项目的过程中,我有机会在GitHub上积累宝贵的贡献记录。每一次提交代码、每一个解决的问题都会在我的GitHub主页上清晰地呈现出来,成为我技术实力的有力证明。这不仅有助于建立我的个人品牌,还能让潜在雇主一目了然地了解我的能力和成就。"},{key:3,text:"我还结识了我所热爱的行业的专家,拓展人脉资源,为未来的职业发展创造更多机会。我相信,在我的简历上出现丰富的开源项目经验,必将成为我未来求职过程中的一大亮点。欢迎更多的学生朋友和我一起加入开源毕设项目,让我们共同成长,开启一段精彩的技术之旅!"}],g5=f.section` -`,v5=f.div` +`,a5=()=>l.jsxs($N,{children:[l.jsx(BN,{children:"Open Source Community"}),l.jsx(WN,{children:"开源社区"}),l.jsxs(GN,{children:[l.jsx(qN,{src:NN}),FN.map(({key:e,title:t,text:r})=>l.jsxs(KN,{children:[l.jsx(XN,{style:{paddingBottom:"0.23rem"},children:t}),l.jsx(QN,{children:r})]},e))]}),l.jsxs(ZN,{children:[l.jsx(JN,{style:{paddingBottom:"0.39rem"},children:"社区高光时刻"}),l.jsx(e5,{children:UN.map(({key:e,text:t,quote:r,link_text:n,url:i})=>l.jsxs(t5,{children:[l.jsx(r5,{children:t}),l.jsx(n5,{children:r}),l.jsxs(i5,{children:[l.jsx(o5,{as:"a",href:i,children:n}),l.jsx(s5,{src:IN})]})]},e))})]})]}),l5="/zh-cn/assets/avatar-783be77c.png",{Heading:c5,Paragraph:u5}=Pe,{Heading3:pb,CNHead4:d5,CNHead5S:f5,CNHead5:h5}=c5,{CNBodyLarge:m5,CNMarkSmall:p5,CNBodyMedium:g5}=u5,v5=[{key:"hardware-design-learning-community",icon:ob,iconBg:"#7680DD",label_en:"Hardware Design Learning Community",label_zh:"硬件设计学习社区",url:"mit",content:[{key:"first",label:"理解数字芯片设计的精髓,提升设计能力,是能否胜任数字芯片设计工作的关键。"},{key:"second",label:"系统学习计算机体系结构相关知识,为将来走上数字芯片设计岗位打下坚实的基础。"},{key:"third",label:"学习社区的课程考核以Lab实践的完成度作为标准,要求所有Lab和Project实现既定功能并通过仿真验证。"},{key:"forth",label:"通过动手项目来验证学习的成果,培养出兼具理论和实操能力的数字芯片设计人才。"}]},{key:"open-source-diploma-internship",icon:ib,iconBg:"#FDCB6E",label_en:"Open Source Diploma Internship",label_zh:"开源毕业设计",content:[{key:"first",label:"体验透明开源和知识共享带来的乐趣,并在社区的反馈中获得技术成长。"},{key:"second",label:"弥合学校和工业界实践的脱节和差距,系统梳理学校的知识结构,并运用到具有影响力的时间项目中。"},{key:"third",label:"手把手获得行业内专家、教授、学者的点评以及前沿科研项目的合作机会。"},{key:"forth",label:"在硬核的开源技术社区自我展示的机会是同学升学以及就业最佳、最强有力的背书。"}]}],y5=[{key:1,text:"参加开源毕设项目是我人生中一段难忘的经历。在这里,我不仅提升了自己的技能,学会与团队成员协同合作,而且有机会投身于实际项目中,亲身体验如何解决实际问题,感受开源精神的力量,并且深入开源社区,与志同道合的同伴们共同探讨世界上最前沿、最具挑战性的工程问题。"},{key:2,text:"参加开源项目的过程中,我有机会在GitHub上积累宝贵的贡献记录。每一次提交代码、每一个解决的问题都会在我的GitHub主页上清晰地呈现出来,成为我技术实力的有力证明。这不仅有助于建立我的个人品牌,还能让潜在雇主一目了然地了解我的能力和成就。"},{key:3,text:"我还结识了我所热爱的行业的专家,拓展人脉资源,为未来的职业发展创造更多机会。我相信,在我的简历上出现丰富的开源项目经验,必将成为我未来求职过程中的一大亮点。欢迎更多的学生朋友和我一起加入开源毕设项目,让我们共同成长,开启一段精彩的技术之旅!"}],w5=f.section` +`,x5=f.div` color: ${e=>e.theme.secondary02}; font-weight: 400; font-family: Bodoni Bd BT serif; @@ -1328,17 +1340,17 @@ Error generating stack: `+o.message+` line-height: 0.804rem; text-align: right; text-transform: capitalize; -`,y5=f(pb)` +`,_5=f(pb)` margin-top: -0.22rem; padding-left: 0.16rem; padding-bottom: 1.4rem; font-family: Avenir Next sans-serif; text-align: right; -`,w5=f.div` +`,S5=f.div` padding-bottom: 1rem; display: flex; justify-content: space-between; -`,x5=f.div` +`,b5=f.div` display: flex; flex-direction: column; align-items: center; @@ -1354,16 +1366,16 @@ Error generating stack: `+o.message+` background: #fff; border: 0.01rem solid ${e=>e.theme.secondary01}; } -`,_5=f(f5)` +`,k5=f(p5)` color: ${e=>e.theme.secondary01}; -`,S5=f(l5)` +`,C5=f(d5)` width: 90%; color: #000; text-align: center; margin-bottom: 0.65rem; padding-bottom: 0.12rem; border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; -`,b5=f.div` +`,D5=f.div` position: relative; top: -0.6rem; display: flex; @@ -1372,7 +1384,7 @@ Error generating stack: `+o.message+` margin-bottom: -0.36rem; width: 1.56rem; height: 1.56rem; -`,k5=f.div` +`,j5=f.div` position: absolute; top: 0; left: 0; @@ -1383,13 +1395,13 @@ Error generating stack: `+o.message+` position: absolute; border-radius: 50%; animation: opac 4s infinite; -`,C5=f(rf)` +`,E5=f(rf)` animation-delay: 1s; -`,D5=f(rf)` +`,A5=f(rf)` animation-delay: 2s; -`,j5=f(rf)` +`,T5=f(rf)` animation-delay: 3s; -`,E5=f.div` +`,R5=f.div` z-index: 1; display: flex; justify-content: center; @@ -1398,32 +1410,32 @@ Error generating stack: `+o.message+` height: 0.9rem; background: ${e=>e.bg}; border-radius: 50%; -`,A5=f.img` +`,O5=f.img` width: 90%; height: 90%; -`,T5=f.ul` +`,P5=f.ul` padding-left: 0.18rem; -`,R5=f(d5)``,O5=f(c5)``,P5=f.div` +`,M5=f(m5)``,L5=f(f5)``,I5=f.div` display: flex; align-items: center; -`,M5=f.div` +`,N5=f.div` display: flex; flex-direction: column; align-items: center; padding-right: 0.91rem; -`,L5=f.div``,I5=f.img` +`,z5=f.div``,Y5=f.img` width: 1.8rem; padding-bottom: 0.22rem; -`,N5=f(pb)` +`,H5=f(pb)` padding-bottom: 0.06rem; -`,z5=f(u5)``,Y5=f.ul` +`,V5=f(h5)``,F5=f.ul` padding-left: 0.3rem; -`,H5=f(h5)` +`,U5=f(g5)` padding-bottom: 0.35rem; &:last-child { padding-bottom: 0; } -`,F5=f.div` +`,$5=f.div` width: 100%; text-align: center; font-size: 0.18rem; @@ -1432,43 +1444,43 @@ Error generating stack: `+o.message+` border-radius: 0.16rem; padding-block: 0.04rem; margin-top: 0.18rem; -`,V5=()=>{const e=ht();return l.jsxs(g5,{children:[l.jsx(v5,{children:"Learning Community"}),l.jsx(y5,{children:"学习社区"}),l.jsx(w5,{children:m5.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,content:a,url:c})=>l.jsxs(x5,{children:[l.jsxs(b5,{children:[l.jsx(E5,{bg:n,children:l.jsx(A5,{src:r})}),l.jsxs(k5,{children:[l.jsx(rf,{bg:n}),l.jsx(C5,{bg:n}),l.jsx(D5,{bg:n}),l.jsx(j5,{bg:n})]})]}),l.jsx(_5,{children:i}),l.jsx(S5,{children:o}),l.jsx(T5,{children:a.map(({key:d,label:h})=>l.jsx(R5,{as:"li",children:h},d))}),c&&l.jsx(F5,{onClick:()=>e(c),children:"了解详情"})]},t))}),l.jsx(O5,{style:{paddingBottom:"1.42rem"},children:"学生故事"}),l.jsxs(P5,{children:[l.jsxs(M5,{children:[l.jsx(I5,{src:o5}),l.jsx(N5,{children:"郑昱笙"}),l.jsx(z5,{children:"浙江大学"})]}),l.jsx(L5,{children:l.jsx(Y5,{children:p5.map(({key:t,text:r})=>l.jsx(H5,{as:"li",children:r},t))})})]})]})},gb="/zh-cn/assets/cover-53180b58.png",U5="/zh-cn/assets/cloud-757dcd86.png",{Heading:$5}=Pe,{CNHead4:B5}=$5,W5=f.div` +`,B5=()=>{const e=ht();return l.jsxs(w5,{children:[l.jsx(x5,{children:"Learning Community"}),l.jsx(_5,{children:"学习社区"}),l.jsx(S5,{children:v5.map(({key:t,icon:r,iconBg:n,label_en:i,label_zh:o,content:a,url:c})=>l.jsxs(b5,{children:[l.jsxs(D5,{children:[l.jsx(R5,{bg:n,children:l.jsx(O5,{src:r})}),l.jsxs(j5,{children:[l.jsx(rf,{bg:n}),l.jsx(E5,{bg:n}),l.jsx(A5,{bg:n}),l.jsx(T5,{bg:n})]})]}),l.jsx(k5,{children:i}),l.jsx(C5,{children:o}),l.jsx(P5,{children:a.map(({key:d,label:h})=>l.jsx(M5,{as:"li",children:h},d))}),c&&l.jsx($5,{onClick:()=>e(c),children:"了解详情"})]},t))}),l.jsx(L5,{style:{paddingBottom:"1.42rem"},children:"学生故事"}),l.jsxs(I5,{children:[l.jsxs(N5,{children:[l.jsx(Y5,{src:l5}),l.jsx(H5,{children:"郑昱笙"}),l.jsx(V5,{children:"浙江大学"})]}),l.jsx(z5,{children:l.jsx(F5,{children:y5.map(({key:t,text:r})=>l.jsx(U5,{as:"li",children:r},t))})})]})]})},gb="/zh-cn/assets/cover-53180b58.png",W5="/zh-cn/assets/cloud-757dcd86.png",{Heading:G5}=Pe,{CNHead4:K5}=G5,X5=f.div` z-index: 1; position: relative; background: #ededf6; overflow: hidden; -`,G5=f.div` +`,Q5=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.4rem; padding-inline: 2.04rem; -`,K5=f(B5)` +`,q5=f(K5)` padding-bottom: 0.98rem; text-align: center; -`,X5=f.img` +`,Z5=f.img` z-index: -1; position: absolute; left: 0; bottom: 0; width: 20.14rem; height: 5.42rem; -`,Sw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"社区"}),l.jsxs(W5,{children:[l.jsxs(G5,{id:"community",children:[l.jsx(K5,{children:"社区"}),l.jsx(i5,{}),l.jsx("div",{style:{marginInline:"-2.04rem"},children:l.jsx(Dg,{})}),l.jsx(V5,{})]}),l.jsx(X5,{src:U5})]})]})},Q5="/zh-cn/assets/tech-talk-cover-10b6e35c.png",q5="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",Z5="/zh-cn/assets/rust-showcase-cover-78294f4f.png",J5="/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png",e7=[{key:1,cover:Q5,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:q5,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:Z5,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:J5,title:"硬件加速",text:"硬件加速领域的实践、经验与挑战",url:"/hardware-acceleration"}],{Heading:t7}=Pe,{CNHead4:r7}=t7,n7=f.section` +`,Sw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"社区"}),l.jsxs(X5,{children:[l.jsxs(Q5,{id:"community",children:[l.jsx(q5,{children:"社区"}),l.jsx(a5,{}),l.jsx("div",{style:{marginInline:"-2.04rem"},children:l.jsx(Dg,{})}),l.jsx(B5,{})]}),l.jsx(Z5,{src:W5})]})]})},J5="/zh-cn/assets/tech-talk-cover-10b6e35c.png",e7="/zh-cn/assets/oss-showcase-cover-2a511b0a.png",t7="/zh-cn/assets/rust-showcase-cover-78294f4f.png",r7="/zh-cn/assets/hardware-acceleration-cover-67e9ecca.png",n7=[{key:1,cover:J5,title:"前沿科技分享",text:"探索前沿技术,拥抱创新与改变",url:"/tech-talk"},{key:2,cover:e7,title:"开源产品分享",text:"软硬件融合创新实践的观察与输出",url:"/oss-showcase"},{key:3,cover:t7,title:"Rust语言应用及案例分享",text:"Rust编程语言的应用、实践与探索",url:"/rust-showcase"},{key:4,cover:r7,title:"硬件加速",text:"硬件加速领域的实践、经验与挑战",url:"/hardware-acceleration"}],{Heading:i7}=Pe,{CNHead4:o7}=i7,s7=f.section` background: ${e=>e.theme.themeDark}; -`,i7=f.div` +`,a7=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.8rem; padding-inline: 1.22rem; -`,o7=f(r7)` +`,l7=f(o7)` padding-bottom: 1.35rem; color: ${e=>e.theme.secondary02}; text-align: center; -`,s7=f.div` +`,c7=f.div` display: flex; justify-content: space-between; -`,a7=f.div` +`,u7=f.div` display: flex; width: 24%; padding: 0.01rem; @@ -1476,39 +1488,39 @@ Error generating stack: `+o.message+` border-radius: 0.12rem; overflow: hidden; cursor: pointer; -`,l7=f.div` +`,d7=f.div` width: 100%; background: #070708; border-radius: 0.12rem; -`,c7=f.img` +`,f7=f.img` display: block; width: 100%; border-radius: 0.12rem; -`,u7=f.div` +`,h7=f.div` padding-block: 0.26rem; padding-inline: 0.2rem; -`,d7=f.div` +`,m7=f.div` padding-bottom: 0.08rem; font-size: 0.226rem; font-weight: 600; color: #fff; -`,f7=f.div` +`,p7=f.div` font-size: 0.145rem; line-height: 0.258rem; color: ${e=>e.theme.secondary02}; -`,h7=()=>{const e=ht();return l.jsx(n7,{id:"tech-share",children:l.jsxs(i7,{children:[l.jsx(o7,{children:"技术分享"}),l.jsx(s7,{children:e7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(a7,{children:l.jsxs(l7,{onClick:()=>{e(o)},children:[l.jsx(c7,{src:r}),l.jsxs(u7,{children:[l.jsx(d7,{children:n}),l.jsx(f7,{children:i})]})]})},t))})]})})},m7="modulepreload",p7=function(e){return"/zh-cn/"+e},bw={},C=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=p7(o),o in bw)return;bw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":m7,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},kw="/zh-cn/assets/right-arrow-98730871.svg",Cw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:g7,Paragraph:v7}=Pe,{CNHead4:y7,CNTitleLarge:w7,CNTitleMedium:x7}=g7,{CNBodySmall:vb,CNMarkSmall:_7}=v7,S7=f.section` +`,g7=()=>{const e=ht();return l.jsx(s7,{id:"tech-share",children:l.jsxs(a7,{children:[l.jsx(l7,{children:"技术分享"}),l.jsx(c7,{children:n7.map(({key:t,cover:r,title:n,text:i,url:o})=>l.jsx(u7,{children:l.jsxs(d7,{onClick:()=>{e(o)},children:[l.jsx(f7,{src:r}),l.jsxs(h7,{children:[l.jsx(m7,{children:n}),l.jsx(p7,{children:i})]})]})},t))})]})})},v7="modulepreload",y7=function(e){return"/zh-cn/"+e},bw={},b=function(t,r,n){if(!r||r.length===0)return t();const i=document.getElementsByTagName("link");return Promise.all(r.map(o=>{if(o=y7(o),o in bw)return;bw[o]=!0;const a=o.endsWith(".css"),c=a?'[rel="stylesheet"]':"";if(!!n)for(let g=i.length-1;g>=0;g--){const v=i[g];if(v.href===o&&(!a||v.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${o}"]${c}`))return;const h=document.createElement("link");if(h.rel=a?"stylesheet":v7,a||(h.as="script",h.crossOrigin=""),h.href=o,document.head.appendChild(h),a)return new Promise((g,v)=>{h.addEventListener("load",g),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())},kw="/zh-cn/assets/right-arrow-98730871.svg",Cw="/zh-cn/assets/dynamics-test-image-29ac43b9.png",{Heading:w7,Paragraph:x7}=Pe,{CNHead4:_7,CNTitleLarge:S7,CNTitleMedium:b7}=w7,{CNBodySmall:vb,CNMarkSmall:k7}=x7,C7=f.section` background: ${e=>e.theme.white00}; -`,b7=f.div` +`,D7=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.29rem; padding-inline: 1.22rem; -`,k7=f(y7)` +`,j7=f(_7)` padding-bottom: 1.22rem; color: ${e=>e.theme.themeDark02}; text-align: center; -`,C7=f.div` +`,E7=f.div` display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(2, 1fr); @@ -1518,46 +1530,46 @@ Error generating stack: `+o.message+` background: ${e=>e.theme.white00}; overflow: hidden; cursor: pointer; -`,D7=f(yb)` +`,A7=f(yb)` grid-area: 1 / 1 / 3 / 3; border-radius: 0.156rem; box-shadow: 0.234rem 0.156rem 0.781rem rgba(0, 0, 0, 0.1); -`,j7=f(yb)` +`,T7=f(yb)` border-radius: 0.081rem; box-shadow: 0.121rem 0.08rem 0.403rem rgba(0, 0, 0, 0.1); `,wb=f.img` display: block; width: 100%; -`,E7=f(wb)` +`,R7=f(wb)` /* height: 4.14rem; */ -`,A7=f(wb)` +`,O7=f(wb)` /* height: 1.4rem; */ -`,xb=f.div``,T7=f(xb)` +`,xb=f.div``,P7=f(xb)` padding: 0.24rem 0.28rem 0.33rem; -`,R7=f(xb)` +`,M7=f(xb)` padding: 0.13rem 0.12rem 0.23rem; -`,O7=f(w7)` +`,L7=f(S7)` margin-bottom: 0.09rem; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,P7=f(x7)` +`,I7=f(b7)` margin-bottom: 0.13rem; display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,M7=f(vb)` +`,N7=f(vb)` margin-bottom: 0.36rem; display: -webkit-box; -webkit-line-clamp: 6; -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,L7=f(vb)` +`,z7=f(vb)` margin-bottom: 0.25rem; display: -webkit-box; -webkit-line-clamp: 2; @@ -1569,38 +1581,38 @@ Error generating stack: `+o.message+` display: flex; align-items: center; color: ${e=>e.theme.secondary01}; -`,I7=f(_b)` +`,Y7=f(_b)` bottom: 0.28rem; left: 0.28rem; -`,N7=f(_b)` +`,H7=f(_b)` bottom: 0.12rem; left: 0.12rem; -`,Dw=f(_7)` +`,Dw=f(k7)` padding-right: 0.04rem; `,jw=f.img` width: 0.12rem; height: 0.12rem; -`,z7=f(yn)` +`,V7=f(yn)` margin-top: 0.64rem; display: block; margin-inline: auto; color: #fff; -`,Ew=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>C(()=>import("./index-a1bcce61.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>C(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-e2a1595e.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>C(()=>import("./index-aaac1d05.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>C(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>C(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>C(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>C(()=>import("./index-07db2d14.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>C(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>C(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>C(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>C(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>C(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>C(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>C(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>C(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>C(()=>import("./index-a520ffab.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>C(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>C(()=>import("./index-c5edc5af.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>C(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>C(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>C(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>C(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>C(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>C(()=>import("./index-1c51c928.js"),[])}),Y7=()=>{const e=ht(),[t,r]=I.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Ew).map(o=>Ew[o]()));r(i.reverse())};return I.useEffect(()=>{n()},[]),l.jsx(S7,{id:"dynamics",children:l.jsxs(b7,{children:[l.jsx(k7,{children:"达坦动态"}),l.jsx(C7,{children:t.map(({metadata:i,assetURLs:o},a)=>{const{title:c,date:d,cover:h,label:g,description:v}=i;if(a===0)return l.jsxs(D7,{children:[l.jsx(E7,{src:h?o[0]:Cw}),l.jsxs(T7,{children:[l.jsx(O7,{children:g}),l.jsx(M7,{children:v})]}),l.jsxs(I7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c);if(a<5)return l.jsxs(j7,{children:[l.jsx(A7,{src:h?o[0]:Cw}),l.jsxs(R7,{children:[l.jsx(P7,{children:g}),l.jsx(L7,{children:v})]}),l.jsxs(N7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c)})}),l.jsx(z7,{onClick:()=>e("/events"),children:"了解更多"})]})})},H7="/zh-cn/assets/blog-test-image-c63d058c.png",F7="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:V7,Paragraph:U7}=Pe,{CNHead4:$7,TitleLarge:B7}=V7,{CNBodyMedium:Sb}=U7,W7=f.section` +`,Ew=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-0a77c99b.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-c648bdf6.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-5a282940.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>b(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-5d075b3e.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5f61d62d.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-4e05b5cd.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>b(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b0b5bfda.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-1c51c928.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-b9598d44.js"),[])}),F7=()=>{const e=ht(),[t,r]=I.useState([]),n=async()=>{const i=await Promise.all(Object.keys(Ew).map(o=>Ew[o]()));r(i.reverse())};return I.useEffect(()=>{n()},[]),l.jsx(C7,{id:"dynamics",children:l.jsxs(D7,{children:[l.jsx(j7,{children:"达坦动态"}),l.jsx(E7,{children:t.map(({metadata:i,assetURLs:o},a)=>{const{title:c,date:d,cover:h,label:g,description:v}=i;if(a===0)return l.jsxs(A7,{children:[l.jsx(R7,{src:h?o[0]:Cw}),l.jsxs(P7,{children:[l.jsx(L7,{children:g}),l.jsx(N7,{children:v})]}),l.jsxs(Y7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c);if(a<5)return l.jsxs(T7,{children:[l.jsx(O7,{src:h?o[0]:Cw}),l.jsxs(M7,{children:[l.jsx(I7,{children:g}),l.jsx(z7,{children:v})]}),l.jsxs(H7,{onClick:()=>{e(`/events/${d}-${c.split(" ").join("-")}`)},children:[l.jsx(Dw,{children:"详情"}),l.jsx(jw,{src:kw})]})]},c)})}),l.jsx(V7,{onClick:()=>e("/events"),children:"了解更多"})]})})},U7="/zh-cn/assets/blog-test-image-c63d058c.png",$7="/zh-cn/assets/blog-cover-3d82a30d.png",{Heading:B7,Paragraph:W7}=Pe,{CNHead4:G7,TitleLarge:K7}=B7,{CNBodyMedium:Sb}=W7,X7=f.section` background: #f7f7f9; -`,G7=f.div` +`,Q7=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 0.32rem; padding-inline: 1.22rem; -`,K7=f($7)` +`,q7=f(G7)` padding-bottom: 1.22rem; color: ${e=>e.theme.themeDark02}; text-align: center; -`,X7=f.div` +`,Z7=f.div` padding-block: 0.59rem; padding-inline: 0.3rem; -`,Q7=f.div` +`,J7=f.div` padding-bottom: 0.59rem; display: grid; grid-auto-flow: column; @@ -1609,16 +1621,16 @@ Error generating stack: `+o.message+` grid-gap: 0.36rem; padding-inline: 0.29rem; height: min-content; -`,q7=f.img` +`,e8=f.img` width: 100%; /* height: 100%; */ grid-area: 1 / 1 / 3 / 2; border-top-left-radius: 0.12rem; border-top-right-radius: 0.12rem; -`,Z7=f.div` +`,t8=f.div` padding-bottom: 0.22rem; border-bottom: 0.01rem solid #a4a4a4; -`,J7=f(B7)` +`,r8=f(K7)` margin-bottom: 0.15rem; color: ${e=>e.theme.gray007}; display: -webkit-box; @@ -1630,7 +1642,7 @@ Error generating stack: `+o.message+` &:hover { color: #722ed1; } -`,e8=f(Sb)` +`,n8=f(Sb)` margin-bottom: 0.07rem; color: #383838; display: -webkit-box; @@ -1638,7 +1650,7 @@ Error generating stack: `+o.message+` -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; -`,t8=f(Sb)` +`,i8=f(Sb)` color: #fff; margin-inline: auto; padding-block: 0.12rem; @@ -1649,18 +1661,18 @@ Error generating stack: `+o.message+` border-radius: 0.5rem; border: none; cursor: pointer; -`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>C(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>C(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>C(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>C(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>C(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>C(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>C(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>C(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>C(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>C(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>C(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>C(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>C(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>C(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>C(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>C(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>C(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>C(()=>import("./index-daed041b.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>C(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>C(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>C(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>C(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>C(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>C(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>C(()=>import("./index-8c16a843.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>C(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>C(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>C(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>C(()=>import("./index-4b4d6acc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>C(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>C(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>C(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>C(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>C(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>C(()=>import("./index-cf399721.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>C(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>C(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>C(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>C(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>C(()=>import("./index-e0e6b52c.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>C(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>C(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>C(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>C(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>C(()=>import("./index-c29dde05.js"),[])}),r8=()=>{const e=ht(),[t,r]=I.useState([]),[n,i]=I.useState(""),o=async()=>{const a=await Promise.all(Object.keys(Aw).map(c=>Aw[c]()));r(a.reverse())};return I.useEffect(()=>{o()},[]),I.useEffect(()=>{var a;i(((a=t[0])==null?void 0:a.assetURLs[0])||H7)},[t]),l.jsx(W7,{id:"blog",children:l.jsxs(G7,{children:[l.jsx(K7,{children:"技术博客"}),l.jsxs(X7,{children:[l.jsxs(Q7,{children:[l.jsx(q7,{src:F7}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(Z7,{children:[l.jsx(J7,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(e8,{children:v})]},d)})]}),l.jsx(t8,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},Tw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"资源"}),l.jsx(h7,{}),l.jsx(Y7,{}),l.jsx(r8,{})]})},n8="/zh-cn/assets/andreas-0ee099e2.png",i8="/zh-cn/assets/bruno-thethe-4458e86e.png",o8="/zh-cn/assets/mahdi-bafande-9bcc200e.png",{Heading:s8,Paragraph:a8}=Pe,{Heading3:l8,CNHead4:c8}=s8,{CNBodyLarge:u8}=a8,d8=f.section` +`,Aw=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>b(()=>import("./index-25293c60.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-f42f30bc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-951bfe33.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-884e893f.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.js"),[])}),o8=()=>{const e=ht(),[t,r]=I.useState([]),[n,i]=I.useState(""),o=async()=>{const a=await Promise.all(Object.keys(Aw).map(c=>Aw[c]()));r(a.reverse())};return I.useEffect(()=>{o()},[]),I.useEffect(()=>{var a;i(((a=t[0])==null?void 0:a.assetURLs[0])||U7)},[t]),l.jsx(X7,{id:"blog",children:l.jsxs(Q7,{children:[l.jsx(q7,{children:"技术博客"}),l.jsxs(Z7,{children:[l.jsxs(J7,{children:[l.jsx(e8,{src:$7}),t.map(({metadata:a},c)=>{const{title:d,date:h,label:g,description:v}=a;return c<4&&l.jsxs(t8,{children:[l.jsx(r8,{onClick:()=>{e(`/blogs/${h}-${d.split(" ").join("-")}`)},children:g}),l.jsx(n8,{children:v})]},d)})]}),l.jsx(i8,{onClick:()=>e("/blogs"),children:"了解更多"})]})]})})},Tw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:gb,children:"资源"}),l.jsx(g7,{}),l.jsx(F7,{}),l.jsx(o8,{})]})},s8="/zh-cn/assets/andreas-0ee099e2.png",a8="/zh-cn/assets/bruno-thethe-4458e86e.png",l8="/zh-cn/assets/mahdi-bafande-9bcc200e.png",{Heading:c8,Paragraph:u8}=Pe,{Heading3:d8,CNHead4:f8}=c8,{CNBodyLarge:h8}=u8,m8=f.section` background: #f7f7f9; -`,f8=f.div` +`,p8=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.84rem; padding-inline: 2.24rem; -`,h8=f(c8)` +`,g8=f(f8)` text-align: center; padding-bottom: 1.1rem; -`,m8=f.div` +`,v8=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr); @@ -1673,113 +1685,113 @@ Error generating stack: `+o.message+` padding-inline: 0.48rem; background-size: cover; border-radius: 0.18rem; -`,p8=f(Ng)` - background-image: url(${n8}); +`,y8=f(Ng)` + background-image: url(${s8}); grid-area: 1 / 1 / 2 / 2; -`,g8=f(Ng)` - background-image: url(${i8}); +`,w8=f(Ng)` + background-image: url(${a8}); grid-area: 2 / 1 / 3 / 2; -`,v8=f(Ng)` - background-image: url(${o8}); +`,x8=f(Ng)` + background-image: url(${l8}); grid-area: 1 / 2 / 3 / 3; -`,Oh=f(l8)` +`,Oh=f(d8)` padding-bottom: 0.06rem; color: #fff; -`,Ph=f(u8)` +`,Ph=f(h8)` color: #d9dbef; -`,y8=()=>l.jsx(d8,{id:"usage-scenarios",children:l.jsxs(f8,{children:[l.jsx(h8,{children:"使用场景"}),l.jsxs(m8,{children:[l.jsxs(p8,{children:[l.jsx(Oh,{children:"跨云数据实时备份"}),l.jsx(Ph,{children:"尤其针对关键业务应用场景,如数据库。"})]}),l.jsxs(g8,{children:[l.jsx(Oh,{children:"跨云数据加载"}),l.jsx(Ph,{children:"特别针对人工智能、大数据训练场景。"})]}),l.jsxs(v8,{children:[l.jsx(Oh,{children:"跨云应用迁移"}),l.jsx(Ph,{children:"尤其针对具有高并发性和业务弹性要求高的场景的应用,如中国的双十一促销活动。"})]})]})]})}),w8="/zh-cn/assets/cover-2eaea155.png",x8="/zh-cn/assets/SJTU-logo-a938b527.png",_8="/zh-cn/assets/BUPT-logo-4d861e45.png",S8="/zh-cn/assets/HNU-logo-a704fb8b.png",b8="/zh-cn/assets/SCUT-logo-aa4c3285.png",k8="/zh-cn/assets/SBU-logo-a0084f17.png",C8="/zh-cn/assets/image-cd6390ff.png",{Heading:D8,Paragraph:j8}=Pe,{CNHead4:E8,CNHead5:A8}=D8,{CNBodyLarge:bb}=j8,T8=f.section` +`,_8=()=>l.jsx(m8,{id:"usage-scenarios",children:l.jsxs(p8,{children:[l.jsx(g8,{children:"使用场景"}),l.jsxs(v8,{children:[l.jsxs(y8,{children:[l.jsx(Oh,{children:"跨云数据实时备份"}),l.jsx(Ph,{children:"尤其针对关键业务应用场景,如数据库。"})]}),l.jsxs(w8,{children:[l.jsx(Oh,{children:"跨云数据加载"}),l.jsx(Ph,{children:"特别针对人工智能、大数据训练场景。"})]}),l.jsxs(x8,{children:[l.jsx(Oh,{children:"跨云应用迁移"}),l.jsx(Ph,{children:"尤其针对具有高并发性和业务弹性要求高的场景的应用,如中国的双十一促销活动。"})]})]})]})}),S8="/zh-cn/assets/cover-2eaea155.png",b8="/zh-cn/assets/SJTU-logo-a938b527.png",k8="/zh-cn/assets/BUPT-logo-4d861e45.png",C8="/zh-cn/assets/HNU-logo-a704fb8b.png",D8="/zh-cn/assets/SCUT-logo-aa4c3285.png",j8="/zh-cn/assets/SBU-logo-a0084f17.png",E8="/zh-cn/assets/image-cd6390ff.png",{Heading:A8,Paragraph:T8}=Pe,{CNHead4:R8,CNHead5:O8}=A8,{CNBodyLarge:bb}=T8,P8=f.section` background: ${e=>e.theme.white00}; background: linear-gradient(180deg, #BFC5FB, #BFC5FB00 50%); -`,R8=f.div` +`,M8=f.div` padding-top: 1.48rem; max-width: 1440px; margin-inline: auto; padding-bottom: 0.79rem; padding-inline: 2.03rem; -`,O8=f(E8)` +`,L8=f(R8)` padding-bottom: 0.5rem; text-align: center; -`,P8=f(bb)` +`,I8=f(bb)` padding-bottom: 0.52rem; margin-bottom: 1rem; border-bottom: 0.01rem solid ${e=>e.theme.secondary02}; text-align: center; -`,M8=f.div` +`,N8=f.div` display: flex; justify-content: space-between; -`,L8=f.div` +`,z8=f.div` display: grid; grid-gap: 0.3rem 0.2rem; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(4, 1fr); width: 57%; /* height: 11rem; */ -`,I8=f.ul` +`,Y8=f.ul` width: 37%; list-style-type: none; `,Ol=f.img` width: 100%; /* height: 100%; */ -`,N8=f(Ol)` +`,H8=f(Ol)` grid-area: 1 / 2 / 2 / 4; -`,z8=f(Ol)` +`,V8=f(Ol)` grid-area: 2 / 1 / 3 / 3; -`,Y8=f(Ol)` +`,F8=f(Ol)` grid-area: 2 / 3 / 3 / 5; -`,H8=f(Ol)` +`,U8=f(Ol)` width: 120%; transform: translateX(-10%); grid-area: 3/ 2 / 4 / 4; -`,F8=f(Ol)` +`,$8=f(Ol)` transform: translateX(5%); width: 90%; grid-area: 4 / 2 / 5 / 4; -`,V8=f.li` +`,B8=f.li` padding-bottom: 0.46rem; &:last-child { padding-bottom: 0; } -`,U8=f(A8)` +`,W8=f(O8)` padding-bottom: 0.16rem; color: ${e=>e.theme.secondary01}; -`,$8=f(bb)``,B8=f.img` +`,G8=f(bb)``,K8=f.img` width: 100%; padding-bottom: 1.18rem; -`,W8=[{title:"高性能跨云SaaS服务基础",content:[{text:"上海交通大学"},{text:" 合作项目:利用RDMA加速serverless的性能"}]},{title:"高性能跨云网络基础",content:[{text:"北京邮电大学 合作项目:RDMA的流量控制"},{text:"湖南大学 合作项目:RDMA QoS"}]},{title:"高性能网络硬件支持",content:[{text:"华南理工大学"},{text:"合作项目:硬件敏捷开发和验证"}]},{title:"高性能跨云一致性算法",content:[{text:"美国石溪大学"},{text:"合作项目:分布式一致性"}]}],Rw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:w8,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"客 户"}),l.jsx(y8,{}),l.jsx(T8,{id:"project-cooperation",children:l.jsxs(R8,{children:[l.jsx(B8,{src:C8}),l.jsx(O8,{children:"产学研项目合作"}),l.jsx(P8,{children:"DatenLord积极推动产学研合作,与国内外各大高校的顶尖实验室合作,在高性能跨云SaaS服务基础、高性能跨云网络基础、高性能网络硬件支持和高性能跨云网络一致性算法领域共同进行深入的前瞻研究和实践落地。"}),l.jsxs(M8,{children:[l.jsxs(L8,{children:[l.jsx(N8,{src:x8}),l.jsx(z8,{src:_8}),l.jsx(Y8,{src:S8}),l.jsx(H8,{src:b8}),l.jsx(F8,{src:k8})]}),l.jsx(I8,{children:W8.map(({title:t,content:r},n)=>l.jsxs(V8,{children:[l.jsx(U8,{children:t}),r.map(({text:i},o)=>l.jsx($8,{children:i},o))]},n))})]})]})})]})},G8="/zh-cn/assets/logo-theme-dark-9478769d.svg",K8="/zh-cn/assets/founding-image-1a5d82c0.png",X8="/zh-cn/assets/shi-jicheng-avatar-b016e3a2.png",Q8="/zh-cn/assets/wang-pu-avatar-5d318600.png",{Heading:q8,Paragraph:Z8}=Pe,{CNHead4:J8,CNHead5S:ez,CNHead5:tz}=q8,{CNBodyLarge:nf,CNBodySmall:kb}=Z8,rz=[{key:"wang-pu",avatar:Q8,name:"王璞",position:"达坦科技创始人兼CEO",text:"达坦科技创始人兼CEO,美国George Mason大学计算机博士、北大硕士、北航本科,拥有多年云计算和大数据领域的经验和积累,擅长分布式系统研发、海量数据处理、云计算产品设计及大规模机器学习等。2014年回国创业,创立数人云科技公司,专注容器技术在国内的落地和推广,2018年被上市公司收购。曾发表十余篇论文,共计被引用上千次,拥有多项云计算专利、软著,并于2020年被评选为腾讯云TVP(最有价值专家)。",quote:"“我读大学的时候玩乐队,弹奏最多的就是Guns N' Roses(枪花)乐队的歌曲。枪花1987年发行的第一张专辑叫《Appetite for Destruction》。虽然我不至于有毁灭欲,但都说创新的本质其实是‘创造性地破坏’,创业亦然。离开大公司后我连续投身科技创业,想要静心做底层技术的颠覆性创新。想来也算是年轻时追求的摇滚精神跨时空的延续”。",inscription:"——王璞 达坦科技创始人兼CEO"},{key:"shi-ji-cheng",avatar:X8,name:"施继成",position:"达坦科技联合创始人兼 CTO",text:"DatenLord 联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选2022年度36氪S级创业者名册,荣获中国“企业工具与底层软件”领域 “36位36岁以下创业者“称号。",quote:"“魂系游戏和创业很相似,前者大量的离散叙事遍布于各个物件和NPC上,寻找主线剧情就好比创业时把客户的需求、公司的技术优势、VUCA时代瞬息万变的市场变化和趋势等都链接起来,形成完整的产品叙事并落地。两者的难度系数都很高,创业中的踩坑、犯错对应的是游戏中的“死亡”,所以,‘不死精神’或者说‘Grit’(坚毅)是魂系游戏和投身创业企业玩家的必备素质。”",inscription:"——施继成 达坦科技联合创始人兼CTO"}],nz=f.section` +`,X8=[{title:"高性能跨云SaaS服务基础",content:[{text:"上海交通大学"},{text:" 合作项目:利用RDMA加速serverless的性能"}]},{title:"高性能跨云网络基础",content:[{text:"北京邮电大学 合作项目:RDMA的流量控制"},{text:"湖南大学 合作项目:RDMA QoS"}]},{title:"高性能网络硬件支持",content:[{text:"华南理工大学"},{text:"合作项目:硬件敏捷开发和验证"}]},{title:"高性能跨云一致性算法",content:[{text:"美国石溪大学"},{text:"合作项目:分布式一致性"}]}],Rw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:S8,subTitle:"通过实现跨云、跨数据中心的数据高速访问,DatenLord将大大提升存储系统的可扩展性,同时大大降低企业级IT业务系统在实现高可用性、多活方面的复杂性。随着多云、多数据中心成为企业级IT的主流架构,跨云分布式存储将在互联网、金融、电信、能源等不同行业得到广泛应用。",children:"客 户"}),l.jsx(_8,{}),l.jsx(P8,{id:"project-cooperation",children:l.jsxs(M8,{children:[l.jsx(K8,{src:E8}),l.jsx(L8,{children:"产学研项目合作"}),l.jsx(I8,{children:"DatenLord积极推动产学研合作,与国内外各大高校的顶尖实验室合作,在高性能跨云SaaS服务基础、高性能跨云网络基础、高性能网络硬件支持和高性能跨云网络一致性算法领域共同进行深入的前瞻研究和实践落地。"}),l.jsxs(N8,{children:[l.jsxs(z8,{children:[l.jsx(H8,{src:b8}),l.jsx(V8,{src:k8}),l.jsx(F8,{src:C8}),l.jsx(U8,{src:D8}),l.jsx($8,{src:j8})]}),l.jsx(Y8,{children:X8.map(({title:t,content:r},n)=>l.jsxs(B8,{children:[l.jsx(W8,{children:t}),r.map(({text:i},o)=>l.jsx(G8,{children:i},o))]},n))})]})]})})]})},Q8="/zh-cn/assets/logo-theme-dark-9478769d.svg",q8="/zh-cn/assets/founding-image-1a5d82c0.png",Z8="/zh-cn/assets/shi-jicheng-avatar-b016e3a2.png",J8="/zh-cn/assets/wang-pu-avatar-5d318600.png",{Heading:ez,Paragraph:tz}=Pe,{CNHead4:rz,CNHead5S:nz,CNHead5:iz}=ez,{CNBodyLarge:nf,CNBodySmall:kb}=tz,oz=[{key:"wang-pu",avatar:J8,name:"王璞",position:"达坦科技创始人兼CEO",text:"达坦科技创始人兼CEO,美国George Mason大学计算机博士、北大硕士、北航本科,拥有多年云计算和大数据领域的经验和积累,擅长分布式系统研发、海量数据处理、云计算产品设计及大规模机器学习等。2014年回国创业,创立数人云科技公司,专注容器技术在国内的落地和推广,2018年被上市公司收购。曾发表十余篇论文,共计被引用上千次,拥有多项云计算专利、软著,并于2020年被评选为腾讯云TVP(最有价值专家)。",quote:"“我读大学的时候玩乐队,弹奏最多的就是Guns N' Roses(枪花)乐队的歌曲。枪花1987年发行的第一张专辑叫《Appetite for Destruction》。虽然我不至于有毁灭欲,但都说创新的本质其实是‘创造性地破坏’,创业亦然。离开大公司后我连续投身科技创业,想要静心做底层技术的颠覆性创新。想来也算是年轻时追求的摇滚精神跨时空的延续”。",inscription:"——王璞 达坦科技创始人兼CEO"},{key:"shi-ji-cheng",avatar:Z8,name:"施继成",position:"达坦科技联合创始人兼 CTO",text:"DatenLord 联合创始人兼 CTO,复旦大学软件工程本硕,师从华为基础软件首席科学家、鸿蒙实验室主任陈海波教授。擅长操作系统内核开发、分布式系统、嵌入式系统,对分布式数据一致性有钻深的研究,发表多篇操作系统内核相关论文,累计数百次引用。毕业后曾在谷歌中国、微软亚太和阿里巴巴等公司从事分布式计算和存储等相关工作。入选2022年度36氪S级创业者名册,荣获中国“企业工具与底层软件”领域 “36位36岁以下创业者“称号。",quote:"“魂系游戏和创业很相似,前者大量的离散叙事遍布于各个物件和NPC上,寻找主线剧情就好比创业时把客户的需求、公司的技术优势、VUCA时代瞬息万变的市场变化和趋势等都链接起来,形成完整的产品叙事并落地。两者的难度系数都很高,创业中的踩坑、犯错对应的是游戏中的“死亡”,所以,‘不死精神’或者说‘Grit’(坚毅)是魂系游戏和投身创业企业玩家的必备素质。”",inscription:"——施继成 达坦科技联合创始人兼CTO"}],sz=f.section` background: #f7f7f9; -`,iz=f.section` +`,az=f.section` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.16rem; padding-inline: 1.22rem; -`,oz=f(J8)` +`,lz=f(rz)` padding-bottom: 1.56rem; color: ${e=>e.theme.themeDark02}; text-align: center; -`,sz=f.div` +`,cz=f.div` padding-inline: 0.34rem; padding-bottom: 0.73rem; display: flex; justify-content: space-between; align-items: center; -`,az=f.img` +`,uz=f.img` width: 36%; -`,lz=f(nf)` +`,dz=f(nf)` width: 54%; -`,cz=f.div` +`,fz=f.div` display: flex; justify-content: space-between; align-items: center; padding-inline: 0.34rem; padding-bottom: 0.65rem; -`,uz=f.img` +`,hz=f.img` width: 36%; -`,dz=f.div` +`,mz=f.div` width: 54%; -`,fz=f(ez)``,hz=f(nf)` +`,pz=f(nz)``,gz=f(nf)` padding-left: 0.16rem; -`,mz=f.div` +`,vz=f.div` display: flex; flex-direction: ${e=>e.name=="wang-pu"?"row":"row-reverse"}; justify-content: space-between; @@ -1793,62 +1805,62 @@ Error generating stack: `+o.message+` &:last-child { margin-top: 0; } -`,pz=f.div` +`,yz=f.div` display: flex; flex-direction: column; justify-content: center; align-items: center; width: 12%; text-align: center; -`,gz=f.div` +`,wz=f.div` width: 80%; -`,vz=f.img` +`,xz=f.img` width: 1.2rem; height: 1.2rem; margin-bottom: 0.13rem; border-radius: 50%; border: 0.01rem solid #000; -`,yz=f(tz)` +`,_z=f(iz)` margin-bottom: 0.04rem; -`,wz=f(nf)``,xz=f(nf)` +`,Sz=f(nf)``,bz=f(nf)` padding-bottom: 0.39rem; -`,_z=f(kb)` +`,kz=f(kb)` margin-bottom: 0.3rem; padding-left: 0.1rem; border-left: 0.02rem solid transparent; border-image: linear-gradient(90deg, #767ee5, #9966cc) 1; color: ${e=>e.theme.gray03}; -`,Sz=f(kb)` +`,Cz=f(kb)` color: ${e=>e.theme.gray03}; text-align: right; `,Sa=f.span` color: ${e=>e.theme.secondary01}; font-weight: 600; -`,bz=()=>l.jsx(nz,{id:"about-us",children:l.jsxs(iz,{children:[l.jsx(oz,{children:"关于我们"}),l.jsxs(sz,{children:[l.jsx(az,{src:G8}),l.jsxs(lz,{children:["达坦科技始终致力于打造高性能 ",l.jsx(Sa,{children:"AI+ Cloud 基础设施平台"}),",积极推动AI应用的落地。达坦科技通过",l.jsx(Sa,{children:"软硬件深度融合的方式"}),",提供高性能存储和高性能网络。为 AI + Cloud 应用提供",l.jsx(Sa,{children:"弹性、便利、经济"}),"的基础设施服务,以此满足不同行业客户对 AI + Cloud 的需求。"]})]}),l.jsxs(cz,{children:[l.jsxs(dz,{children:[l.jsx(fz,{style:{paddingLeft:"0.16rem",paddingBottom:"0.39rem"},children:"创始团队"}),l.jsxs(hz,{children:["达坦科技",l.jsx(Sa,{children:"专注底层硬核技术"}),",通过软硬件深度融合的方式,涉及分布式系统、Linux 内核、 InfiniBand/RDMA、 SoC、硬件加速等多个前沿技术领域。公司创始团队和核心成员大部分来自谷歌, 微软、阿里巴巴等国际知名科技公司的顶尖人才,拥有",l.jsx(Sa,{children:"深厚的软硬件技术和丰富的行业经验"}),"。"]})]}),l.jsx(uz,{src:K8})]}),rz.map(({key:e,name:t,avatar:r,position:n,text:i,quote:o,inscription:a})=>l.jsxs(mz,{name:e,children:[l.jsxs(pz,{children:[l.jsx(vz,{src:r}),l.jsx(yz,{children:t}),l.jsx(wz,{children:n})]}),l.jsxs(gz,{children:[l.jsx(xz,{children:i}),l.jsx(_z,{children:o}),l.jsx(Sz,{children:a})]})]},e))]})}),kz="/zh-cn/assets/VMV-section-bg-fde7914e.png",Cz="/zh-cn/assets/book-9274cf2e.svg",Dz="/zh-cn/assets/bulb-e5b82e48.svg",jz="/zh-cn/assets/target-c78d4e77.svg",Ez="/zh-cn/assets/HollowSphere4-3d92727b.png",Az="/zh-cn/assets/HollowSphere5-971b228b.png",Ow="/zh-cn/assets/Pipe4-0ba2713b.png",{Heading:Tz,Paragraph:Rz}=Pe,{CNHead4:zg}=Tz,{CNBodyLarge:Yg,CNBodyMedium:Oz}=Rz,Pz=f.section` +`,Dz=()=>l.jsx(sz,{id:"about-us",children:l.jsxs(az,{children:[l.jsx(lz,{children:"关于我们"}),l.jsxs(cz,{children:[l.jsx(uz,{src:Q8}),l.jsxs(dz,{children:["达坦科技始终致力于打造高性能 ",l.jsx(Sa,{children:"AI+ Cloud 基础设施平台"}),",积极推动AI应用的落地。达坦科技通过",l.jsx(Sa,{children:"软硬件深度融合的方式"}),",提供高性能存储和高性能网络。为 AI + Cloud 应用提供",l.jsx(Sa,{children:"弹性、便利、经济"}),"的基础设施服务,以此满足不同行业客户对 AI + Cloud 的需求。"]})]}),l.jsxs(fz,{children:[l.jsxs(mz,{children:[l.jsx(pz,{style:{paddingLeft:"0.16rem",paddingBottom:"0.39rem"},children:"创始团队"}),l.jsxs(gz,{children:["达坦科技",l.jsx(Sa,{children:"专注底层硬核技术"}),",通过软硬件深度融合的方式,涉及分布式系统、Linux 内核、 InfiniBand/RDMA、 SoC、硬件加速等多个前沿技术领域。公司创始团队和核心成员大部分来自谷歌, 微软、阿里巴巴等国际知名科技公司的顶尖人才,拥有",l.jsx(Sa,{children:"深厚的软硬件技术和丰富的行业经验"}),"。"]})]}),l.jsx(hz,{src:q8})]}),oz.map(({key:e,name:t,avatar:r,position:n,text:i,quote:o,inscription:a})=>l.jsxs(vz,{name:e,children:[l.jsxs(yz,{children:[l.jsx(xz,{src:r}),l.jsx(_z,{children:t}),l.jsx(Sz,{children:n})]}),l.jsxs(wz,{children:[l.jsx(bz,{children:i}),l.jsx(kz,{children:o}),l.jsx(Cz,{children:a})]})]},e))]})}),jz="/zh-cn/assets/VMV-section-bg-fde7914e.png",Ez="/zh-cn/assets/book-9274cf2e.svg",Az="/zh-cn/assets/bulb-e5b82e48.svg",Tz="/zh-cn/assets/target-c78d4e77.svg",Rz="/zh-cn/assets/HollowSphere4-3d92727b.png",Oz="/zh-cn/assets/HollowSphere5-971b228b.png",Ow="/zh-cn/assets/Pipe4-0ba2713b.png",{Heading:Pz,Paragraph:Mz}=Pe,{CNHead4:zg}=Pz,{CNBodyLarge:Yg,CNBodyMedium:Lz}=Mz,Iz=f.section` color: ${e=>e.theme.secondary02}; background: ${e=>e.theme.themeDark}; - background-image: url(${kz}); + background-image: url(${jz}); background-size: cover; -`,Mz=f.section` +`,Nz=f.section` position: relative; max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.31rem; padding-inline: 1.6rem; -`,Lz=f(zg)` +`,zz=f(zg)` padding-bottom: 1.57rem; color: ${e=>e.theme.secondary02}; text-align: center; -`,Iz=f.div` +`,Yz=f.div` padding-bottom: 1.04rem; display: flex; justify-content: space-between; `,Hg=f.div` width: 32%; -`,Nz=f(Hg)` +`,Hz=f(Hg)` padding-top: 1rem; -`,zz=f(Hg)``,Yz=f(Hg)` +`,Vz=f(Hg)``,Fz=f(Hg)` padding-top: 0.79rem; `,$a=f.div` margin-bottom: 0.2rem; @@ -1869,14 +1881,14 @@ Error generating stack: `+o.message+` `,Dc=f(Yg)` color: #fff; padding-bottom: 0.06rem; -`,No=f(Yg)``,Hz=f($a)` +`,No=f(Yg)``,Uz=f($a)` display: flex; width: 80%; padding-block: 0.4rem; padding-inline: 0.46rem; -`,Fz=f(zg)` +`,$z=f(zg)` padding-right: 1rem; -`,Vz=f.div` +`,Bz=f.div` display: flex; flex-direction: column; `,Ih=f.div` @@ -1892,7 +1904,7 @@ Error generating stack: `+o.message+` height: 0.58rem; `,zh=f.div``,Yh=f(Yg)` padding-bottom: 0.06rem; -`,Hh=f(Oz)``,Uz=f.img` +`,Hh=f(Lz)``,Wz=f.img` position: absolute; top: 2.22rem; right: 1.59rem; @@ -1900,43 +1912,43 @@ Error generating stack: `+o.message+` height: 1.5rem; `,Cb=f.img` position: absolute; -`,$z=f(Cb)` +`,Gz=f(Cb)` left: 2.64rem; top: 9.13rem; width: 3.31rem; height: 3.31rem; -`,Bz=f(Cb)` +`,Kz=f(Cb)` left: 2.94rem; top: 8.97rem; width: 1.37rem; height: 1.37rem; transform: rotate(-80deg); -`,Wz=f.img` +`,Xz=f.img` position: absolute; right: 0; bottom: 0.2rem; width: 3.5rem; -`,Gz=()=>l.jsx(Pz,{children:l.jsxs(Mz,{children:[l.jsx(Lz,{children:"愿景/使命/价值观"}),l.jsxs(Iz,{children:[l.jsx(Nz,{children:l.jsxs($a,{children:[l.jsx(Lh,{children:"愿景"}),l.jsx(No,{children:"使企业能够以高性能和高安全性的方式在全球多个云中读、写和提取数据。"})]})}),l.jsxs(zz,{children:[l.jsxs($a,{children:[l.jsx(Lh,{children:"使命"}),l.jsx(No,{children:"通过使用DatenLord 跨云分布式的存储系统,打破跨云之间的隔阂。"})]}),l.jsxs($a,{children:[l.jsx(Lh,{children:"价值"}),l.jsx(Dc,{children:"开放和透明"}),l.jsx(No,{children:"我们努力保证信息和决策过程的透明度,从而创造一个包容性的社区,让每个成员都感到安全和自信,可以贡献不同的意见和多元化的视角。我们相信建设性的冲突可以带来反思和改进。"})]})]}),l.jsxs(Yz,{children:[l.jsxs(Mh,{children:[l.jsx(Dc,{children:"敢于成为先锋"}),l.jsx(No,{children:"我们是一群具有成长型思维模式的人,我们不走捷径并且相信慢就是快。我们的目标是成为先锋,敢于标新立异,制定自己的模式,因此我们允许犯错,但更相信我们能够快速、持续地调整和完善。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"坚持交付卓越"}),l.jsx(No,{children:"我们相信结果与过程同样重要。我们以目标为导向,设定高标准,并发挥我们的聪明才智和努力拼搏的精神来实现它们。我们致力于通过关注自身的行动和外部的变化来获得想要的结果。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"专注于小而可控的步骤"}),l.jsx(No,{children:"大的里程碑固然值得庆祝,而每一跬步也很重要。我们相信在正确的方向上迈出的每一小步可以跨越难以想象的距离。我们相信不积跬步,无以至千里;不积小流,无以成江海。"})]})]})]}),l.jsxs(Hz,{children:[l.jsx(Fz,{children:"公司文化"}),l.jsxs(Vz,{children:[l.jsxs(Ih,{children:[l.jsx(Nh,{src:Cz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"持续学习"}),l.jsx(Hh,{children:"持之以恒的自驱学习,求真求致;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Dz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"精益求精"}),l.jsx(Hh,{children:"对自己高标准严要求,勇于挑战自我,对创新有极致追求;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:jz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"积极主动"}),l.jsx(Hh,{children:"遇到问题主动踏出第一步,做先行者而不是追随者。"})]})]})]})]}),l.jsx(Uz,{src:Az}),l.jsx($z,{src:Ow}),l.jsx(Bz,{src:Ow}),l.jsx(Wz,{src:Ez})]})}),Kz="/zh-cn/assets/public-ebe954c4.svg",Xz="/zh-cn/assets/mail-63c82f9f.svg",Qz="/zh-cn/assets/wechat-c8587d4a.svg",qz="/zh-cn/assets/bilibili-b4f04177.svg",Zz="/zh-cn/assets/zhihu-6dedfed7.svg",Jz="/zh-cn/assets/wechat-public-qrcode1-2f1a7fe8.png",eY="/zh-cn/assets/email-qrcode1-86dcc594.png",tY="/zh-cn/assets/wechat-qrcode1-72234ee7.png",rY="/zh-cn/assets/bilibili-qrcode1-27289e6d.png",nY="/zh-cn/assets/zhihu-qrcode1-6f12e2dc.png",{Heading:iY,Paragraph:oY}=Pe,{CNHead4:sY,CNTitleMedium:aY}=iY,{CNBodySmall:lY}=oY,cY=f.section` +`,Qz=()=>l.jsx(Iz,{children:l.jsxs(Nz,{children:[l.jsx(zz,{children:"愿景/使命/价值观"}),l.jsxs(Yz,{children:[l.jsx(Hz,{children:l.jsxs($a,{children:[l.jsx(Lh,{children:"愿景"}),l.jsx(No,{children:"使企业能够以高性能和高安全性的方式在全球多个云中读、写和提取数据。"})]})}),l.jsxs(Vz,{children:[l.jsxs($a,{children:[l.jsx(Lh,{children:"使命"}),l.jsx(No,{children:"通过使用DatenLord 跨云分布式的存储系统,打破跨云之间的隔阂。"})]}),l.jsxs($a,{children:[l.jsx(Lh,{children:"价值"}),l.jsx(Dc,{children:"开放和透明"}),l.jsx(No,{children:"我们努力保证信息和决策过程的透明度,从而创造一个包容性的社区,让每个成员都感到安全和自信,可以贡献不同的意见和多元化的视角。我们相信建设性的冲突可以带来反思和改进。"})]})]}),l.jsxs(Fz,{children:[l.jsxs(Mh,{children:[l.jsx(Dc,{children:"敢于成为先锋"}),l.jsx(No,{children:"我们是一群具有成长型思维模式的人,我们不走捷径并且相信慢就是快。我们的目标是成为先锋,敢于标新立异,制定自己的模式,因此我们允许犯错,但更相信我们能够快速、持续地调整和完善。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"坚持交付卓越"}),l.jsx(No,{children:"我们相信结果与过程同样重要。我们以目标为导向,设定高标准,并发挥我们的聪明才智和努力拼搏的精神来实现它们。我们致力于通过关注自身的行动和外部的变化来获得想要的结果。"})]}),l.jsxs(Mh,{children:[l.jsx(Dc,{children:"专注于小而可控的步骤"}),l.jsx(No,{children:"大的里程碑固然值得庆祝,而每一跬步也很重要。我们相信在正确的方向上迈出的每一小步可以跨越难以想象的距离。我们相信不积跬步,无以至千里;不积小流,无以成江海。"})]})]})]}),l.jsxs(Uz,{children:[l.jsx($z,{children:"公司文化"}),l.jsxs(Bz,{children:[l.jsxs(Ih,{children:[l.jsx(Nh,{src:Ez}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"持续学习"}),l.jsx(Hh,{children:"持之以恒的自驱学习,求真求致;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Az}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"精益求精"}),l.jsx(Hh,{children:"对自己高标准严要求,勇于挑战自我,对创新有极致追求;"})]})]}),l.jsxs(Ih,{children:[l.jsx(Nh,{src:Tz}),l.jsxs(zh,{children:[l.jsx(Yh,{children:"积极主动"}),l.jsx(Hh,{children:"遇到问题主动踏出第一步,做先行者而不是追随者。"})]})]})]})]}),l.jsx(Wz,{src:Oz}),l.jsx(Gz,{src:Ow}),l.jsx(Kz,{src:Ow}),l.jsx(Xz,{src:Rz})]})}),qz="/zh-cn/assets/public-ebe954c4.svg",Zz="/zh-cn/assets/mail-63c82f9f.svg",Jz="/zh-cn/assets/wechat-c8587d4a.svg",eY="/zh-cn/assets/bilibili-b4f04177.svg",tY="/zh-cn/assets/zhihu-6dedfed7.svg",rY="/zh-cn/assets/wechat-public-qrcode1-2f1a7fe8.png",nY="/zh-cn/assets/email-qrcode1-86dcc594.png",iY="/zh-cn/assets/wechat-qrcode1-72234ee7.png",oY="/zh-cn/assets/bilibili-qrcode1-27289e6d.png",sY="/zh-cn/assets/zhihu-qrcode1-6f12e2dc.png",{Heading:aY,Paragraph:lY}=Pe,{CNHead4:cY,CNTitleMedium:uY}=aY,{CNBodySmall:dY}=lY,fY=f.section` background: #f7f7f9; -`,uY=f.div` +`,hY=f.div` max-width: 1440px; margin-inline: auto; padding: 1rem 1.64rem 1.94rem; -`,dY=f(sY)` +`,mY=f(cY)` padding-bottom: 1.54rem; color: ${e=>e.theme.themeDark02}; text-align: center; -`,fY=f.div` +`,pY=f.div` display: grid; grid-template-columns: repeat(5, 1fr); grid-template-rows: repeat(1, 1fr); justify-items: center; -`,hY=f.div` +`,gY=f.div` display: flex; flex-direction: column; align-items: center; width: 100%; -`,mY=f.div` +`,vY=f.div` width: 100%; margin-bottom: 0.31rem; padding-top: calc(1.63rem - 1.54rem); @@ -1945,26 +1957,26 @@ Error generating stack: `+o.message+` &.icon:last-of-type { border: none; } -`,pY=f.img` +`,yY=f.img` display: block; margin-inline: auto; margin-bottom: 0.13rem; width: 0.9rem; height: 0.9rem; -`,gY=f(aY)` +`,wY=f(uY)` text-align: center; -`,vY=f.img` +`,xY=f.img` width: 1.6rem; padding-bottom: 0.16rem; display: block; -`,yY=f(lY)``,wY=[{title:"公众号",icon:Kz,qrCode:Jz,text:"达坦科技DatenLord"},{title:"邮箱",icon:Xz,qrCode:eY,text:"info@datenlord.com"},{title:"微信",icon:Qz,qrCode:tY,text:"DatenLord小助手"},{title:"B站",icon:qz,qrCode:rY,text:"达坦科技DatenLord"},{title:"知乎",icon:Zz,qrCode:nY,text:"达坦科技DatenLord"}],Db=()=>l.jsx(cY,{id:"contact-us",children:l.jsxs(uY,{children:[l.jsx(dY,{children:"联系我们"}),l.jsx(fY,{children:wY.map(({title:e,icon:t,qrCode:r,text:n},i)=>l.jsxs(hY,{children:[l.jsxs(mY,{className:"icon",children:[l.jsx(pY,{src:t}),l.jsx(gY,{children:e})]}),r&&l.jsx(vY,{src:r}),l.jsx(yY,{children:n})]},i))})]})}),jb="/zh-cn/assets/cover-ab5c0f66.png",Pw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:jb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(bz,{}),l.jsx(Gz,{}),l.jsx(Db,{})]})},xY="/zh-cn/assets/card-bg1-242750c8.png",_Y="/zh-cn/assets/card-bg2-603ed811.png",SY="/zh-cn/assets/card-bg3-14a8311e.png",{Heading:bY,Paragraph:kY}=Pe,{CNHead5S:CY,CNHead4:DY}=bY,{CNBodyLarge:jY}=kY,EY=f.section` +`,_Y=f(dY)``,SY=[{title:"公众号",icon:qz,qrCode:rY,text:"达坦科技DatenLord"},{title:"邮箱",icon:Zz,qrCode:nY,text:"info@datenlord.com"},{title:"微信",icon:Jz,qrCode:iY,text:"DatenLord小助手"},{title:"B站",icon:eY,qrCode:oY,text:"达坦科技DatenLord"},{title:"知乎",icon:tY,qrCode:sY,text:"达坦科技DatenLord"}],Db=()=>l.jsx(fY,{id:"contact-us",children:l.jsxs(hY,{children:[l.jsx(mY,{children:"联系我们"}),l.jsx(pY,{children:SY.map(({title:e,icon:t,qrCode:r,text:n},i)=>l.jsxs(gY,{children:[l.jsxs(vY,{className:"icon",children:[l.jsx(yY,{src:t}),l.jsx(wY,{children:e})]}),r&&l.jsx(xY,{src:r}),l.jsx(_Y,{children:n})]},i))})]})}),jb="/zh-cn/assets/cover-ab5c0f66.png",Pw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:jb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(Dz,{}),l.jsx(Qz,{}),l.jsx(Db,{})]})},bY="/zh-cn/assets/card-bg1-242750c8.png",kY="/zh-cn/assets/card-bg2-603ed811.png",CY="/zh-cn/assets/card-bg3-14a8311e.png",{Heading:DY,Paragraph:jY}=Pe,{CNHead5S:EY,CNHead4:AY}=DY,{CNBodyLarge:TY}=jY,RY=f.section` padding-bottom: 0.63rem; -`,AY=f(CY)``,TY=f.div` +`,OY=f(EY)``,PY=f.div` display: grid; grid-template-columns: repeat(3, 1fr); grid-template-rows: repeat(1, 1fr); grid-gap: 0.23rem; -`,RY=f.div` +`,MY=f.div` padding-top: 0.79rem; padding-bottom: 0.9rem; padding-inline: 0.25rem; @@ -1974,11 +1986,11 @@ Error generating stack: `+o.message+` background: #00000015; background-image: url(${e=>e.bg}); background-size: cover; -`,OY=f(DY)` +`,LY=f(AY)` padding-bottom: 0.51rem; -`,PY=f(jY)``,MY=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:xY},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:_Y},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:SY}],LY=()=>l.jsxs(EY,{children:[l.jsx(AY,{style:{paddingBottom:".63rem"},children:"为什么选择达坦科技?"}),l.jsx(TY,{children:MY.map(({title:e,text:t,bg:r},n)=>l.jsxs(RY,{bg:r,children:[l.jsx(OY,{children:e}),l.jsx(PY,{children:t})]},n))})]}),{Heading:IY,Paragraph:NY}=Pe,{CNHead5S:zY}=IY,{CNBodyLarge:YY}=NY,HY=f.section` +`,IY=f(TY)``,NY=[{title:"创造性工作",text:"在DatenLord,你将有机会与一群才华横溢、积极进取的人一起创造性且高效率地工作。",bg:bY},{title:"归属感",text:"DatenLord重视社区文化不仅仅局限于开源社区,我们也希望我们的员工在这里有一种包容感和归属感。",bg:kY},{title:"远程工作",text:"DatenLord专注于研究和开发分布式存储系统,我们是一个分布式的团队,大多数成员都可以远程工作。",bg:CY}],zY=()=>l.jsxs(RY,{children:[l.jsx(OY,{style:{paddingBottom:".63rem"},children:"为什么选择达坦科技?"}),l.jsx(PY,{children:NY.map(({title:e,text:t,bg:r},n)=>l.jsxs(MY,{bg:r,children:[l.jsx(LY,{children:e}),l.jsx(IY,{children:t})]},n))})]}),{Heading:YY,Paragraph:HY}=Pe,{CNHead5S:VY}=YY,{CNBodyLarge:FY}=HY,UY=f.section` padding-bottom: 0.63rem; -`,FY=f(zY)``,VY=f.div` +`,$Y=f(VY)``,BY=f.div` display: flex; flex-direction: column; padding-top: 0.94rem; @@ -1989,12 +2001,12 @@ Error generating stack: `+o.message+` &:last-child { padding-bottom: 0; } -`,of=f(YY)` +`,of=f(FY)` border-radius: 50vh; padding-block: 0.16rem; padding-inline: 0.34rem; white-space: nowrap; -`,UY=f(of)` +`,WY=f(of)` color: #fff; background: ${e=>e.theme.secondary08}; box-shadow: 0px 4px 20px 0px rgba(251, 170, 48, 0.51); @@ -2002,65 +2014,65 @@ Error generating stack: `+o.message+` color: #2e2f33; background: ${e=>e.theme.white00}; box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); -`,Fg=f(of)` +`,Vg=f(of)` color: ${e=>e.theme.white00}; background: ${e=>e.theme.secondary01}; box-shadow: 0px 4px 20px 0px rgba(54, 84, 255, 0.45); -`,$Y=f(of)` +`,GY=f(of)` color: #2e2f33; background: ${e=>e.theme.secondary02}; box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.11); -`,BY=f(UY)` +`,KY=f(WY)` transform: translateX(calc(4.81rem - 2.03rem)); -`,WY=f(Eb)` +`,XY=f(Eb)` transform: translateY(calc(-0.46rem + 0.3rem)); -`,GY=f(Fg)` +`,QY=f(Vg)` transform: translateX(calc(0.99rem)); -`,KY=f($Y)` +`,qY=f(GY)` transform: translateX(calc(3.7rem - 2.03rem)); -`,XY=f(Fg)` +`,ZY=f(Vg)` transform: translateX(calc(3.1rem - 2.03rem)); -`,QY=f(Fg)` +`,JY=f(Vg)` transform: translate(3.31rem, calc(-0.43rem + 0.13rem)); -`,qY=f(Eb)` +`,eH=f(Eb)` transform: translateX(calc(6.56rem - 2.03rem)); -`,ZY=()=>l.jsxs(HY,{children:[l.jsx(FY,{children:"我们在寻找什么样的人才?"}),l.jsxs(VY,{children:[l.jsx(ba,{children:l.jsx(BY,{children:"对行业内的最新技术发展保持敏锐的洞察力"})}),l.jsxs(ba,{style:{paddingBottom:"0.27rem"},children:[l.jsx(WY,{children:"对于以创新的方式做有意义的事情饱含热情"}),l.jsx(GY,{children:"具有好奇心,养成良好的学习习惯和方法"})]}),l.jsx(ba,{style:{paddingBottom:"0.43rem"},children:l.jsx(KY,{children:"对于以创新的方式做有意义的事情饱含热情"})}),l.jsxs(ba,{style:{paddingBottom:"0.14rem"},children:[l.jsx(XY,{children:"始终以终为始"}),l.jsx(QY,{children:"热衷于开放且有意识地分享知识"})]}),l.jsx(ba,{children:l.jsx(qY,{children:"坦率而直接地进行沟通"})})]})]}),JY="/zh-cn/assets/react-718251fb.svg",{Heading:eH}=Pe,{CNHead5S:tH,CNTitleLarge:rH}=eH,nH=f.section` +`,tH=()=>l.jsxs(UY,{children:[l.jsx($Y,{children:"我们在寻找什么样的人才?"}),l.jsxs(BY,{children:[l.jsx(ba,{children:l.jsx(KY,{children:"对行业内的最新技术发展保持敏锐的洞察力"})}),l.jsxs(ba,{style:{paddingBottom:"0.27rem"},children:[l.jsx(XY,{children:"对于以创新的方式做有意义的事情饱含热情"}),l.jsx(QY,{children:"具有好奇心,养成良好的学习习惯和方法"})]}),l.jsx(ba,{style:{paddingBottom:"0.43rem"},children:l.jsx(qY,{children:"对于以创新的方式做有意义的事情饱含热情"})}),l.jsxs(ba,{style:{paddingBottom:"0.14rem"},children:[l.jsx(ZY,{children:"始终以终为始"}),l.jsx(JY,{children:"热衷于开放且有意识地分享知识"})]}),l.jsx(ba,{children:l.jsx(eH,{children:"坦率而直接地进行沟通"})})]})]}),rH="/zh-cn/assets/react-718251fb.svg",{Heading:nH}=Pe,{CNHead5S:iH,CNTitleLarge:oH}=nH,sH=f.section` padding-bottom: 1.83rem; -`,iH=f(tH)``,oH=f.div` +`,aH=f(iH)``,lH=f.div` display: flex; justify-content: center; padding-top: 1.67rem; padding-inline: 0.32rem; `,Mw=f.div` width: calc(2.42rem + 0.08rem + 0.12rem); -`,Ab=f(rH)` +`,Ab=f(oH)` padding-left: 0.08rem; color: ${e=>e.theme.themeDark02}; `,Lw=f(Ab)` border-left: 0.12rem solid ${e=>e.theme.secondary08}; `,Iw=f(Ab)` border-left: 0.12rem solid ${e=>e.theme.secondary07}; -`,sH=f.img` +`,cH=f.img` padding-inline: 0.24rem; width: 4.55rem; -`,aH=()=>l.jsxs(nH,{children:[l.jsx(iH,{children:"我们能提供什么?"}),l.jsxs(oH,{children:[l.jsxs(Mw,{children:[l.jsx(Lw,{style:{marginTop:"0.64rem"},children:"灵活的工作内容,艰巨挑战,激发创新"}),l.jsx(Iw,{style:{marginTop:"1.28rem"},children:"每年可申请长达2周的学习假期,自由选择充电课题"})]}),l.jsx(sH,{src:JY}),l.jsxs(Mw,{children:[l.jsx(Iw,{style:{marginTop:"0.64rem"},children:"丰富的软性素质及专业技能培训"}),l.jsx(Lw,{style:{marginTop:"1.28rem"},children:"诸多行业交流和展现自我的机会"})]})]})]}),Tb="/zh-cn/assets/avatar-icon-b12a4de6.svg",lH="/zh-cn/assets/image-534e9e5c.png",{Heading:cH,Paragraph:uH}=Pe,{CNHead5S:dH,CNTitleLarge:Rb,CNTitleMedium:fH}=cH,{CNBodyMedium:Pl,CNMarkMedium:hH}=uH,mH=[{title:"Rust分布式存储开发(远程实习)",avatar:"",text:"参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:",items:["分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"],url:"/job-description/rust-distributed-storage-development"},{title:"Rust高性能网络系统开发(远程实习)",avatar:"",text:"参与研发高性能网络系统开发,涉及的工作包括但不限于:",items:["网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"],url:"/job-description/rust-high-performance-web-systems-development"},{title:"AI平台研发 (远程实习)",avatar:"",items:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"],url:"/job-description/ai-platform-development"},{title:"FPGA开发(远程实习)",avatar:"",items:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","参与SoC集成设计与验证;","撰写相关设计文档。"],url:"/job-description/fpga-development"},{title:"软硬件联合研发(远程实习)",avatar:"",text:"参与高性能存储SoC芯片的软硬件开发:",items:["负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"],url:"/job-description/joint-research-and-development-of-hardware-and-software"},{title:"数字IC前端设计(远程实习)",avatar:"",text:"参与高性能存储SoC芯片开发:",items:["负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现; ","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"],url:"/job-description/digital-ic-front-end-design"}],pH=f.section``,gH=f(dH)``,vH=f.div` +`,uH=()=>l.jsxs(sH,{children:[l.jsx(aH,{children:"我们能提供什么?"}),l.jsxs(lH,{children:[l.jsxs(Mw,{children:[l.jsx(Lw,{style:{marginTop:"0.64rem"},children:"灵活的工作内容,艰巨挑战,激发创新"}),l.jsx(Iw,{style:{marginTop:"1.28rem"},children:"每年可申请长达2周的学习假期,自由选择充电课题"})]}),l.jsx(cH,{src:rH}),l.jsxs(Mw,{children:[l.jsx(Iw,{style:{marginTop:"0.64rem"},children:"丰富的软性素质及专业技能培训"}),l.jsx(Lw,{style:{marginTop:"1.28rem"},children:"诸多行业交流和展现自我的机会"})]})]})]}),Tb="/zh-cn/assets/avatar-icon-b12a4de6.svg",dH="/zh-cn/assets/image-534e9e5c.png",{Heading:fH,Paragraph:hH}=Pe,{CNHead5S:mH,CNTitleLarge:Rb,CNTitleMedium:pH}=fH,{CNBodyMedium:Pl,CNMarkMedium:gH}=hH,vH=[{title:"Rust分布式存储开发(远程实习)",avatar:"",text:"参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:",items:["分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"],url:"/job-description/rust-distributed-storage-development"},{title:"Rust高性能网络系统开发(远程实习)",avatar:"",text:"参与研发高性能网络系统开发,涉及的工作包括但不限于:",items:["网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"],url:"/job-description/rust-high-performance-web-systems-development"},{title:"AI平台研发 (远程实习)",avatar:"",items:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"],url:"/job-description/ai-platform-development"},{title:"FPGA开发(远程实习)",avatar:"",items:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","参与SoC集成设计与验证;","撰写相关设计文档。"],url:"/job-description/fpga-development"},{title:"软硬件联合研发(远程实习)",avatar:"",text:"参与高性能存储SoC芯片的软硬件开发:",items:["负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"],url:"/job-description/joint-research-and-development-of-hardware-and-software"},{title:"数字IC前端设计(远程实习)",avatar:"",text:"参与高性能存储SoC芯片开发:",items:["负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现; ","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"],url:"/job-description/digital-ic-front-end-design"}],yH=f.section``,wH=f(mH)``,xH=f.div` display: grid; grid-template-rows: repeat(2, 1fr); grid-template-columns: repeat(3, 1fr); grid-gap: 0.58rem 0.32rem; margin-inline: calc(1.48rem - 1.93rem); padding-block: 0.82rem 0; -`,yH=f.div` +`,_H=f.div` padding: 0.24rem; color: ${e=>e.theme.themeDark02}; border: 0.01rem solid #eaebf0; border-radius: 0.05rem; box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); -`,wH=f.div` +`,SH=f.div` display: flex; justify-content: space-between; padding-bottom: 0.24rem; -`,xH=f.div` +`,bH=f.div` display: flex; justify-content: center; align-items: center; @@ -2068,10 +2080,10 @@ Error generating stack: `+o.message+` height: 0.48rem; background: ${e=>e.theme.secondary02}; border-radius: 50%; -`,_H=f.img` +`,kH=f.img` width: 0.32rem; height: 0.32rem; -`,SH=f(hH)` +`,CH=f(gH)` padding: 0.12rem 0.18rem; height: 0.46rem; color: ${e=>e.theme.gray007}; @@ -2079,12 +2091,12 @@ Error generating stack: `+o.message+` border: 0.01rem solid #dae0e6; box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.04); cursor: pointer; -`,bH=f(Rb)` +`,DH=f(Rb)` color: ${e=>e.theme.gray007}; padding-bottom: 0.08rem; -`,kH=f(Pl)``,CH=f(Pl)``,DH=f.ol` +`,jH=f(Pl)``,EH=f(Pl)``,AH=f.ol` padding-left: 0.2rem; -`,jH=f(Pl)``,EH=f.div` +`,TH=f(Pl)``,RH=f.div` display: flex; flex-direction: column; align-items: center; @@ -2122,69 +2134,69 @@ Error generating stack: `+o.message+` height: min-content; `;f.div` width: 46%; -`;f(fH)``;f.ul` +`;f(pH)``;f.ul` padding-block: 0.36rem; list-style-type: none; `;f(Pl)``;f(Pl)``;f.span` color: ${e=>e.theme.secondary01}; -`;const AH=f.img` +`;const OH=f.img` width: 2.44rem; padding-bottom: 0.16rem; -`,TH=f(yn)` +`,PH=f(yn)` color: #fff; -`,RH=()=>{const e=ht();return l.jsxs(pH,{children:[l.jsx(gH,{children:"公开招聘"}),l.jsxs(vH,{children:[mH.map(({title:t,text:r,items:n,url:i},o)=>l.jsxs(yH,{children:[l.jsxs(wH,{children:[l.jsx(xH,{children:l.jsx(_H,{src:Tb})}),l.jsx(SH,{onClick:()=>e(i),children:"岗位详情"})]}),l.jsx(bH,{children:t}),l.jsx(kH,{children:"【岗位职责】"}),r&&l.jsx(CH,{children:r}),l.jsx(DH,{children:n.map((a,c)=>l.jsx(jH,{as:"li",children:a},c))})]},o)),l.jsxs(EH,{children:[l.jsx(AH,{src:lH}),l.jsx(TH,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:OH}=Pe,{CNHead4:PH}=OH,MH=f.section` +`,MH=()=>{const e=ht();return l.jsxs(yH,{children:[l.jsx(wH,{children:"公开招聘"}),l.jsxs(xH,{children:[vH.map(({title:t,text:r,items:n,url:i},o)=>l.jsxs(_H,{children:[l.jsxs(SH,{children:[l.jsx(bH,{children:l.jsx(kH,{src:Tb})}),l.jsx(CH,{onClick:()=>e(i),children:"岗位详情"})]}),l.jsx(DH,{children:t}),l.jsx(jH,{children:"【岗位职责】"}),r&&l.jsx(EH,{children:r}),l.jsx(AH,{children:n.map((a,c)=>l.jsx(TH,{as:"li",children:a},c))})]},o)),l.jsxs(RH,{children:[l.jsx(OH,{src:dH}),l.jsx(PH,{onClick:()=>e("/job-description"),children:"进入招聘岗位详情"})]})]})]})},{Heading:LH}=Pe,{CNHead4:IH}=LH,NH=f.section` background: #fff; -`,LH=f.div` +`,zH=f.div` max-width: 1440px; margin-inline: auto; padding-top: 1rem; padding-bottom: 1.69rem; padding-inline: 1.93rem; -`,IH=f(PH)` +`,YH=f(IH)` padding-bottom: 1.23rem; text-align: center; -`,Nw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:jb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(MH,{id:"join-us",children:l.jsxs(LH,{children:[l.jsx(IH,{children:"加入我们"}),l.jsx(LY,{}),l.jsx(ZY,{}),l.jsx(aH,{}),l.jsx(RH,{})]})}),l.jsx(Db,{})]})},NH="/zh-cn/assets/video-demo-cover-6531bf08.png",jc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",zH="/zh-cn/assets/cover1-0f766121.jpg",YH="/zh-cn/assets/cover2-6c924915.jpg",HH="/zh-cn/assets/cover3-a8cadd7b.jpg",FH="/zh-cn/assets/cover4-da59baaf.jpg",VH="/zh-cn/assets/cover5-55104208.jpg",UH="/zh-cn/assets/cover6-bf6d56c4.jpg",$H="/zh-cn/assets/cover7-461ad08e.jpg",BH="/zh-cn/assets/cover8-18bb5252.jpg",WH="/zh-cn/assets/cover9-0cfe7433.jpg",GH="/zh-cn/assets/cover10-7707f5f7.jpg",KH="/zh-cn/assets/cover11-18bf7e52.jpg",XH="/zh-cn/assets/cover12-2ec52bb9.jpg",QH="/zh-cn/assets/cover13-20980f41.jpg",qH="/zh-cn/assets/cover14-6dff9a13.jpg",ZH="/zh-cn/assets/cover15-f2819b4b.jpg",JH="/zh-cn/assets/cover16-6b3eea77.jpg",eF="/zh-cn/assets/cover17-2d99b802.jpg",tF="/zh-cn/assets/cover19-9503f8ee.jpg",rF="/zh-cn/assets/cover20-a198bfe8.jpg",nF="/zh-cn/assets/cover21-c1808615.jpg",iF="/zh-cn/assets/cover22-a24d3264.jpg",oF="/zh-cn/assets/cover23-91837162.jpg",sF="/zh-cn/assets/cover24-f34d429f.jpg",aF="/zh-cn/assets/cover25-11f1a4dd.jpg",lF="/zh-cn/assets/cover26-574c835d.jpg",cF="/zh-cn/assets/cover27-cab7b800.jpg",uF="/zh-cn/assets/cover28-61988539.jpg",dF="/zh-cn/assets/cover29-cfa296fc.jpg",fF="/zh-cn/assets/cover30-6bc9e17a.jpg",hF="/zh-cn/assets/cover31-de17416a.jpg",mF="/zh-cn/assets/cover32-64d8c4cf.jpg",pF="/zh-cn/assets/cover33-747e46a5.jpg",gF="/zh-cn/assets/cover34-b47433e8.jpg",vF="/zh-cn/assets/cover35-474e265e.jpg",yF="/zh-cn/assets/cover40-e2bf253f.jpg",wF="/zh-cn/assets/cover41-56007738.jpg",xF="/zh-cn/assets/cover42-075bcf74.jpg",_F="/zh-cn/assets/cover43-d1896502.jpg",SF="/zh-cn/assets/cover50-2dc33471.jpg",bF="/zh-cn/assets/cover51-235c2ee6.jpg",kF="/zh-cn/assets/cover52-06cc8093.jpg",CF="/zh-cn/assets/cover53-11208fe4.jpg",DF="/zh-cn/assets/cover54-00d520f8.jpg",jF=[{key:1,image:zH,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:YH,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:HH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:FH,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:VH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:UH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:$H,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:BH,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:WH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:GH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:KH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:XH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:QH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:qH,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:ZH,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:JH,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:eF,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:tF,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:rF,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:nF,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:iF,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:oF,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:sF,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:aF,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:lF,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:cF,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:uF,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:dF,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:fF,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:hF,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:mF,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:pF,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:gF,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:vF,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:yF,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:wF,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:xF,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:_F,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:SF,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:bF,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:kF,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:CF,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:54,image:DF,title:"面向网络测量的可编程交换机优化技术",text:"在本周的前沿技术分享中,我们邀请到了北京大学计算机学院黄群助理教授,来为大家分享面向网络测量的可编程交换机优化技术。",date:"2023.10.20",url:"https://www.bilibili.com/video/BV1i84y1974F/"}],EF="/zh-cn/assets/cover1-42e6189a.jpg",AF="/zh-cn/assets/cover2-af26ed46.jpg",TF="/zh-cn/assets/cover3-9c9d21fa.jpg",RF=[{key:1,image:EF,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:AF,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:TF,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],OF="/zh-cn/assets/cover1-a1358db9.jpg",PF="/zh-cn/assets/cover2-b899ea12.jpg",MF="/zh-cn/assets/cover3-e0bf4798.jpg",LF="/zh-cn/assets/cover4-15b0b4f1.jpg",IF="/zh-cn/assets/cover5-7c4c2482.jpg",NF="/zh-cn/assets/cover6-1c4d5c5f.jpg",zF="/zh-cn/assets/cover7-4f7454c0.jpg",YF="/zh-cn/assets/cover8-7e30c0fc.jpg",HF="/zh-cn/assets/cover9-e8c86c60.jpg",FF="/zh-cn/assets/cover10-bb13b118.jpg",VF="/zh-cn/assets/cover11-c29e9692.jpg",UF="/zh-cn/assets/cover12-6877e246.jpg",$F="/zh-cn/assets/cover13-5a4d97b0.jpg",BF="/zh-cn/assets/cover14-052a8b36.jpg",WF=[{key:7,image:zF,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:YF,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:HF,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:OF,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:PF,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:MF,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:LF,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:IF,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:NF,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:FF,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:VF,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:UF,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:$F,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"},{key:14,image:BF,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"}],GF="/zh-cn/assets/cover1-b9371555.jpg",KF="/zh-cn/assets/cover2-41a903e3.jpg",XF="/zh-cn/assets/cover2-41a903e3.jpg",QF="/zh-cn/assets/cover2-41a903e3.jpg",qF="/zh-cn/assets/cover2-41a903e3.jpg",ZF="/zh-cn/assets/cover2-41a903e3.jpg",JF="/zh-cn/assets/cover2-41a903e3.jpg",eV="/zh-cn/assets/cover2-41a903e3.jpg",tV="/zh-cn/assets/cover2-41a903e3.jpg",rV="/zh-cn/assets/cover13-a69a12b0.jpg",nV="/zh-cn/assets/cover14-3a97e013.jpg",iV="/zh-cn/assets/cover14-3a97e013.jpg",oV="/zh-cn/assets/cover14-3a97e013.jpg",sV="/zh-cn/assets/cover14-3a97e013.jpg",aV="/zh-cn/assets/cover14-3a97e013.jpg",lV="/zh-cn/assets/cover14-3a97e013.jpg",cV="/zh-cn/assets/cover20-c97bc11b.jpg",uV="/zh-cn/assets/cover21-9f52ba13.jpg",dV="/zh-cn/assets/cover22-187b655a.jpg",fV="/zh-cn/assets/cover23-1e515665.jpg",hV="/zh-cn/assets/cover24-020d0c34.jpg",mV="/zh-cn/assets/cover25-cb84d871.jpg",pV="/zh-cn/assets/cover26-7a726e97.jpg",gV="/zh-cn/assets/cover27-401eea81.jpg",vV="/zh-cn/assets/cover28-6ddc6bee.jpg",yV="/zh-cn/assets/cover29-0d2deb11.jpg",wV=[{key:1,image:GF,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:KF,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:XF,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:QF,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:qF,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:ZF,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:JF,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:eV,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:tV,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:rV,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:nV,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:iV,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:oV,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:sV,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:aV,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:lV,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:cV,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:uV,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:dV,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:fV,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:hV,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:mV,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:pV,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:gV,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:vV,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:yV,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:xV,Paragraph:_V}=Pe,{CNHead4:SV,CNTitleLarge:bV}=xV,{CNMarkSmall:kV,CNBodySmall:CV}=_V,Ec=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:jF,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:RF,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:WF,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:wV,recommend:21}]]),DV=f.main``,jV=f.div` +`,Nw=()=>{const{sectionId:e}=Sn();return I.useEffect(()=>{const t=document.querySelector(`#${e}`);t?t==null||t.scrollIntoView():window.scrollTo(0,0)},[e]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:jb,subTitle:"达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络,打造高性能 AI + Cloud 基础设施平台。",children:"公司"}),l.jsx(NH,{id:"join-us",children:l.jsxs(zH,{children:[l.jsx(YH,{children:"加入我们"}),l.jsx(zY,{}),l.jsx(tH,{}),l.jsx(uH,{}),l.jsx(MH,{})]})}),l.jsx(Db,{})]})},HH="/zh-cn/assets/video-demo-cover-6531bf08.png",jc="/zh-cn/assets/arrow-up-right-f6ca128c.svg",VH="/zh-cn/assets/cover1-0f766121.jpg",FH="/zh-cn/assets/cover2-6c924915.jpg",UH="/zh-cn/assets/cover3-a8cadd7b.jpg",$H="/zh-cn/assets/cover4-da59baaf.jpg",BH="/zh-cn/assets/cover5-55104208.jpg",WH="/zh-cn/assets/cover6-bf6d56c4.jpg",GH="/zh-cn/assets/cover7-461ad08e.jpg",KH="/zh-cn/assets/cover8-18bb5252.jpg",XH="/zh-cn/assets/cover9-0cfe7433.jpg",QH="/zh-cn/assets/cover10-7707f5f7.jpg",qH="/zh-cn/assets/cover11-18bf7e52.jpg",ZH="/zh-cn/assets/cover12-2ec52bb9.jpg",JH="/zh-cn/assets/cover13-20980f41.jpg",eV="/zh-cn/assets/cover14-6dff9a13.jpg",tV="/zh-cn/assets/cover15-f2819b4b.jpg",rV="/zh-cn/assets/cover16-6b3eea77.jpg",nV="/zh-cn/assets/cover17-2d99b802.jpg",iV="/zh-cn/assets/cover19-9503f8ee.jpg",oV="/zh-cn/assets/cover20-a198bfe8.jpg",sV="/zh-cn/assets/cover21-c1808615.jpg",aV="/zh-cn/assets/cover22-a24d3264.jpg",lV="/zh-cn/assets/cover23-91837162.jpg",cV="/zh-cn/assets/cover24-f34d429f.jpg",uV="/zh-cn/assets/cover25-11f1a4dd.jpg",dV="/zh-cn/assets/cover26-574c835d.jpg",fV="/zh-cn/assets/cover27-cab7b800.jpg",hV="/zh-cn/assets/cover28-61988539.jpg",mV="/zh-cn/assets/cover29-cfa296fc.jpg",pV="/zh-cn/assets/cover30-6bc9e17a.jpg",gV="/zh-cn/assets/cover31-de17416a.jpg",vV="/zh-cn/assets/cover32-64d8c4cf.jpg",yV="/zh-cn/assets/cover33-747e46a5.jpg",wV="/zh-cn/assets/cover34-b47433e8.jpg",xV="/zh-cn/assets/cover35-474e265e.jpg",_V="/zh-cn/assets/cover40-e2bf253f.jpg",SV="/zh-cn/assets/cover41-56007738.jpg",bV="/zh-cn/assets/cover42-075bcf74.jpg",kV="/zh-cn/assets/cover43-d1896502.jpg",CV="/zh-cn/assets/cover50-2dc33471.jpg",DV="/zh-cn/assets/cover51-235c2ee6.jpg",jV="/zh-cn/assets/cover52-06cc8093.jpg",EV="/zh-cn/assets/cover53-11208fe4.jpg",AV="/zh-cn/assets/cover55-a634f887.jpg",TV=[{key:1,image:VH,title:"Virtio-net相关知识介绍与Rust-for-Linux基本知识",text:"本场workshop由达坦科技李弘宇进行内容分享,主要介绍了Virtio-net相关知识介绍与Rust-for-Linux基本知识。欢迎参加达坦科技DatenLord相关开源项目:https://github.com/datenlord/linux/tree/rust_virtio",date:"2022.08.17",url:"https://www.bilibili.com/video/BV17G4y1a7Bv/"},{key:2,image:FH,title:"roce-sim Workshop分享",text:"本场workshop由达坦科技王恒宇进行内容分享,主要介绍了roce-sim相关知识分享,如果您对这方面有兴趣,欢迎参与达坦科技开源项目:Github链接:https://github.com/datenlord/roce-sim",date:"2022.08.25",url:"https://www.bilibili.com/video/BV1UB4y137Tn/"},{key:3,image:UH,title:"Cocotb Workshop分享",text:"本场workshop由达坦科技DatenLord 翁万正进行内容分享,主要进行了cocotb相关知识介绍。",date:"2022.09.23",url:"https://www.bilibili.com/video/BV19e4y1k7EE/"},{key:4,image:$H,title:"使用Copilot在分布式系统中容忍暂时变慢的节点",text:"本场workshop由达坦科技DatenLord 田野进行内容分享,主要进行了“使用Copilot在分布式系统中容忍暂时变慢的节点“相关知识介绍。",date:"2022.09.30",url:"https://www.bilibili.com/video/BV15e411T7pX/"},{key:5,image:BH,title:"硬件设计的集合方法",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“硬件设计的集合方法”相关知识介绍。",date:"2022.10.09",url:"https://www.bilibili.com/video/BV1FK411Q7JV/"},{key:6,image:WH,title:"VLSI Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了VLSI相关知识介绍。",date:"2022.10.15",url:"https://www.bilibili.com/video/BV1bK411Q7GB/"},{key:7,image:GH,title:"Corumdum介绍",text:"本场workshop由西安电子科技大学 ISN网络与交换团队 硕士研究生李钊进行内容分享,主要进行了Corumdum相关知识介绍。",date:"2022.10.16",url:"https://www.bilibili.com/video/BV1qG41177Pq/"},{key:8,image:KH,title:"可编程交换机:原理与使用",text:"本场workshop由上海交通大学IPADS实验室博士二年级 张汉泽进行内容分享,主要进行了“可编程交换机:原理与使用”相关知识分享。可编程交换机由安装包处理规则的控制面与负责高速包处理的数据面构成,两者由一根PCIe总线相连。控制面支持高级语言编程,而数据面逻辑需要用P4语言编写。在可编程交换机上设计系统主要面临数据面内存有限与P4编程模型受限两大挑战。",date:"2022.10.23",url:"https://www.bilibili.com/video/BV1jm4y1w7w3/"},{key:9,image:XH,title:"形式化验证入门",text:"本场workshop由达坦科技DatenLord王璞进行内容分享,主要进行了形式化验证入门相关知识介绍。",date:"2022.10.26",url:"https://www.bilibili.com/video/BV1DG411L78p/"},{key:10,image:QH,title:"利用RDMA加速FaaS服务",text:"本场workshop由达坦科技DatenLord李弘宇进行内容分享,主要进行了“利用RDMA加速FaaS服务”相关知识介绍。",date:"2022.11.06",url:"https://www.bilibili.com/video/BV1et4y1K7Sw/"},{key:11,image:qH,title:"Rust for Linux",text:"本场workshop由苏宇恒进行内容分享,主要进行了“Rust for Linux”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1G8411a7CE/"},{key:12,image:ZH,title:"Intel用户态中断",text:"本场workshop由韩明聪进行内容分享,主要进行了“Intel用户态中断”相关知识介绍。",date:"2022.11.08",url:"https://www.bilibili.com/video/BV1tG4y1t7Lg/"},{key:13,image:JH,title:"VLSI DSP Sharing",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要进行了“VLSI DSP Intro”相关知识介绍。",date:"2022.11.11",url:"https://www.bilibili.com/video/BV18P4y1y7iP/"},{key:14,image:eV,title:"DSP Sharing Part2",text:"本场workshop由达坦科技DatenLord李天瑞进行内容分享,主要就DSP相关知识进行第二次workshop分享",date:"2022.11.12",url:"https://www.bilibili.com/video/BV1bM411k7YP/"},{key:15,image:tV,title:"eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架",text:"本场workshop由浙江大学学生/eunomia-bpf 开发者 郑昱笙进行内容分享,主要内容围绕“eunomia-bpf: 结合 wasm 的 ebpf 轻量级开发框架”相关知识。",date:"2022.11.20",url:"https://www.bilibili.com/video/BV1u84y1C7pQ/"},{key:16,image:rV,title:"RDMA网络拥塞管理架构",text:"本场workshop由北京邮电大学网络与交换国家重点实验室、计算机学院,副研究员、博导:张乙然进行内容分享,主要内容围绕“RDMA网络拥塞管理架构”进行知识介绍。",date:"2022.11.27",url:"https://www.bilibili.com/video/BV1Ve4y1g7gx/"},{key:17,image:nV,title:"使用RDMA加速服务器无感知计算容器启动",text:"本场workshop由上海交通大学助理教授魏星达进行分享,主要内容围绕“使用RDMA加速服务器无感知计算容器启动”进行知识介绍。",date:"2022.12.04",url:"https://www.bilibili.com/video/BV1qG4y1G784/"},{key:19,image:iV,title:"基于智能网卡的数据处理系统",text:"本场workshop由浙江大学百人计划研究员 王则可进行分享,主要内容为“基于智能网卡的数据处理系统”介绍。",date:"2022.12.18",url:"https://www.bilibili.com/video/BV1Eg411J7fJ/"},{key:20,image:oV,title:"异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构",text:"本场workshop由何安平副教授进行分享,主要内容为“异步事件驱动的电路机制 & 基于RISC-V的全异步超标量CPU体系结构”介绍。",date:"2022.12.25",url:"https://www.bilibili.com/video/BV1sA411D7on/"},{key:21,image:sV,title:"使用 TLA+ 为分布式算法验证正确性",text:"本场workshop由达坦科技DatenLord田野进行分享,主要内容为“使用 TLA+ 为分布式算法验证正确性”介绍。",date:"2023.01.09",url:"https://www.bilibili.com/video/BV1pG4y1y7an/"},{key:22,image:aV,title:"喷泉码技术简介",text:"本场workshop由兰州大学信息科学与工程学院副教授、通信工程专业系主任袁磊 进行分享,主要内容为“喷泉码技术简介”介绍。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1SM411b77k/"},{key:23,image:lV,title:"数据库隔离级别及MVCC",text:"本场workshop由达坦科技DatenLord施继成进行分享,主要内容为“数据库隔离级别及MVCC”介绍。",date:"2023.01.29",url:"https://www.bilibili.com/video/BV1sR4y1b7Cu/"},{key:24,image:cV,title:"互联网传输协议优化研究",text:"本场workshop由中国人民大学副教授李彤教授进行分享,主要内容为“互联网传输协议优化研究”介绍。",date:"2023.02.06",url:"https://www.bilibili.com/video/BV1X84y157vL/"},{key:25,image:uV,title:"高性能RDMA网络协议栈",text:"高性能RDMA网络协议栈是RDMA高性能网络的核心组成部分之一,它提供了支持RDMA技术的网络协议和驱动程序。在本周的前沿科技分享中,我们邀请到了湖南大学信息科学与工程学院的陈果教授来给我们分享高性能RDMA网络协议栈的话题。",date:"2023.02.28",url:"https://www.bilibili.com/video/BV1Y24y1n7Dk/"},{key:26,image:dV,title:"GPU抢占式任务调度",text:"GPU编程可以大幅提升计算速度和效率,从而使得许多计算任务得以在合理时间内完成。随着GPU硬件技术的发展和大规模数据处理需求的增加,GPU编程的应用范围不断扩大。在本周的前沿科技分享中,我们邀请到了上海交通大学并行与分布式研究所的韩明聪博士来给我们分享GPU抢占式任务调度。",date:"2023.03.05",url:"https://www.bilibili.com/video/BV1cY4y1y7ND/"},{key:27,image:fV,title:"聊聊RaptorQ纠错码",text:"喷泉码具有极高的纠错能力,且具有低延迟、地复杂度、高效率等优点,使其在冷存储、分布式存储、无线通信等领域得到广泛应用。达坦科技致力于软硬件融合的解决方案,喷泉码的高效实现在硬件上,作为公司长期的技术储备,在本周的前沿科技分享中,达坦科技的联合创始人兼CTO施继成将为大家分享聊聊 RaptorQ 纠错码 。",date:"2023.03.15",url:"https://www.bilibili.com/video/BV1wL411C7DL/"},{key:28,image:hV,title:"Buddy Compiler 简介和愿景",text:"在本次分享中,中国科学院软件研究所博士生张洪滨将介绍Buddy Compiler 编译流程、协同设计、硬件支持。Buddy Compiler 是领域特定的编译器框架,致力于打造基于 MLIR 和 RISC-V 的软硬件协同设计生态。其目标是实现从 DSL 到 DSA 的编译流程和协同设计,愿景是让领域特定的协同设计不再困难。",date:"2023.03.21",url:"https://www.bilibili.com/video/BV1YT41167GB/"},{key:29,image:mV,title:"新一代计算架构:超异构计算",text:"AGI带来的变化之一是算力将进一步从CPU转到GPU,在本周的前沿技术分享中,我们邀请到了上海矩向科技创始人兼CEO黄朝波为大家分享新一代计算架构:超异构计算。",date:"2023.04.04",url:"https://www.bilibili.com/video/BV1Rm4y1q7Dx/"},{key:30,image:pV,title:"通过Chainsaw设计DSP电路",text:"DSP在数据压缩、编码和加密方面都发挥了重要的作用;SpinalHDL具有更高的抽象层次和更强的表达能力,可以大大简化DSP电路设计的复杂度和提高开发效率;而Chainsaw框架可以在不同的FPGA平台上运行,提高了设计的灵活性和可移植性。在本周的前沿技术分享中,我们邀请到了中山大学在读博士李天瑞为大家分享通过Chainsaw设计DSP电路。",date:"2023.04.18",url:"https://www.bilibili.com/video/BV14o4y1j7bH/"},{key:31,image:gV,title:"Something About Cache Security",text:"在本周的前沿技术分享中,我们邀请到了浙江大学在读硕士研究生缪晨露为大家分享她在MICRO和HPCA上发表的两篇论文的精华,演讲主题是Something About Cache Security。",date:"2023.04.25",url:"https://www.bilibili.com/video/BV1p24y1F7fN/"},{key:32,image:vV,title:"Rust嵌入式开发生态介绍及入门",text:"在本周的前沿技术分享中,我们邀请到了一位爱好硬件的软件工程师米明恒,来为大家分享Rust嵌入式开发生态介绍及入门。",date:"2023.05.04",url:"https://www.bilibili.com/video/BV1J24y1T7EH/"},{key:33,image:yV,title:"RDMA赋能数据中心/超算中心间远程互联",text:"在本周的前沿技术分享中,我们邀请到了南京大学田臣教授,来为大家分享RDMA赋能数据中心/超算中心间远程互联。",date:"2023.06.04",url:"https://www.bilibili.com/video/BV1cz4y1B7cx/"},{key:34,image:wV,title:"Paper Reading: DPU任务卸载",text:"达坦科技一直在探索用硬件加速做分布式跨云存储,在本周的前沿技术分享中,我们邀请到了中南大学在读博士生卢军,来为大家分享DPU任务卸载的相关研究。",date:"2023.06.17",url:"https://www.bilibili.com/video/BV1R14y1S79T/"},{key:35,image:xV,title:"Rust在物理引擎研发中的应用",text:"在本周的前沿技术分享中,我们邀请到了Motphys CEO崔汉青,来为大家分享Rust在物理引擎研发中的应用。",date:"2023.06.27",url:"https://b23.tv/BZuSvyW"},{key:40,image:_V,title:"基于BSV的RTL仿真加速设计研究",text:"BSV的仿真加速可以提升硬件开发调试的效率。在本周的前沿技术分享中,我们邀请到了梁之杰,来为大家分享基于BSV的RTL仿真加速设计研究。",date:"2023.07.09",url:"https://www.bilibili.com/video/BV1ou411L7Yy/"},{key:41,image:SV,title:"RDMA网络的系统测试方案",text:"在本周的前沿技术分享中,我们邀请到了孔心皓,来为大家分享RDMA 网络的系统测试方案。",date:"2023.07.16",url:"https://www.bilibili.com/video/BV1tz4y147rw/"},{key:42,image:bV,title:"RapidWright技术分享会",text:"在本周的前沿技术分享中,我们邀请到了西南交通大学邸志雄副教授和他的学生向瀚章,来为大家分享开源FPGA设计工具RapidWright技术。",date:"2023.07.28",url:"https://www.bilibili.com/video/BV14z4y1x7a8/"},{key:43,image:kV,title:"基于Karmada实现Kubernetes应用跨集群故障转移",text:"在本周的前沿技术分享中,我们邀请到了开源爱好者,云兴科技软件研发工程师梁远鹏,来为大家分享基于Karmada实现Kubernetes应用跨集群故障转移。",date:"2023.08.01",url:"https://www.bilibili.com/video/BV1rN411Y7aZ/"},{key:50,image:CV,title:"大模型训练和基础设施",text:"在本周的前沿技术分享中,我们邀请到了范一呈,来为大家分享大模型训练和基础设施。",date:"2023.09.01",url:"https://www.bilibili.com/video/BV1ZN4y1R7HP/"},{key:51,image:DV,title:"RustBelt与Rust形式化方法",text:"在本周的前沿技术分享中,我们邀请到了王俊吉,来为大家分享RustBelt与Rust形式化方法。",date:"2023.09.04",url:"https://www.bilibili.com/video/BV1Vw411D7rT/"},{key:52,image:jV,title:"网络的智能该放在哪里:网卡、交换机还是xPU",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:53,image:EV,title:"以ARM为镜的RISC-V",text:"在本周的前沿技术分享中,我们邀请到了Logenic AI联合创始人、前华为天才少年李博杰,来为大家分享网络的智能该放在哪里:网卡、交换机还是xPU。",date:"2023.09.25",url:"https://www.bilibili.com/video/BV1Kw411Y7Cj/"},{key:55,image:AV,title:"让大模型在场景中真正落地的产品形态、技术堆栈、交付服务",text:"达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台,积极推动AI应用的落地。达坦科技通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。在本周的前沿技术分享中,我们邀请到了猴子无限创始人兼CEO尹伯昊,来为大家分享让大模型在场景中真正落地的产品形态、技术堆栈、交付服务。",date:"2024.03.18",url:"https://www.bilibili.com/video/BV1KJ4m187gS/"}],RV="/zh-cn/assets/cover1-42e6189a.jpg",OV="/zh-cn/assets/cover2-af26ed46.jpg",PV="/zh-cn/assets/cover3-9c9d21fa.jpg",MV=[{key:1,image:RV,title:"Xline-跨数据中心一致性的元数据管理",text:"天空计算是云平台上的一层,其目标是打通彼此孤立的云,将分布式系统从数据中心范围扩展到全球范围。Xline是一款开源分布式KV存储系统,基于Curp共识算法实现,旨在提供跨云元数据管理的功能。相比于传统共识协议Raft或Paxos,Curp在天空计算的场景中有着更好的性能表现。本次分享将聚焦于共识算法,从天空计算的背景和挑战出发,介绍Curp共识算法,以及Revision机制与Curp无序性语义之间的冲突,最后,简述下Xline未来的优化方向。欢迎了解更多关于Xline的信息:Https://github.com/datenlord/Xline",date:"2023.02.09",url:"https://www.bilibili.com/video/BV1XY411q7X8/"},{key:2,image:OV,title:"源码解读:Xline Curp共识协议的设计与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.04.30",url:"https://www.bilibili.com/video/BV1dL411h7YK/"},{key:3,image:PV,title:"Xline的Lease机制与实现",text:"传统单数据中心解决方案无法满足跨数据中心的场景对性能和一致性的需求。DatenLord推出开源分布式KV存储Xline,针对多数据中心场景,可以实现数据的高性能跨云、跨数据中心共享访问,并且保证数据的一致性。",date:"2023.06.09",url:"https://www.bilibili.com/video/BV1FX4y1h7X5/"}],LV="/zh-cn/assets/cover1-a1358db9.jpg",IV="/zh-cn/assets/cover2-b899ea12.jpg",NV="/zh-cn/assets/cover3-e0bf4798.jpg",zV="/zh-cn/assets/cover4-15b0b4f1.jpg",YV="/zh-cn/assets/cover5-7c4c2482.jpg",HV="/zh-cn/assets/cover6-1c4d5c5f.jpg",VV="/zh-cn/assets/cover7-4f7454c0.jpg",FV="/zh-cn/assets/cover8-7e30c0fc.jpg",UV="/zh-cn/assets/cover9-e8c86c60.jpg",$V="/zh-cn/assets/cover10-bb13b118.jpg",BV="/zh-cn/assets/cover11-c29e9692.jpg",WV="/zh-cn/assets/cover12-6877e246.jpg",GV="/zh-cn/assets/cover13-5a4d97b0.jpg",KV="/zh-cn/assets/cover14-052a8b36.jpg",XV=[{key:7,image:VV,title:"2022年Rust开发者大会Workshop One:用Rust实现RDMA高性能编程",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是本场workshop的第一部分,将为大家介绍如何用Rust实现RDMA高性能编程。",date:"2022.08.03",url:"https://www.bilibili.com/video/BV13e4y1D7Ch/"},{key:8,image:FV,title:"2022年Rust开发者大会Workshop Two:Async RDMA",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题workshop。这是第二部分workshop,将为大家介绍Async RDMA。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:9,image:UV,title:"2022年Rust开发者大会Workshop Three:Workshop动手实验环节",text:"2022年7月31日,北京达坦科技有限公司获邀参加Rust China大会,并做公司专题Workshop。这是本场Worshop的第三个部分:workshop动手环节 方便大家体验用Rust构建RDMA应用。",date:"2022.08.04",url:"https://www.bilibili.com/video/BV1oN4y1V7Hn/"},{key:1,image:LV,title:"Rust China Hackathon2022空中路演",text:"由Rust中文社区举办的题为「Rust For Fun」的首届Rust China Hackathon已经顺利完赛。达坦科技作为本届Hackathon的协办方,赞助参与本次企业组赛道。最终获得优胜奖的两支队伍在线上了举办一场空中路演。分享了:他们是如何思考拆解赛题的?在着手设计时碰到哪些难点和挑战?以及最终提交的代码设计思路和亮点。欢迎对Concurrent Indexing感兴趣的伙伴观看本条视频。",date:"2023.01.15",url:"https://www.bilibili.com/video/BV1xY41197Za/"},{key:2,image:IV,title:"4.8 Beijing Rust Meetup|张汉东《理解 Unsafe Rust》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由《Rust 编程之道》作者、Rust 中文社区布道者张汉东老师进行,主题为《理解 Unsafe Rust》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1c24y1A7aK/"},{key:3,image:NV,title:"4.8 Beijing Rust Meetup|冯洋《RUFES》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场由南京大学计算机科学与技术系助理研究员冯洋老师进行《基于实际场景应用分析的Rust库模糊测试技术报告》的演讲分享。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Qo4y1n7tS/"},{key:4,image:zV,title:"4.8 Beijing Rust Meetup|施继成《Rust for Linux 6.2》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:5,image:YV,title:"4.8 Beijing Rust Meetup|叶天星《用Rust实现Git传输协议、Git对象解析和数据库存储》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Bs4y117Ze/"},{key:6,image:HV,title:"4.8 Beijing Rust Meetup|茌海《Monoio:一个基于 io-uring 的 Rust Runtime》",text:"2023年4月8日,达坦科技联合南京大学、CloudWeGo、华为等技术专家成功举办了题为Rust 💡X的meetup。本场分享由达坦科技联合创始人兼CTO施继成进行,演讲主题是《Rust for Linux 6.2》。",date:"2023.04.12",url:"https://www.bilibili.com/video/BV1Rh411M7EP/"},{key:10,image:$V,title:"如何用Rust写分布式系统",text:"分享会介绍分布式KV Store (Xline) 整体的组成,以及不同组件之间如何去交互。在广域网下的分布式系统如何高效地达成共识,以及分布式系统如何实现容错。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Hs4y1r7dD/"},{key:11,image:BV,title:"Building microsecond-scale system with modern networking in Rust",text:"随着新型网络技术,如RDMA的普及,现代分布式应用的延迟降到了毫秒甚至微秒级别。这为构建系统软件带来了新的挑战。Rust的zero-cost抽象及内存管理能力能够为构建新型分布式应用带来新的机遇。我将分享利用Rust在用户态及内核态构建新型系统软件的相关经验,包括如何利用Rust抽象RDMA硬件的底层抽象及如何在内核构建一个毫秒级的容器启动机制。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV1Zo4y1P7Sg/"},{key:12,image:WV,title:"30分钟体验Rust for Linux内核模块开发",text:"本主题会提供构建好的docker开发环境,在30分钟内演示如何使用r4l开发一个简易内核模块,并介绍目前r4l的发展现状。可以自备好电脑现场体验。",date:"2023.06.24",url:"https://www.bilibili.com/video/BV12j411U78o/"},{key:13,image:GV,title:"DatenLord 2023 Hackathon赛题宣讲会",text:"达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台,在此正式向您发出邀约!本次大赛主题为 Explore the Possibilities 赛题深刻有趣,奖品丰厚多样,借此机会您不仅可以尽情施展才华、与来自全国各地优秀的青年才俊们同台PK,更将有机会与优秀的评委教师对话交流。Clock is Ticking!无需犹豫,行动起来吧!",date:"2023.11.25",url:"https://www.bilibili.com/video/BV1su4y157iB/"},{key:14,image:KV,title:"DatenLord Hackathon2023空中路演",text:"DatenLord Hackathon 2023已经顺利完赛。达坦科技基于其跨云分布式文件系统DatenLord项目,结合AI大模型时代背景,搭建了擂台。我们邀请参赛者为DatenLord的极端场景设计并实现缓存 p2p 传输和同步模块。本次空中路演邀请了最终获得优胜奖的两支队伍进行思路分享,包括他们的解题思路,碰到的难点和挑战,以及如何应对的方法和设计亮点。欢迎感兴趣的大家进行观看,有问题也欢迎在评论区进行交流~~不要忘记一键三连哦~~",date:"2024.01.07",url:"https://www.bilibili.com/video/BV1ic411t7Nf/"}],QV="/zh-cn/assets/cover1-b9371555.jpg",qV="/zh-cn/assets/cover2-41a903e3.jpg",ZV="/zh-cn/assets/cover2-41a903e3.jpg",JV="/zh-cn/assets/cover2-41a903e3.jpg",eF="/zh-cn/assets/cover2-41a903e3.jpg",tF="/zh-cn/assets/cover2-41a903e3.jpg",rF="/zh-cn/assets/cover2-41a903e3.jpg",nF="/zh-cn/assets/cover2-41a903e3.jpg",iF="/zh-cn/assets/cover2-41a903e3.jpg",oF="/zh-cn/assets/cover13-a69a12b0.jpg",sF="/zh-cn/assets/cover14-3a97e013.jpg",aF="/zh-cn/assets/cover14-3a97e013.jpg",lF="/zh-cn/assets/cover14-3a97e013.jpg",cF="/zh-cn/assets/cover14-3a97e013.jpg",uF="/zh-cn/assets/cover14-3a97e013.jpg",dF="/zh-cn/assets/cover14-3a97e013.jpg",fF="/zh-cn/assets/cover20-c97bc11b.jpg",hF="/zh-cn/assets/cover21-9f52ba13.jpg",mF="/zh-cn/assets/cover22-187b655a.jpg",pF="/zh-cn/assets/cover23-1e515665.jpg",gF="/zh-cn/assets/cover24-020d0c34.jpg",vF="/zh-cn/assets/cover25-cb84d871.jpg",yF="/zh-cn/assets/cover26-7a726e97.jpg",wF="/zh-cn/assets/cover27-401eea81.jpg",xF="/zh-cn/assets/cover28-6ddc6bee.jpg",_F="/zh-cn/assets/cover29-0d2deb11.jpg",SF=[{key:1,image:QV,title:"Utilizing SpinalHDL for Large-scale Datapath Design",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的一个workshop:Utilizing SpinalHDL for Large-scale Datapath Design,由李天瑞进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1PM411m7DB/"},{key:2,image:qV,title:"A Network Attached Deep Learning Accelerator for FPGA Clusters",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的三个workshop:A Network Attached Deep Learning Accelerator for FPGA Clusters,由Philipp Kreowsky Justin Knapheide进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1HM411m7mS/"},{key:3,image:ZV,title:"Coding a microprogrammed protocol receiver in SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的五个workshop:Coding a microprogrammed protocol receiver in SpinalHDL,由Michael Meier进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1oK411z7VD/"},{key:4,image:JV,title:"Utilizing SpinalHDL to Accelerate Neuroscience",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的二个workshop:Utilizing SpinalHDL to Accelerate Neuroscience,由Jeff-Ciesielski进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1GG4y1J7gU/"},{key:5,image:eF,title:"SpinalHDL in Computer Architecture Research",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的四个workshop:SpinalHDL in Computer Architecture Research,由Sallar Ahmadi-Pour ( saahm)进行分享。",date:"2022.12.20",url:"https://www.bilibili.com/video/BV1gA411X7f8/"},{key:6,image:tF,title:"NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第六个workshop:NaxRiscv: A Pipeline/Plugins/SpinalHDL/Scala mix,由Dolu1990进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV13K41167q5/"},{key:7,image:rF,title:"Recent progress on formal verification support on SpinalHDL",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第七个workshop:Recent progress on formal verification support on SpinalHDL,由Xiao Yindong (Readon)进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV1bG411N7fk/"},{key:8,image:nF,title:"SpinalHDL for ASIC",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第八个workshop:SpinalHDL for ASIC,由Sebastien-riou进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV16e4y1L7dV/"},{key:9,image:iF,title:"From Peripheral Plugins to Product documentation",text:"为了让对开源硬件感兴趣的朋友进一步了解SpinalHDL,达坦科技联合SpinalHDL社区举办一场题为《SpinalHDL应用前景探索》的线上研讨会(Webinar)。本研讨会分三个讨论分主题,分别为:数据通路加速(Datapath/Accelerations)、复杂系统设计案例(Design)、硬件设计流程(Flow)。这是本场研讨会的第九个workshop:From Peripheral Plugins to Product documentation,由Andreas Wallner进行分享。",date:"2022.12.21",url:"https://www.bilibili.com/video/BV12v4y1Q7cg/"},{key:13,image:oF,title:"Coroutines Applied to a Tilelink Interconnect Elaboration",text:"SpinalHDL始于2014年,最初是作为VHDL/Verilog的替代而做的创新尝试,伴随着数年来开源硬件设计的蓬勃发展,基于开源技术的硬件设计方法和范式逐渐受到业界的关注。达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第一部分,由Charles Popen进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1Vz4y1J7ck/"},{key:14,image:sF,title:"RISC-V敏捷硬件开发-软件定义芯片",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第一个分享《RISC-V敏捷硬件开发-软件定义芯片》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Qh4y1K7pH/"},{key:15,image:aF,title:"香山处理器与敏捷开发工具链的最新进展",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第二个分享《香山处理器与敏捷开发工具链的最新进展》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Dz4y1T7V6/"},{key:16,image:lF,title:"数据流式编程在硬件设计中的应用",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第三个分享《数据流式编程在硬件设计中的应用》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV12N411B7TN/"},{key:17,image:cF,title:"EDA创新推动敏捷芯片设计",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第四个分享《EDA创新推动敏捷芯片设计》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV1Tz4y1M7vt/"},{key:18,image:uF,title:"Automated CPU design with AI",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第五个分享《Automated CPU design with AI》。",date:"2023.08.25",url:"https://www.bilibili.com/video/BV13w411Q7zi/"},{key:19,image:dF,title:"MetaHVL硬件敏捷验证与协同仿真",text:"2023年8月23日至25日, 2023 RISC-V中国峰会在北京香格里拉饭店举办。作为本届RISC-V中国峰会的同期活动,8月25日下午,达坦科技在线上举办了第二届硬件敏捷开发与验证方法学研讨会。本次研讨会邀请了业界多位专家分享他们在各自领域的硬件敏捷开发与验证实践经验,为业界提供一次深入探讨和交流的机会,促进硬件敏捷开发与验证方法学的发展与落地。这是本场研讨会的第六个分享《MetaHVL硬件敏捷验证与协同仿》。",date:"2023.08.26",url:"https://www.bilibili.com/video/BV1DN4y197Pm/"},{key:20,image:fF,title:"计算机体系结构MIT课程学习社区经验分享",text:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。本场分享主题为【计算机体系结构MIT课程学习社区经验分享】,旨在了解学习社区各位同学学习的状态和面临的挑战,邀请已完成课程的学员分享学习和动手操作LAB的经验和教训,以此更好地辅助大家完成课程。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1cs4y1r7T3/"},{key:21,image:hF,title:"计算机体系结构 l MIT课程学习新手上路宣讲",text:"达坦科技在2023年始,发起成立计算机体系结构- MIT课程学习社区,号召感兴趣的工程师和同学系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。为此,达坦科技软硬件联合开发工程师米明恒在2023年9月23日(周六)上午10:30为大家带来了一场计算机体系结构 l MIT课程学习新手上路宣讲。",date:"2023.09.24",url:"https://www.bilibili.com/video/BV1u8411i7Qw/"},{key:22,image:mF,title:"Stream Transaction Extender设计与验证",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第二部分,由电子科技大学副教授肖寅东(Readon)进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1pM4y1j7Lm/"},{key:23,image:pF,title:"面向Multi-Die FPGA的设计与部署自动化方法探索",text:"达坦科技联合了SpinalHDL社区,以及四川芯测电子技术有限公司举办了一场题为SpinalHDL的使用和开发经验研讨会,旨在和大家分享SpinalHDL最新的实践、挑战和经验的分享。本视频为Workshop的第三部分,由西安交通大学副教授邸志雄进行分享。",date:"2023.07.08",url:"https://www.bilibili.com/video/BV1og4y1c7RS/"},{key:24,image:gF,title:"Get Started with SpinalHDL with a Simplified Setup",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办了 《2023 SpinalHDL应用前景探索》的线上研讨会,这是研讨会第一个视频,Get Started with SpinalHDL with a Simplified Setup",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1TW4y1F7uQ/"},{key:25,image:vF,title:"Some Tips on Using Memory Black Box in SpinalHDL",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第二个视频,由yportne13带来“Some Tips on Using Memory Black Box in SpinalHDL”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1LC4y1g7c7/"},{key:26,image:yF,title:"Pipelining API Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第三个视频,由Charles Papon带来“Pipelining API Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Zj411n7SC/"},{key:27,image:wF,title:"SpinalHDL Intro for New Users",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第四个视频,由Andreas Wallner带来“SpinalHDL Intro for New Users”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:28,image:xF,title:"Pcie Brief Introduction",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第五个视频,由Chenbo带来“Pcie Brief Introduction”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Mw41147aS/"},{key:29,image:_F,title:"The J1Sc Family",text:"在2023年12月10日,达坦科技联合SpinalHDL社区及该语言的创建者 Charles Papon 举办 了《2023 SpinalHDL应用前景探索》的线上研讨会,分为两个Track。这是第六个视频,由Christopher Lozinsk带来“The J1Sc Family”。",date:"2023.12.17",url:"https://www.bilibili.com/video/BV1Jc411o7A6/"}],{Heading:bF,Paragraph:kF}=Pe,{CNHead4:CF,CNTitleLarge:DF}=bF,{CNMarkSmall:jF,CNBodySmall:EF}=kF,Ec=new Map([["tech-talk",{label:"前沿科技分享",description:"探索前沿技术,拥抱创新与改变",list:TV,recommend:27}],["oss-showcase",{label:"开源产品分享",description:"软硬件融合创新实践的观察与输出",list:MV,recommend:2}],["rust-showcase",{label:"Rust语言应用及案例分享",description:"Rust编程语言的应用、实践与探索",list:XV,recommend:12}],["hardware-acceleration",{label:"硬件加速",description:"硬件加速领域的实践、经验与挑战",list:SF,recommend:21}]]),AF=f.main``,TF=f.div` max-width: 1440px; margin-inline: auto; padding: 1rem 1.76rem 1.68rem; -`,Fh=f.section` +`,Vh=f.section` padding-bottom: 0.84rem; &:last-child { padding-bottom: 0; } -`,Vh=f(SV)` +`,Fh=f(CF)` padding-bottom: 0.48rem; text-align: center; -`,EV=f.div` +`,RF=f.div` display: grid; grid-template-rows: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr); grid-gap: 0.29rem; -`,AV=f.div` +`,OF=f.div` display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 0.43rem 0.29rem; `,Ob=f.div` display: flex; flex-direction: column; -`,TV=f(Ob)` +`,PF=f(Ob)` display: flex; flex-direction: column; grid-area: 1 / 1 / 3 / 2; -`,RV=f.div` +`,MF=f.div` display: flex; justify-content: space-between; height: 100%; -`,OV=f.div``,zw=f.img` +`,LF=f.div``,zw=f.img` display: block; width: 100%; border-radius: 0.06rem; -`,PV=f.img` +`,IF=f.img` display: block; width: 50%; height: min-content; border-radius: 0.06rem; -`,MV=f.img` +`,NF=f.img` float: left; width: 50%; padding-right: 0.21rem; @@ -2192,9 +2204,9 @@ Error generating stack: `+o.message+` border-radius: 0.06rem; `,Yw=f.div` padding-top: 0.29rem; -`,LV=f.div` +`,zF=f.div` width: 47%; -`,Ac=f(kV)` +`,Ac=f(jF)` padding-bottom: 0.11rem; color: ${e=>e.theme.secondary01}; `,Tc=f.div` @@ -2206,27 +2218,27 @@ Error generating stack: `+o.message+` &:hover { color: #531dab; } -`,Rc=f(bV)``,Oc=f.img` +`,Rc=f(DF)``,Oc=f.img` width: 0.215rem; height: 0.215rem; -`,Pc=f(CV)` +`,Pc=f(EF)` color: #667085; -`,Mc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=Ec.get(t))==null?void 0:a.label,n=(c=Ec.get(t))==null?void 0:c.description,i=(d=Ec.get(t))==null?void 0:d.list.reverse(),o=(h=Ec.get(t))==null?void 0:h.recommend;return I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:NH,subTitle:n,children:r}),l.jsx(DV,{children:l.jsxs(jV,{children:[l.jsxs(Fh,{children:[l.jsx(Vh,{children:"最新视频"}),l.jsx(EV,{children:i&&i.map(({key:g,image:v,date:_,title:b,text:k,url:D},j)=>j===0?l.jsxs(TV,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:b}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:k})]})]},g):j<3?l.jsxs(OV,{children:[l.jsx(MV,{src:v}),l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:b}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:k})]},j):null)})]}),l.jsxs(Fh,{children:[l.jsx(Vh,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:_,title:b,text:k,url:D})=>{if(g===o)return l.jsxs(RV,{children:[l.jsx(PV,{src:v}),l.jsxs(LV,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:b}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:k})]})]},g)})]}),l.jsxs(Fh,{children:[l.jsx(Vh,{children:"全部视频"}),l.jsx(AV,{children:i&&i.map(({key:g,image:v,date:_,title:b,text:k,url:D})=>l.jsxs(Ob,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:b}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:k})]})]},g))})]})]})})]})};//! moment.js +`,Mc=()=>{var a,c,d,h;const t=si().pathname.split("/").join(""),r=(a=Ec.get(t))==null?void 0:a.label,n=(c=Ec.get(t))==null?void 0:c.description,i=(d=Ec.get(t))==null?void 0:d.list.reverse(),o=(h=Ec.get(t))==null?void 0:h.recommend;return I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsxs(Rt.Fragment,{children:[l.jsx(Ir,{cover:HH,subTitle:n,children:r}),l.jsx(AF,{children:l.jsxs(TF,{children:[l.jsxs(Vh,{children:[l.jsx(Fh,{children:"最新视频"}),l.jsx(RF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D},j)=>j===0?l.jsxs(PF,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g):j<3?l.jsxs(LF,{children:[l.jsx(NF,{src:v}),l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]},j):null)})]}),l.jsxs(Vh,{children:[l.jsx(Fh,{children:"推荐视频"}),i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D})=>{if(g===o)return l.jsxs(MF,{children:[l.jsx(IF,{src:v}),l.jsxs(zF,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g)})]}),l.jsxs(Vh,{children:[l.jsx(Fh,{children:"全部视频"}),l.jsx(OF,{children:i&&i.map(({key:g,image:v,date:_,title:k,text:C,url:D})=>l.jsxs(Ob,{children:[l.jsx(zw,{src:v}),l.jsxs(Yw,{children:[l.jsx(Ac,{children:_}),l.jsxs(Tc,{as:wc,to:D,children:[l.jsx(Rc,{children:k}),l.jsx(Oc,{src:jc})]}),l.jsx(Pc,{children:C})]})]},g))})]})]})})]})};//! moment.js //! version : 2.29.4 //! authors : Tim Wood, Iskren Chernev, Moment.js contributors //! license : MIT //! momentjs.com -var Pb;function B(){return Pb.apply(null,arguments)}function IV(e){Pb=e}function en(e){return e instanceof Array||Object.prototype.toString.call(e)==="[object Array]"}function mo(e){return e!=null&&Object.prototype.toString.call(e)==="[object Object]"}function Te(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Vg(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Te(e,t))return!1;return!0}function lr(e){return e===void 0}function ri(e){return typeof e=="number"||Object.prototype.toString.call(e)==="[object Number]"}function Ml(e){return e instanceof Date||Object.prototype.toString.call(e)==="[object Date]"}function Mb(e,t){var r=[],n,i=e.length;for(n=0;n>>0,n;for(n=0;n0)for(r=0;r>>0,n;for(n=0;n0)for(r=0;r=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var Wg=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Lc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,$h={},ys={};function se(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(ys[e]=i),t&&(ys[t[0]]=function(){return xn(i.apply(this,arguments),t[1],t[2])}),r&&(ys[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function FV(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function VV(e){var t=e.match(Wg),r,n;for(r=0,n=t.length;r=0&&Lc.test(e);)e=e.replace(Lc,n),Lc.lastIndex=0,r-=1;return e}var UV={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function $V(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(Wg).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var BV="Invalid date";function WV(){return this._invalidDate}var GV="%d",KV=/\d{1,2}/;function XV(e){return this._ordinal.replace("%d",e)}var QV={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function qV(e,t,r,n){var i=this._relativeTime[r];return Cn(i)?i(e,t,r,n):i.replace(/%d/i,e)}function ZV(e,t){var r=this._relativeTime[e>0?"future":"past"];return Cn(r)?r(t):r.replace(/%s/i,t)}var Ba={};function Wt(e,t){var r=e.toLowerCase();Ba[r]=Ba[r+"s"]=Ba[t]=e}function zr(e){return typeof e=="string"?Ba[e]||Ba[e.toLowerCase()]:void 0}function Gg(e){var t={},r,n;for(n in e)Te(e,n)&&(r=zr(n),r&&(t[r]=e[n]));return t}var zb={};function Gt(e,t){zb[e]=t}function JV(e){var t=[],r;for(r in e)Te(e,r)&&t.push({unit:r,priority:zb[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}function af(e){return e%4===0&&e%100!==0||e%400===0}function Ar(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function we(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Ar(t)),r}function Gs(e,t){return function(r){return r!=null?(Yb(this,e,r),B.updateOffset(this,t),this):Wu(this,e)}}function Wu(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Yb(e,t,r){e.isValid()&&!isNaN(r)&&(t==="FullYear"&&af(e.year())&&e.month()===1&&e.date()===29?(r=we(r),e._d["set"+(e._isUTC?"UTC":"")+t](r,e.month(),hf(r,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](r))}function eU(e){return e=zr(e),Cn(this[e])?this[e]():this}function tU(e,t){if(typeof e=="object"){e=Gg(e);var r=JV(e),n,i=r.length;for(n=0;n68?1900:2e3)};var Xb=Gs("FullYear",!0);function xU(){return af(this.year())}function _U(e,t,r,n,i,o,a){var c;return e<100&&e>=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function yl(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Ku(e,t,r){var n=7+t-r,i=(7+yl(e,0,n).getUTCDay()-t)%7;return-i+n-1}function Qb(e,t,r,n,i){var o=(7+r-n)%7,a=Ku(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=Wa(d)+c):c>Wa(e)?(d=e+1,h=c-Wa(e)):(d=e,h=c),{year:d,dayOfYear:h}}function wl(e,t,r){var n=Ku(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+qn(a,t,r)):i>qn(e.year(),t,r)?(o=i-qn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function qn(e,t,r){var n=Ku(e,t,r),i=Ku(e+1,t,r);return(Wa(e)-n+i)/7}se("w",["ww",2],"wo","week");se("W",["WW",2],"Wo","isoWeek");Wt("week","w");Wt("isoWeek","W");Gt("week",5);Gt("isoWeek",5);q("w",Xe);q("ww",Xe,Cr);q("W",Xe);q("WW",Xe,Cr);Nl(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=we(e)});function SU(e){return wl(e,this._week.dow,this._week.doy).week}var bU={dow:0,doy:6};function kU(){return this._week.dow}function CU(){return this._week.doy}function DU(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function jU(e){var t=wl(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}se("d",0,"do","day");se("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});se("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});se("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});se("e",0,0,"weekday");se("E",0,0,"isoWeekday");Wt("day","d");Wt("weekday","e");Wt("isoWeekday","E");Gt("day",11);Gt("weekday",11);Gt("isoWeekday",11);q("d",Xe);q("e",Xe);q("E",Xe);q("dd",function(e,t){return t.weekdaysMinRegex(e)});q("ddd",function(e,t){return t.weekdaysShortRegex(e)});q("dddd",function(e,t){return t.weekdaysRegex(e)});Nl(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:pe(r).invalidWeekday=e});Nl(["d","e","E"],function(e,t,r,n){t[n]=we(e)});function EU(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function AU(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Qg(e,t){return e.slice(t,7).concat(e.slice(0,t))}var TU="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),RU="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),OU=Il,PU=Il,MU=Il;function LU(e,t){var r=en(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Qg(r,this._week.dow):e?r[e.day()]:r}function IU(e){return e===!0?Qg(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function NU(e){return e===!0?Qg(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function zU(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=kn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1||(i=dt.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=dt.call(this._minWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function YU(e,t,r){var n,i,o;if(this._weekdaysParseExact)return zU.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=kn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function HU(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=EU(e,this.localeData()),this.add(e-t,"d")):t}function FU(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function VU(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=AU(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function UU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Te(this,"_weekdaysRegex")||(this._weekdaysRegex=OU),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function $U(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Te(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=PU),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function BU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Te(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=MU),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function qg(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=kn([2e3,1]).day(o),c=vr(this.weekdaysMin(a,"")),d=vr(this.weekdaysShort(a,"")),h=vr(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Zg(){return this.hours()%12||12}function WU(){return this.hours()||24}se("H",["HH",2],0,"hour");se("h",["hh",2],0,Zg);se("k",["kk",2],0,WU);se("hmm",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)});se("hmmss",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)+xn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+xn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+xn(this.minutes(),2)+xn(this.seconds(),2)});function Zb(e,t){se(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}Zb("a",!0);Zb("A",!1);Wt("hour","h");Gt("hour",13);function Jb(e,t){return t._meridiemParse}q("a",Jb);q("A",Jb);q("H",Xe);q("h",Xe);q("k",Xe);q("HH",Xe,Cr);q("hh",Xe,Cr);q("kk",Xe,Cr);q("hmm",Vb);q("hmmss",Ub);q("Hmm",Vb);q("Hmmss",Ub);He(["H","HH"],Ct);He(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});He(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});He(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});He("hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n)),pe(r).bigHour=!0});He("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i)),pe(r).bigHour=!0});He("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n))});He("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i))});function GU(e){return(e+"").toLowerCase().charAt(0)==="p"}var KU=/[ap]\.?m?\.?/i,XU=Gs("Hours",!0);function QU(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var ek={calendar:YV,longDateFormat:UV,invalidDate:BV,ordinal:GV,dayOfMonthOrdinalParse:KV,relativeTime:QV,months:uU,monthsShort:$b,week:bU,weekdays:TU,weekdaysMin:RU,weekdaysShort:qb,meridiemParse:KU},qe={},ka={},xl;function qU(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=mf(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&qU(o,n)>=r-1)break;r--}t++}return xl}function JU(e){return e.match("^[^/\\\\]*$")!=null}function mf(e){var t=null,r;if(qe[e]===void 0&&typeof ou<"u"&&ou&&ou.exports&&JU(e))try{t=xl._abbr,r=require,r("./locale/"+e),Yi(t)}catch{qe[e]=null}return qe[e]}function Yi(e,t){var r;return e&&(lr(t)?r=ai(e):r=Jg(e,t),r?xl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),xl._abbr}function Jg(e,t){if(t!==null){var r,n=ek;if(t.abbr=e,qe[e]!=null)Ib("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=qe[e]._config;else if(t.parentLocale!=null)if(qe[t.parentLocale]!=null)n=qe[t.parentLocale]._config;else if(r=mf(t.parentLocale),r!=null)n=r._config;else return ka[t.parentLocale]||(ka[t.parentLocale]=[]),ka[t.parentLocale].push({name:e,config:t}),null;return qe[e]=new Bg(Gp(n,t)),ka[e]&&ka[e].forEach(function(i){Jg(i.name,i.config)}),Yi(e),qe[e]}else return delete qe[e],null}function e$(e,t){if(t!=null){var r,n,i=ek;qe[e]!=null&&qe[e].parentLocale!=null?qe[e].set(Gp(qe[e]._config,t)):(n=mf(e),n!=null&&(i=n._config),t=Gp(i,t),n==null&&(t.abbr=e),r=new Bg(t),r.parentLocale=qe[e],qe[e]=r),Yi(e)}else qe[e]!=null&&(qe[e].parentLocale!=null?(qe[e]=qe[e].parentLocale,e===Yi()&&Yi(e)):qe[e]!=null&&delete qe[e]);return qe[e]}function ai(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return xl;if(!en(e)){if(t=mf(e),t)return t;e=[e]}return ZU(e)}function t$(){return Kp(qe)}function ev(e){var t,r=e._a;return r&&pe(e).overflow===-2&&(t=r[Gn]<0||r[Gn]>11?Gn:r[pn]<1||r[pn]>hf(r[$t],r[Gn])?pn:r[Ct]<0||r[Ct]>24||r[Ct]===24&&(r[Xr]!==0||r[Kn]!==0||r[lo]!==0)?Ct:r[Xr]<0||r[Xr]>59?Xr:r[Kn]<0||r[Kn]>59?Kn:r[lo]<0||r[lo]>999?lo:-1,pe(e)._overflowDayOfYear&&(t<$t||t>pn)&&(t=pn),pe(e)._overflowWeeks&&t===-1&&(t=aU),pe(e)._overflowWeekday&&t===-1&&(t=lU),pe(e).overflow=t),e}var r$=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,n$=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,i$=/Z|[+-]\d\d(?::?\d\d)?/,Ic=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Bh=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],o$=/^\/?Date\((-?\d+)/i,s$=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,a$={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function tk(e){var t,r,n=e._i,i=r$.exec(n)||n$.exec(n),o,a,c,d,h=Ic.length,g=Bh.length;if(i){for(pe(e).iso=!0,t=0,r=h;tWa(a)||e._dayOfYear===0)&&(pe(e)._overflowDayOfYear=!0),r=yl(a,0,e._dayOfYear),e._a[Gn]=r.getUTCMonth(),e._a[pn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[Ct]===24&&e._a[Xr]===0&&e._a[Kn]===0&&e._a[lo]===0&&(e._nextDay=!0,e._a[Ct]=0),e._d=(e._useUTC?yl:_U).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ct]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(pe(e).weekdayMismatch=!0)}}function p$(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=Wo(t.GG,e._a[$t],wl(Ke(),1,4).year),n=Wo(t.W,1),i=Wo(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=wl(Ke(),o,a),r=Wo(t.gg,e._a[$t],h.year),n=Wo(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>qn(r,o,a)?pe(e)._overflowWeeks=!0:d!=null?pe(e)._overflowWeekday=!0:(c=Qb(r,n,i,o,a),e._a[$t]=c.year,e._dayOfYear=c.dayOfYear)}B.ISO_8601=function(){};B.RFC_2822=function(){};function rv(e){if(e._f===B.ISO_8601){tk(e);return}if(e._f===B.RFC_2822){rk(e);return}e._a=[],pe(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=Nb(e._f,e._locale).match(Wg)||[],g=i.length,r=0;r0&&pe(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),ys[o]?(n?pe(e).empty=!1:pe(e).unusedTokens.push(o),sU(o,n,e)):e._strict&&!n&&pe(e).unusedTokens.push(o);pe(e).charsLeftOver=c-d,t.length>0&&pe(e).unusedInput.push(t),e._a[Ct]<=12&&pe(e).bigHour===!0&&e._a[Ct]>0&&(pe(e).bigHour=void 0),pe(e).parsedDateParts=e._a.slice(0),pe(e).meridiem=e._meridiem,e._a[Ct]=g$(e._locale,e._a[Ct],e._meridiem),h=pe(e).era,h!==null&&(e._a[$t]=e._locale.erasConvertYear(h,e._a[$t])),tv(e),ev(e)}function g$(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function v$(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){pe(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:sf()});function ok(e,t){var r,n;if(t.length===1&&en(t[0])&&(t=t[0]),!t.length)return Ke();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function z$(){if(!lr(this._isDSTShifted))return this._isDSTShifted;var e={},t;return $g(e,this),e=nk(e),e._a?(t=e._isUTC?kn(e._a):Ke(e._a),this._isDSTShifted=this.isValid()&&A$(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function Y$(){return this.isValid()?!this._isUTC:!1}function H$(){return this.isValid()?this._isUTC:!1}function ak(){return this.isValid()?this._isUTC&&this._offset===0:!1}var F$=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,V$=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function rn(e,t){var r=e,n=null,i,o,a;return nu(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:ri(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=F$.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:we(n[pn])*i,h:we(n[Ct])*i,m:we(n[Xr])*i,s:we(n[Kn])*i,ms:we(Qp(n[lo]*1e3))*i}):(n=V$.exec(e))?(i=n[1]==="-"?-1:1,r={y:Ji(n[2],i),M:Ji(n[3],i),w:Ji(n[4],i),d:Ji(n[5],i),h:Ji(n[6],i),m:Ji(n[7],i),s:Ji(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=U$(Ke(r.from),Ke(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new pf(r),nu(e)&&Te(e,"_locale")&&(o._locale=e._locale),nu(e)&&Te(e,"_isValid")&&(o._isValid=e._isValid),o}rn.fn=pf.prototype;rn.invalid=E$;function Ji(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function Uw(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function U$(e,t){var r;return e.isValid()&&t.isValid()?(t=iv(t,e),e.isBefore(t)?r=Uw(e,t):(r=Uw(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function lk(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(Ib(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=rn(r,n),ck(this,i,e),this}}function ck(e,t,r,n){var i=t._milliseconds,o=Qp(t._days),a=Qp(t._months);e.isValid()&&(n=n??!0,a&&Wb(e,Wu(e,"Month")+a*r),o&&Yb(e,"Date",Wu(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&B.updateOffset(e,o||a))}var $$=lk(1,"add"),B$=lk(-1,"subtract");function uk(e){return typeof e=="string"||e instanceof String}function W$(e){return tn(e)||Ml(e)||uk(e)||ri(e)||K$(e)||G$(e)||e===null||e===void 0}function G$(e){var t=mo(e)&&!Vg(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?ru(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Cn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",ru(r,"Z")):ru(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function lB(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function cB(e){e||(e=this.isUtc()?B.defaultFormatUtc:B.defaultFormat);var t=ru(this,e);return this.localeData().postformat(t)}function uB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function dB(e){return this.from(Ke(),e)}function fB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function hB(e){return this.to(Ke(),e)}function dk(e){var t;return e===void 0?this._locale._abbr:(t=ai(e),t!=null&&(this._locale=t),this)}var fk=Nr("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function hk(){return this._locale}var Xu=1e3,ws=60*Xu,Qu=60*ws,mk=(365*400+97)*24*Qu;function xs(e,t){return(e%t+t)%t}function pk(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-mk:new Date(e,t,r).valueOf()}function gk(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-mk:Date.UTC(e,t,r)}function mB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu);break;case"minute":t=this._d.valueOf(),t-=xs(t,ws);break;case"second":t=this._d.valueOf(),t-=xs(t,Xu);break}return this._d.setTime(t),B.updateOffset(this,!0),this}function pB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Qu-xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu)-1;break;case"minute":t=this._d.valueOf(),t+=ws-xs(t,ws)-1;break;case"second":t=this._d.valueOf(),t+=Xu-xs(t,Xu)-1;break}return this._d.setTime(t),B.updateOffset(this,!0),this}function gB(){return this._d.valueOf()-(this._offset||0)*6e4}function vB(){return Math.floor(this.valueOf()/1e3)}function yB(){return new Date(this.valueOf())}function wB(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function xB(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function _B(){return this.isValid()?this.toISOString():null}function SB(){return Ug(this)}function bB(){return Di({},pe(this))}function kB(){return pe(this).overflow}function CB(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}se("N",0,0,"eraAbbr");se("NN",0,0,"eraAbbr");se("NNN",0,0,"eraAbbr");se("NNNN",0,0,"eraName");se("NNNNN",0,0,"eraNarrow");se("y",["y",1],"yo","eraYear");se("y",["yy",2],0,"eraYear");se("y",["yyy",3],0,"eraYear");se("y",["yyyy",4],0,"eraYear");q("N",ov);q("NN",ov);q("NNN",ov);q("NNNN",IB);q("NNNNN",NB);He(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?pe(r).era=i:pe(r).invalidEra=e});q("y",Ks);q("yy",Ks);q("yyy",Ks);q("yyyy",Ks);q("yo",zB);He(["y","yy","yyy","yyyy"],$t);He(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[$t]=r._locale.eraYearOrdinalParse(e,i):t[$t]=parseInt(e,10)});function DB(e,t){var r,n,i,o=this._eras||ai("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function EB(e,t){var r=e.since<=e.until?1:-1;return t===void 0?B(e.since).year():B(e.since).year()+(t-e.offset)*r}function AB(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),BB.call(this,e,t,r,n,i))}function BB(e,t,r,n,i){var o=Qb(e,t,r,n,i),a=yl(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}se("Q",0,"Qo","quarter");Wt("quarter","Q");Gt("quarter",7);q("Q",Hb);He("Q",function(e,t){t[Gn]=(we(e)-1)*3});function WB(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}se("D",["DD",2],"Do","date");Wt("date","D");Gt("date",9);q("D",Xe);q("DD",Xe,Cr);q("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});He(["D","DD"],pn);He("Do",function(e,t){t[pn]=we(e.match(Xe)[0])});var yk=Gs("Date",!0);se("DDD",["DDDD",3],"DDDo","dayOfYear");Wt("dayOfYear","DDD");Gt("dayOfYear",4);q("DDD",cf);q("DDDD",Fb);He(["DDD","DDDD"],function(e,t,r){r._dayOfYear=we(e)});function GB(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}se("m",["mm",2],0,"minute");Wt("minute","m");Gt("minute",14);q("m",Xe);q("mm",Xe,Cr);He(["m","mm"],Xr);var KB=Gs("Minutes",!1);se("s",["ss",2],0,"second");Wt("second","s");Gt("second",15);q("s",Xe);q("ss",Xe,Cr);He(["s","ss"],Kn);var XB=Gs("Seconds",!1);se("S",0,0,function(){return~~(this.millisecond()/100)});se(0,["SS",2],0,function(){return~~(this.millisecond()/10)});se(0,["SSS",3],0,"millisecond");se(0,["SSSS",4],0,function(){return this.millisecond()*10});se(0,["SSSSS",5],0,function(){return this.millisecond()*100});se(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});se(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});se(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});se(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});Wt("millisecond","ms");Gt("millisecond",16);q("S",cf,Hb);q("SS",cf,Cr);q("SSS",cf,Fb);var ji,wk;for(ji="SSSS";ji.length<=9;ji+="S")q(ji,Ks);function QB(e,t){t[lo]=we(("0."+e)*1e3)}for(ji="S";ji.length<=9;ji+="S")He(ji,QB);wk=Gs("Milliseconds",!1);se("z",0,0,"zoneAbbr");se("zz",0,0,"zoneName");function qB(){return this._isUTC?"UTC":""}function ZB(){return this._isUTC?"Coordinated Universal Time":""}var U=Ll.prototype;U.add=$$;U.calendar=q$;U.clone=Z$;U.diff=oB;U.endOf=pB;U.format=cB;U.from=uB;U.fromNow=dB;U.to=fB;U.toNow=hB;U.get=eU;U.invalidAt=kB;U.isAfter=J$;U.isBefore=eB;U.isBetween=tB;U.isSame=rB;U.isSameOrAfter=nB;U.isSameOrBefore=iB;U.isValid=SB;U.lang=fk;U.locale=dk;U.localeData=hk;U.max=S$;U.min=_$;U.parsingFlags=bB;U.set=tU;U.startOf=mB;U.subtract=B$;U.toArray=wB;U.toObject=xB;U.toDate=yB;U.toISOString=aB;U.inspect=lB;typeof Symbol<"u"&&Symbol.for!=null&&(U[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});U.toJSON=_B;U.toString=sB;U.unix=vB;U.valueOf=gB;U.creationData=CB;U.eraName=AB;U.eraNarrow=TB;U.eraAbbr=RB;U.eraYear=OB;U.year=Xb;U.isLeapYear=xU;U.weekYear=YB;U.isoWeekYear=HB;U.quarter=U.quarters=WB;U.month=Gb;U.daysInMonth=vU;U.week=U.weeks=DU;U.isoWeek=U.isoWeeks=jU;U.weeksInYear=UB;U.weeksInWeekYear=$B;U.isoWeeksInYear=FB;U.isoWeeksInISOWeekYear=VB;U.date=yk;U.day=U.days=HU;U.weekday=FU;U.isoWeekday=VU;U.dayOfYear=GB;U.hour=U.hours=XU;U.minute=U.minutes=KB;U.second=U.seconds=XB;U.millisecond=U.milliseconds=wk;U.utcOffset=R$;U.utc=P$;U.local=M$;U.parseZone=L$;U.hasAlignedHourOffset=I$;U.isDST=N$;U.isLocal=Y$;U.isUtcOffset=H$;U.isUtc=ak;U.isUTC=ak;U.zoneAbbr=qB;U.zoneName=ZB;U.dates=Nr("dates accessor is deprecated. Use date instead.",yk);U.months=Nr("months accessor is deprecated. Use month instead",Gb);U.years=Nr("years accessor is deprecated. Use year instead",Xb);U.zone=Nr("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",O$);U.isDSTShifted=Nr("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",z$);function JB(e){return Ke(e*1e3)}function e9(){return Ke.apply(null,arguments).parseZone()}function xk(e){return e}var Re=Bg.prototype;Re.calendar=HV;Re.longDateFormat=$V;Re.invalidDate=WV;Re.ordinal=XV;Re.preparse=xk;Re.postformat=xk;Re.relativeTime=qV;Re.pastFuture=ZV;Re.set=zV;Re.eras=DB;Re.erasParse=jB;Re.erasConvertYear=EB;Re.erasAbbrRegex=MB;Re.erasNameRegex=PB;Re.erasNarrowRegex=LB;Re.months=hU;Re.monthsShort=mU;Re.monthsParse=gU;Re.monthsRegex=wU;Re.monthsShortRegex=yU;Re.week=SU;Re.firstDayOfYear=CU;Re.firstDayOfWeek=kU;Re.weekdays=LU;Re.weekdaysMin=NU;Re.weekdaysShort=IU;Re.weekdaysParse=YU;Re.weekdaysRegex=UU;Re.weekdaysShortRegex=$U;Re.weekdaysMinRegex=BU;Re.isPM=GU;Re.meridiem=QU;function qu(e,t,r,n){var i=ai(),o=kn().set(n,t);return i[r](o,e)}function _k(e,t,r){if(ri(e)&&(t=e,e=void 0),e=e||"",t!=null)return qu(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=qu(e,n,r,"month");return i}function av(e,t,r,n){typeof e=="boolean"?(ri(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,ri(t)&&(r=t,t=void 0),t=t||"");var i=ai(),o=e?i._week.dow:0,a,c=[];if(r!=null)return qu(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=qu(t,(a+o)%7,n,"day");return c}function t9(e,t){return _k(e,t,"months")}function r9(e,t){return _k(e,t,"monthsShort")}function n9(e,t,r){return av(e,t,r,"weekdays")}function i9(e,t,r){return av(e,t,r,"weekdaysShort")}function o9(e,t,r){return av(e,t,r,"weekdaysMin")}Yi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=we(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});B.lang=Nr("moment.lang is deprecated. Use moment.locale instead.",Yi);B.langData=Nr("moment.langData is deprecated. Use moment.localeData instead.",ai);var zn=Math.abs;function s9(){var e=this._data;return this._milliseconds=zn(this._milliseconds),this._days=zn(this._days),this._months=zn(this._months),e.milliseconds=zn(e.milliseconds),e.seconds=zn(e.seconds),e.minutes=zn(e.minutes),e.hours=zn(e.hours),e.months=zn(e.months),e.years=zn(e.years),this}function Sk(e,t,r,n){var i=rn(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function a9(e,t){return Sk(this,e,t,1)}function l9(e,t){return Sk(this,e,t,-1)}function $w(e){return e<0?Math.floor(e):Math.ceil(e)}function c9(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=$w(Zp(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Ar(e/1e3),n.seconds=i%60,o=Ar(i/60),n.minutes=o%60,a=Ar(o/60),n.hours=a%24,t+=Ar(a/24),d=Ar(bk(t)),r+=d,t-=$w(Zp(d)),c=Ar(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function bk(e){return e*4800/146097}function Zp(e){return e*146097/4800}function u9(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=zr(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+bk(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round(Zp(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function d9(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+we(this._months/12)*31536e6:NaN}function li(e){return function(){return this.as(e)}}var f9=li("ms"),h9=li("s"),m9=li("m"),p9=li("h"),g9=li("d"),v9=li("w"),y9=li("M"),w9=li("Q"),x9=li("y");function _9(){return rn(this)}function S9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function Eo(e){return function(){return this.isValid()?this._data[e]:NaN}}var b9=Eo("milliseconds"),k9=Eo("seconds"),C9=Eo("minutes"),D9=Eo("hours"),j9=Eo("days"),E9=Eo("months"),A9=Eo("years");function T9(){return Ar(this.days()/7)}var Vn=Math.round,cs={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function R9(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function O9(e,t,r,n){var i=rn(e).abs(),o=Vn(i.as("s")),a=Vn(i.as("m")),c=Vn(i.as("h")),d=Vn(i.as("d")),h=Vn(i.as("M")),g=Vn(i.as("w")),v=Vn(i.as("y")),_=o<=r.ss&&["s",o]||o0,_[4]=n,R9.apply(null,_)}function P9(e){return e===void 0?Vn:typeof e=="function"?(Vn=e,!0):!1}function M9(e,t){return cs[e]===void 0?!1:t===void 0?cs[e]:(cs[e]=t,e==="s"&&(cs.ss=t-1),!0)}function L9(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=cs,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},cs,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=O9(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var Wh=Math.abs;function zo(e){return(e>0)-(e<0)||+e}function vf(){if(!this.isValid())return this.localeData().invalidDate();var e=Wh(this._milliseconds)/1e3,t=Wh(this._days),r=Wh(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Ar(e/60),i=Ar(n/60),e%=60,n%=60,o=Ar(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=zo(this._months)!==zo(c)?"-":"",g=zo(this._days)!==zo(c)?"-":"",v=zo(this._milliseconds)!==zo(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var De=pf.prototype;De.isValid=j$;De.abs=s9;De.add=a9;De.subtract=l9;De.as=u9;De.asMilliseconds=f9;De.asSeconds=h9;De.asMinutes=m9;De.asHours=p9;De.asDays=g9;De.asWeeks=v9;De.asMonths=y9;De.asQuarters=w9;De.asYears=x9;De.valueOf=d9;De._bubble=c9;De.clone=_9;De.get=S9;De.milliseconds=b9;De.seconds=k9;De.minutes=C9;De.hours=D9;De.days=j9;De.weeks=T9;De.months=E9;De.years=A9;De.humanize=L9;De.toISOString=vf;De.toString=vf;De.toJSON=vf;De.locale=dk;De.localeData=hk;De.toIsoString=Nr("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",vf);De.lang=fk;se("X",0,0,"unix");se("x",0,0,"valueOf");q("x",df);q("X",nU);He("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});He("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js -B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B.months=t9;B.isDate=Ml;B.locale=Yi;B.invalid=sf;B.duration=rn;B.isMoment=tn;B.weekdays=n9;B.parseZone=e9;B.localeData=ai;B.isDuration=nu;B.monthsShort=r9;B.weekdaysMin=o9;B.defineLocale=Jg;B.updateLocale=e$;B.locales=t$;B.weekdaysShort=i9;B.normalizeUnits=zr;B.relativeTimeRounding=P9;B.relativeTimeThreshold=M9;B.calendarFormat=Q$;B.prototype=U;B.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const I9="/zh-cn/assets/blog-cover-95d8a382.png",N9=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),z9=f.main` +`+new Error().stack),r=!1}return t.apply(this,arguments)},t)}var Vw={};function Ib(e,t){B.deprecationHandler!=null&&B.deprecationHandler(e,t),Vw[e]||(Lb(t),Vw[e]=!0)}B.suppressDeprecationWarnings=!1;B.deprecationHandler=null;function Cn(e){return typeof Function<"u"&&e instanceof Function||Object.prototype.toString.call(e)==="[object Function]"}function VF(e){var t,r;for(r in e)Te(e,r)&&(t=e[r],Cn(t)?this[r]=t:this["_"+r]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function Gp(e,t){var r=Di({},e),n;for(n in t)Te(t,n)&&(mo(e[n])&&mo(t[n])?(r[n]={},Di(r[n],e[n]),Di(r[n],t[n])):t[n]!=null?r[n]=t[n]:delete r[n]);for(n in e)Te(e,n)&&!Te(t,n)&&mo(e[n])&&(r[n]=Di({},r[n]));return r}function Bg(e){e!=null&&this.set(e)}var Kp;Object.keys?Kp=Object.keys:Kp=function(e){var t,r=[];for(t in e)Te(e,t)&&r.push(t);return r};var FF={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function UF(e,t,r){var n=this._calendar[e]||this._calendar.sameElse;return Cn(n)?n.call(t,r):n}function xn(e,t,r){var n=""+Math.abs(e),i=t-n.length,o=e>=0;return(o?r?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+n}var Wg=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Lc=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,$h={},ys={};function se(e,t,r,n){var i=n;typeof n=="string"&&(i=function(){return this[n]()}),e&&(ys[e]=i),t&&(ys[t[0]]=function(){return xn(i.apply(this,arguments),t[1],t[2])}),r&&(ys[r]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function $F(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function BF(e){var t=e.match(Wg),r,n;for(r=0,n=t.length;r=0&&Lc.test(e);)e=e.replace(Lc,n),Lc.lastIndex=0,r-=1;return e}var WF={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function GF(e){var t=this._longDateFormat[e],r=this._longDateFormat[e.toUpperCase()];return t||!r?t:(this._longDateFormat[e]=r.match(Wg).map(function(n){return n==="MMMM"||n==="MM"||n==="DD"||n==="dddd"?n.slice(1):n}).join(""),this._longDateFormat[e])}var KF="Invalid date";function XF(){return this._invalidDate}var QF="%d",qF=/\d{1,2}/;function ZF(e){return this._ordinal.replace("%d",e)}var JF={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function eU(e,t,r,n){var i=this._relativeTime[r];return Cn(i)?i(e,t,r,n):i.replace(/%d/i,e)}function tU(e,t){var r=this._relativeTime[e>0?"future":"past"];return Cn(r)?r(t):r.replace(/%s/i,t)}var Ba={};function Wt(e,t){var r=e.toLowerCase();Ba[r]=Ba[r+"s"]=Ba[t]=e}function zr(e){return typeof e=="string"?Ba[e]||Ba[e.toLowerCase()]:void 0}function Gg(e){var t={},r,n;for(n in e)Te(e,n)&&(r=zr(n),r&&(t[r]=e[n]));return t}var zb={};function Gt(e,t){zb[e]=t}function rU(e){var t=[],r;for(r in e)Te(e,r)&&t.push({unit:r,priority:zb[r]});return t.sort(function(n,i){return n.priority-i.priority}),t}function af(e){return e%4===0&&e%100!==0||e%400===0}function Ar(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function we(e){var t=+e,r=0;return t!==0&&isFinite(t)&&(r=Ar(t)),r}function Gs(e,t){return function(r){return r!=null?(Yb(this,e,r),B.updateOffset(this,t),this):Wu(this,e)}}function Wu(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function Yb(e,t,r){e.isValid()&&!isNaN(r)&&(t==="FullYear"&&af(e.year())&&e.month()===1&&e.date()===29?(r=we(r),e._d["set"+(e._isUTC?"UTC":"")+t](r,e.month(),hf(r,e.month()))):e._d["set"+(e._isUTC?"UTC":"")+t](r))}function nU(e){return e=zr(e),Cn(this[e])?this[e]():this}function iU(e,t){if(typeof e=="object"){e=Gg(e);var r=rU(e),n,i=r.length;for(n=0;n68?1900:2e3)};var Xb=Gs("FullYear",!0);function bU(){return af(this.year())}function kU(e,t,r,n,i,o,a){var c;return e<100&&e>=0?(c=new Date(e+400,t,r,n,i,o,a),isFinite(c.getFullYear())&&c.setFullYear(e)):c=new Date(e,t,r,n,i,o,a),c}function yl(e){var t,r;return e<100&&e>=0?(r=Array.prototype.slice.call(arguments),r[0]=e+400,t=new Date(Date.UTC.apply(null,r)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Ku(e,t,r){var n=7+t-r,i=(7+yl(e,0,n).getUTCDay()-t)%7;return-i+n-1}function Qb(e,t,r,n,i){var o=(7+r-n)%7,a=Ku(e,n,i),c=1+7*(t-1)+o+a,d,h;return c<=0?(d=e-1,h=Wa(d)+c):c>Wa(e)?(d=e+1,h=c-Wa(e)):(d=e,h=c),{year:d,dayOfYear:h}}function wl(e,t,r){var n=Ku(e.year(),t,r),i=Math.floor((e.dayOfYear()-n-1)/7)+1,o,a;return i<1?(a=e.year()-1,o=i+qn(a,t,r)):i>qn(e.year(),t,r)?(o=i-qn(e.year(),t,r),a=e.year()+1):(a=e.year(),o=i),{week:o,year:a}}function qn(e,t,r){var n=Ku(e,t,r),i=Ku(e+1,t,r);return(Wa(e)-n+i)/7}se("w",["ww",2],"wo","week");se("W",["WW",2],"Wo","isoWeek");Wt("week","w");Wt("isoWeek","W");Gt("week",5);Gt("isoWeek",5);q("w",Xe);q("ww",Xe,Cr);q("W",Xe);q("WW",Xe,Cr);Nl(["w","ww","W","WW"],function(e,t,r,n){t[n.substr(0,1)]=we(e)});function CU(e){return wl(e,this._week.dow,this._week.doy).week}var DU={dow:0,doy:6};function jU(){return this._week.dow}function EU(){return this._week.doy}function AU(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,"d")}function TU(e){var t=wl(this,1,4).week;return e==null?t:this.add((e-t)*7,"d")}se("d",0,"do","day");se("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)});se("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)});se("dddd",0,0,function(e){return this.localeData().weekdays(this,e)});se("e",0,0,"weekday");se("E",0,0,"isoWeekday");Wt("day","d");Wt("weekday","e");Wt("isoWeekday","E");Gt("day",11);Gt("weekday",11);Gt("isoWeekday",11);q("d",Xe);q("e",Xe);q("E",Xe);q("dd",function(e,t){return t.weekdaysMinRegex(e)});q("ddd",function(e,t){return t.weekdaysShortRegex(e)});q("dddd",function(e,t){return t.weekdaysRegex(e)});Nl(["dd","ddd","dddd"],function(e,t,r,n){var i=r._locale.weekdaysParse(e,n,r._strict);i!=null?t.d=i:pe(r).invalidWeekday=e});Nl(["d","e","E"],function(e,t,r,n){t[n]=we(e)});function RU(e,t){return typeof e!="string"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e=="number"?e:null):parseInt(e,10)}function OU(e,t){return typeof e=="string"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Qg(e,t){return e.slice(t,7).concat(e.slice(0,t))}var PU="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),qb="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),MU="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),LU=Il,IU=Il,NU=Il;function zU(e,t){var r=en(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?"format":"standalone"];return e===!0?Qg(r,this._week.dow):e?r[e.day()]:r}function YU(e){return e===!0?Qg(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function HU(e){return e===!0?Qg(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function VU(e,t,r){var n,i,o,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],n=0;n<7;++n)o=kn([2e3,1]).day(n),this._minWeekdaysParse[n]=this.weekdaysMin(o,"").toLocaleLowerCase(),this._shortWeekdaysParse[n]=this.weekdaysShort(o,"").toLocaleLowerCase(),this._weekdaysParse[n]=this.weekdays(o,"").toLocaleLowerCase();return r?t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1?i:null):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null):(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null):t==="dddd"?(i=dt.call(this._weekdaysParse,a),i!==-1||(i=dt.call(this._shortWeekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):t==="ddd"?(i=dt.call(this._shortWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._minWeekdaysParse,a),i!==-1?i:null)):(i=dt.call(this._minWeekdaysParse,a),i!==-1||(i=dt.call(this._weekdaysParse,a),i!==-1)?i:(i=dt.call(this._shortWeekdaysParse,a),i!==-1?i:null))}function FU(e,t,r){var n,i,o;if(this._weekdaysParseExact)return VU.call(this,e,t,r);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),n=0;n<7;n++){if(i=kn([2e3,1]).day(n),r&&!this._fullWeekdaysParse[n]&&(this._fullWeekdaysParse[n]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[n]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[n]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[n]||(o="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[n]=new RegExp(o.replace(".",""),"i")),r&&t==="dddd"&&this._fullWeekdaysParse[n].test(e))return n;if(r&&t==="ddd"&&this._shortWeekdaysParse[n].test(e))return n;if(r&&t==="dd"&&this._minWeekdaysParse[n].test(e))return n;if(!r&&this._weekdaysParse[n].test(e))return n}}function UU(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=RU(e,this.localeData()),this.add(e-t,"d")):t}function $U(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,"d")}function BU(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=OU(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function WU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Te(this,"_weekdaysRegex")||(this._weekdaysRegex=LU),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function GU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Te(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=IU),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function KU(e){return this._weekdaysParseExact?(Te(this,"_weekdaysRegex")||qg.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Te(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=NU),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function qg(){function e(g,v){return v.length-g.length}var t=[],r=[],n=[],i=[],o,a,c,d,h;for(o=0;o<7;o++)a=kn([2e3,1]).day(o),c=vr(this.weekdaysMin(a,"")),d=vr(this.weekdaysShort(a,"")),h=vr(this.weekdays(a,"")),t.push(c),r.push(d),n.push(h),i.push(c),i.push(d),i.push(h);t.sort(e),r.sort(e),n.sort(e),i.sort(e),this._weekdaysRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+r.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+t.join("|")+")","i")}function Zg(){return this.hours()%12||12}function XU(){return this.hours()||24}se("H",["HH",2],0,"hour");se("h",["hh",2],0,Zg);se("k",["kk",2],0,XU);se("hmm",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)});se("hmmss",0,0,function(){return""+Zg.apply(this)+xn(this.minutes(),2)+xn(this.seconds(),2)});se("Hmm",0,0,function(){return""+this.hours()+xn(this.minutes(),2)});se("Hmmss",0,0,function(){return""+this.hours()+xn(this.minutes(),2)+xn(this.seconds(),2)});function Zb(e,t){se(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}Zb("a",!0);Zb("A",!1);Wt("hour","h");Gt("hour",13);function Jb(e,t){return t._meridiemParse}q("a",Jb);q("A",Jb);q("H",Xe);q("h",Xe);q("k",Xe);q("HH",Xe,Cr);q("hh",Xe,Cr);q("kk",Xe,Cr);q("hmm",Fb);q("hmmss",Ub);q("Hmm",Fb);q("Hmmss",Ub);He(["H","HH"],Ct);He(["k","kk"],function(e,t,r){var n=we(e);t[Ct]=n===24?0:n});He(["a","A"],function(e,t,r){r._isPm=r._locale.isPM(e),r._meridiem=e});He(["h","hh"],function(e,t,r){t[Ct]=we(e),pe(r).bigHour=!0});He("hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n)),pe(r).bigHour=!0});He("hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i)),pe(r).bigHour=!0});He("Hmm",function(e,t,r){var n=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n))});He("Hmmss",function(e,t,r){var n=e.length-4,i=e.length-2;t[Ct]=we(e.substr(0,n)),t[Xr]=we(e.substr(n,2)),t[Kn]=we(e.substr(i))});function QU(e){return(e+"").toLowerCase().charAt(0)==="p"}var qU=/[ap]\.?m?\.?/i,ZU=Gs("Hours",!0);function JU(e,t,r){return e>11?r?"pm":"PM":r?"am":"AM"}var ek={calendar:FF,longDateFormat:WF,invalidDate:KF,ordinal:QF,dayOfMonthOrdinalParse:qF,relativeTime:JF,months:hU,monthsShort:$b,week:DU,weekdays:PU,weekdaysMin:MU,weekdaysShort:qb,meridiemParse:qU},qe={},ka={},xl;function e$(e,t){var r,n=Math.min(e.length,t.length);for(r=0;r0;){if(i=mf(o.slice(0,r).join("-")),i)return i;if(n&&n.length>=r&&e$(o,n)>=r-1)break;r--}t++}return xl}function r$(e){return e.match("^[^/\\\\]*$")!=null}function mf(e){var t=null,r;if(qe[e]===void 0&&typeof ou<"u"&&ou&&ou.exports&&r$(e))try{t=xl._abbr,r=require,r("./locale/"+e),Yi(t)}catch{qe[e]=null}return qe[e]}function Yi(e,t){var r;return e&&(lr(t)?r=ai(e):r=Jg(e,t),r?xl=r:typeof console<"u"&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),xl._abbr}function Jg(e,t){if(t!==null){var r,n=ek;if(t.abbr=e,qe[e]!=null)Ib("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=qe[e]._config;else if(t.parentLocale!=null)if(qe[t.parentLocale]!=null)n=qe[t.parentLocale]._config;else if(r=mf(t.parentLocale),r!=null)n=r._config;else return ka[t.parentLocale]||(ka[t.parentLocale]=[]),ka[t.parentLocale].push({name:e,config:t}),null;return qe[e]=new Bg(Gp(n,t)),ka[e]&&ka[e].forEach(function(i){Jg(i.name,i.config)}),Yi(e),qe[e]}else return delete qe[e],null}function n$(e,t){if(t!=null){var r,n,i=ek;qe[e]!=null&&qe[e].parentLocale!=null?qe[e].set(Gp(qe[e]._config,t)):(n=mf(e),n!=null&&(i=n._config),t=Gp(i,t),n==null&&(t.abbr=e),r=new Bg(t),r.parentLocale=qe[e],qe[e]=r),Yi(e)}else qe[e]!=null&&(qe[e].parentLocale!=null?(qe[e]=qe[e].parentLocale,e===Yi()&&Yi(e)):qe[e]!=null&&delete qe[e]);return qe[e]}function ai(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return xl;if(!en(e)){if(t=mf(e),t)return t;e=[e]}return t$(e)}function i$(){return Kp(qe)}function ev(e){var t,r=e._a;return r&&pe(e).overflow===-2&&(t=r[Gn]<0||r[Gn]>11?Gn:r[pn]<1||r[pn]>hf(r[$t],r[Gn])?pn:r[Ct]<0||r[Ct]>24||r[Ct]===24&&(r[Xr]!==0||r[Kn]!==0||r[lo]!==0)?Ct:r[Xr]<0||r[Xr]>59?Xr:r[Kn]<0||r[Kn]>59?Kn:r[lo]<0||r[lo]>999?lo:-1,pe(e)._overflowDayOfYear&&(t<$t||t>pn)&&(t=pn),pe(e)._overflowWeeks&&t===-1&&(t=uU),pe(e)._overflowWeekday&&t===-1&&(t=dU),pe(e).overflow=t),e}var o$=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,s$=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,a$=/Z|[+-]\d\d(?::?\d\d)?/,Ic=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Bh=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],l$=/^\/?Date\((-?\d+)/i,c$=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,u$={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function tk(e){var t,r,n=e._i,i=o$.exec(n)||s$.exec(n),o,a,c,d,h=Ic.length,g=Bh.length;if(i){for(pe(e).iso=!0,t=0,r=h;tWa(a)||e._dayOfYear===0)&&(pe(e)._overflowDayOfYear=!0),r=yl(a,0,e._dayOfYear),e._a[Gn]=r.getUTCMonth(),e._a[pn]=r.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=n[t]=i[t];for(;t<7;t++)e._a[t]=n[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[Ct]===24&&e._a[Xr]===0&&e._a[Kn]===0&&e._a[lo]===0&&(e._nextDay=!0,e._a[Ct]=0),e._d=(e._useUTC?yl:kU).apply(null,n),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Ct]=24),e._w&&typeof e._w.d<"u"&&e._w.d!==o&&(pe(e).weekdayMismatch=!0)}}function y$(e){var t,r,n,i,o,a,c,d,h;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(o=1,a=4,r=Wo(t.GG,e._a[$t],wl(Ke(),1,4).year),n=Wo(t.W,1),i=Wo(t.E,1),(i<1||i>7)&&(d=!0)):(o=e._locale._week.dow,a=e._locale._week.doy,h=wl(Ke(),o,a),r=Wo(t.gg,e._a[$t],h.year),n=Wo(t.w,h.week),t.d!=null?(i=t.d,(i<0||i>6)&&(d=!0)):t.e!=null?(i=t.e+o,(t.e<0||t.e>6)&&(d=!0)):i=o),n<1||n>qn(r,o,a)?pe(e)._overflowWeeks=!0:d!=null?pe(e)._overflowWeekday=!0:(c=Qb(r,n,i,o,a),e._a[$t]=c.year,e._dayOfYear=c.dayOfYear)}B.ISO_8601=function(){};B.RFC_2822=function(){};function rv(e){if(e._f===B.ISO_8601){tk(e);return}if(e._f===B.RFC_2822){rk(e);return}e._a=[],pe(e).empty=!0;var t=""+e._i,r,n,i,o,a,c=t.length,d=0,h,g;for(i=Nb(e._f,e._locale).match(Wg)||[],g=i.length,r=0;r0&&pe(e).unusedInput.push(a),t=t.slice(t.indexOf(n)+n.length),d+=n.length),ys[o]?(n?pe(e).empty=!1:pe(e).unusedTokens.push(o),cU(o,n,e)):e._strict&&!n&&pe(e).unusedTokens.push(o);pe(e).charsLeftOver=c-d,t.length>0&&pe(e).unusedInput.push(t),e._a[Ct]<=12&&pe(e).bigHour===!0&&e._a[Ct]>0&&(pe(e).bigHour=void 0),pe(e).parsedDateParts=e._a.slice(0),pe(e).meridiem=e._meridiem,e._a[Ct]=w$(e._locale,e._a[Ct],e._meridiem),h=pe(e).era,h!==null&&(e._a[$t]=e._locale.erasConvertYear(h,e._a[$t])),tv(e),ev(e)}function w$(e,t,r){var n;return r==null?t:e.meridiemHour!=null?e.meridiemHour(t,r):(e.isPM!=null&&(n=e.isPM(r),n&&t<12&&(t+=12),!n&&t===12&&(t=0)),t)}function x$(e){var t,r,n,i,o,a,c=!1,d=e._f.length;if(d===0){pe(e).invalidFormat=!0,e._d=new Date(NaN);return}for(i=0;ithis?this:e:sf()});function ok(e,t){var r,n;if(t.length===1&&en(t[0])&&(t=t[0]),!t.length)return Ke();for(r=t[0],n=1;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function V$(){if(!lr(this._isDSTShifted))return this._isDSTShifted;var e={},t;return $g(e,this),e=nk(e),e._a?(t=e._isUTC?kn(e._a):Ke(e._a),this._isDSTShifted=this.isValid()&&O$(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function F$(){return this.isValid()?!this._isUTC:!1}function U$(){return this.isValid()?this._isUTC:!1}function ak(){return this.isValid()?this._isUTC&&this._offset===0:!1}var $$=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,B$=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function rn(e,t){var r=e,n=null,i,o,a;return nu(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:ri(e)||!isNaN(+e)?(r={},t?r[t]=+e:r.milliseconds=+e):(n=$$.exec(e))?(i=n[1]==="-"?-1:1,r={y:0,d:we(n[pn])*i,h:we(n[Ct])*i,m:we(n[Xr])*i,s:we(n[Kn])*i,ms:we(Qp(n[lo]*1e3))*i}):(n=B$.exec(e))?(i=n[1]==="-"?-1:1,r={y:Ji(n[2],i),M:Ji(n[3],i),w:Ji(n[4],i),d:Ji(n[5],i),h:Ji(n[6],i),m:Ji(n[7],i),s:Ji(n[8],i)}):r==null?r={}:typeof r=="object"&&("from"in r||"to"in r)&&(a=W$(Ke(r.from),Ke(r.to)),r={},r.ms=a.milliseconds,r.M=a.months),o=new pf(r),nu(e)&&Te(e,"_locale")&&(o._locale=e._locale),nu(e)&&Te(e,"_isValid")&&(o._isValid=e._isValid),o}rn.fn=pf.prototype;rn.invalid=R$;function Ji(e,t){var r=e&&parseFloat(e.replace(",","."));return(isNaN(r)?0:r)*t}function Uw(e,t){var r={};return r.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(r.months,"M").isAfter(t)&&--r.months,r.milliseconds=+t-+e.clone().add(r.months,"M"),r}function W$(e,t){var r;return e.isValid()&&t.isValid()?(t=iv(t,e),e.isBefore(t)?r=Uw(e,t):(r=Uw(t,e),r.milliseconds=-r.milliseconds,r.months=-r.months),r):{milliseconds:0,months:0}}function lk(e,t){return function(r,n){var i,o;return n!==null&&!isNaN(+n)&&(Ib(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),o=r,r=n,n=o),i=rn(r,n),ck(this,i,e),this}}function ck(e,t,r,n){var i=t._milliseconds,o=Qp(t._days),a=Qp(t._months);e.isValid()&&(n=n??!0,a&&Wb(e,Wu(e,"Month")+a*r),o&&Yb(e,"Date",Wu(e,"Date")+o*r),i&&e._d.setTime(e._d.valueOf()+i*r),n&&B.updateOffset(e,o||a))}var G$=lk(1,"add"),K$=lk(-1,"subtract");function uk(e){return typeof e=="string"||e instanceof String}function X$(e){return tn(e)||Ml(e)||uk(e)||ri(e)||q$(e)||Q$(e)||e===null||e===void 0}function Q$(e){var t=mo(e)&&!Fg(e),r=!1,n=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],i,o,a=n.length;for(i=0;ir.valueOf():r.valueOf()9999?ru(r,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):Cn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",ru(r,"Z")):ru(r,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function dB(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="",r,n,i,o;return this.isLocal()||(e=this.utcOffset()===0?"moment.utc":"moment.parseZone",t="Z"),r="["+e+'("]',n=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i="-MM-DD[T]HH:mm:ss.SSS",o=t+'[")]',this.format(r+n+i+o)}function fB(e){e||(e=this.isUtc()?B.defaultFormatUtc:B.defaultFormat);var t=ru(this,e);return this.localeData().postformat(t)}function hB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function mB(e){return this.from(Ke(),e)}function pB(e,t){return this.isValid()&&(tn(e)&&e.isValid()||Ke(e).isValid())?rn({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function gB(e){return this.to(Ke(),e)}function dk(e){var t;return e===void 0?this._locale._abbr:(t=ai(e),t!=null&&(this._locale=t),this)}var fk=Nr("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return e===void 0?this.localeData():this.locale(e)});function hk(){return this._locale}var Xu=1e3,ws=60*Xu,Qu=60*ws,mk=(365*400+97)*24*Qu;function xs(e,t){return(e%t+t)%t}function pk(e,t,r){return e<100&&e>=0?new Date(e+400,t,r)-mk:new Date(e,t,r).valueOf()}function gk(e,t,r){return e<100&&e>=0?Date.UTC(e+400,t,r)-mk:Date.UTC(e,t,r)}function vB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year(),0,1);break;case"quarter":t=r(this.year(),this.month()-this.month()%3,1);break;case"month":t=r(this.year(),this.month(),1);break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":t=r(this.year(),this.month(),this.date());break;case"hour":t=this._d.valueOf(),t-=xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu);break;case"minute":t=this._d.valueOf(),t-=xs(t,ws);break;case"second":t=this._d.valueOf(),t-=xs(t,Xu);break}return this._d.setTime(t),B.updateOffset(this,!0),this}function yB(e){var t,r;if(e=zr(e),e===void 0||e==="millisecond"||!this.isValid())return this;switch(r=this._isUTC?gk:pk,e){case"year":t=r(this.year()+1,0,1)-1;break;case"quarter":t=r(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":t=r(this.year(),this.month()+1,1)-1;break;case"week":t=r(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":t=r(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":t=r(this.year(),this.month(),this.date()+1)-1;break;case"hour":t=this._d.valueOf(),t+=Qu-xs(t+(this._isUTC?0:this.utcOffset()*ws),Qu)-1;break;case"minute":t=this._d.valueOf(),t+=ws-xs(t,ws)-1;break;case"second":t=this._d.valueOf(),t+=Xu-xs(t,Xu)-1;break}return this._d.setTime(t),B.updateOffset(this,!0),this}function wB(){return this._d.valueOf()-(this._offset||0)*6e4}function xB(){return Math.floor(this.valueOf()/1e3)}function _B(){return new Date(this.valueOf())}function SB(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function bB(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function kB(){return this.isValid()?this.toISOString():null}function CB(){return Ug(this)}function DB(){return Di({},pe(this))}function jB(){return pe(this).overflow}function EB(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}se("N",0,0,"eraAbbr");se("NN",0,0,"eraAbbr");se("NNN",0,0,"eraAbbr");se("NNNN",0,0,"eraName");se("NNNNN",0,0,"eraNarrow");se("y",["y",1],"yo","eraYear");se("y",["yy",2],0,"eraYear");se("y",["yyy",3],0,"eraYear");se("y",["yyyy",4],0,"eraYear");q("N",ov);q("NN",ov);q("NNN",ov);q("NNNN",YB);q("NNNNN",HB);He(["N","NN","NNN","NNNN","NNNNN"],function(e,t,r,n){var i=r._locale.erasParse(e,n,r._strict);i?pe(r).era=i:pe(r).invalidEra=e});q("y",Ks);q("yy",Ks);q("yyy",Ks);q("yyyy",Ks);q("yo",VB);He(["y","yy","yyy","yyyy"],$t);He(["yo"],function(e,t,r,n){var i;r._locale._eraYearOrdinalRegex&&(i=e.match(r._locale._eraYearOrdinalRegex)),r._locale.eraYearOrdinalParse?t[$t]=r._locale.eraYearOrdinalParse(e,i):t[$t]=parseInt(e,10)});function AB(e,t){var r,n,i,o=this._eras||ai("en")._eras;for(r=0,n=o.length;r=0)return o[n]}function RB(e,t){var r=e.since<=e.until?1:-1;return t===void 0?B(e.since).year():B(e.since).year()+(t-e.offset)*r}function OB(){var e,t,r,n=this.localeData().eras();for(e=0,t=n.length;eo&&(t=o),KB.call(this,e,t,r,n,i))}function KB(e,t,r,n,i){var o=Qb(e,t,r,n,i),a=yl(o.year,0,o.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}se("Q",0,"Qo","quarter");Wt("quarter","Q");Gt("quarter",7);q("Q",Hb);He("Q",function(e,t){t[Gn]=(we(e)-1)*3});function XB(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}se("D",["DD",2],"Do","date");Wt("date","D");Gt("date",9);q("D",Xe);q("DD",Xe,Cr);q("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});He(["D","DD"],pn);He("Do",function(e,t){t[pn]=we(e.match(Xe)[0])});var yk=Gs("Date",!0);se("DDD",["DDDD",3],"DDDo","dayOfYear");Wt("dayOfYear","DDD");Gt("dayOfYear",4);q("DDD",cf);q("DDDD",Vb);He(["DDD","DDDD"],function(e,t,r){r._dayOfYear=we(e)});function QB(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return e==null?t:this.add(e-t,"d")}se("m",["mm",2],0,"minute");Wt("minute","m");Gt("minute",14);q("m",Xe);q("mm",Xe,Cr);He(["m","mm"],Xr);var qB=Gs("Minutes",!1);se("s",["ss",2],0,"second");Wt("second","s");Gt("second",15);q("s",Xe);q("ss",Xe,Cr);He(["s","ss"],Kn);var ZB=Gs("Seconds",!1);se("S",0,0,function(){return~~(this.millisecond()/100)});se(0,["SS",2],0,function(){return~~(this.millisecond()/10)});se(0,["SSS",3],0,"millisecond");se(0,["SSSS",4],0,function(){return this.millisecond()*10});se(0,["SSSSS",5],0,function(){return this.millisecond()*100});se(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3});se(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4});se(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5});se(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6});Wt("millisecond","ms");Gt("millisecond",16);q("S",cf,Hb);q("SS",cf,Cr);q("SSS",cf,Vb);var ji,wk;for(ji="SSSS";ji.length<=9;ji+="S")q(ji,Ks);function JB(e,t){t[lo]=we(("0."+e)*1e3)}for(ji="S";ji.length<=9;ji+="S")He(ji,JB);wk=Gs("Milliseconds",!1);se("z",0,0,"zoneAbbr");se("zz",0,0,"zoneName");function e9(){return this._isUTC?"UTC":""}function t9(){return this._isUTC?"Coordinated Universal Time":""}var U=Ll.prototype;U.add=G$;U.calendar=eB;U.clone=tB;U.diff=lB;U.endOf=yB;U.format=fB;U.from=hB;U.fromNow=mB;U.to=pB;U.toNow=gB;U.get=nU;U.invalidAt=jB;U.isAfter=rB;U.isBefore=nB;U.isBetween=iB;U.isSame=oB;U.isSameOrAfter=sB;U.isSameOrBefore=aB;U.isValid=CB;U.lang=fk;U.locale=dk;U.localeData=hk;U.max=C$;U.min=k$;U.parsingFlags=DB;U.set=iU;U.startOf=vB;U.subtract=K$;U.toArray=SB;U.toObject=bB;U.toDate=_B;U.toISOString=uB;U.inspect=dB;typeof Symbol<"u"&&Symbol.for!=null&&(U[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"});U.toJSON=kB;U.toString=cB;U.unix=xB;U.valueOf=wB;U.creationData=EB;U.eraName=OB;U.eraNarrow=PB;U.eraAbbr=MB;U.eraYear=LB;U.year=Xb;U.isLeapYear=bU;U.weekYear=FB;U.isoWeekYear=UB;U.quarter=U.quarters=XB;U.month=Gb;U.daysInMonth=xU;U.week=U.weeks=AU;U.isoWeek=U.isoWeeks=TU;U.weeksInYear=WB;U.weeksInWeekYear=GB;U.isoWeeksInYear=$B;U.isoWeeksInISOWeekYear=BB;U.date=yk;U.day=U.days=UU;U.weekday=$U;U.isoWeekday=BU;U.dayOfYear=QB;U.hour=U.hours=ZU;U.minute=U.minutes=qB;U.second=U.seconds=ZB;U.millisecond=U.milliseconds=wk;U.utcOffset=M$;U.utc=I$;U.local=N$;U.parseZone=z$;U.hasAlignedHourOffset=Y$;U.isDST=H$;U.isLocal=F$;U.isUtcOffset=U$;U.isUtc=ak;U.isUTC=ak;U.zoneAbbr=e9;U.zoneName=t9;U.dates=Nr("dates accessor is deprecated. Use date instead.",yk);U.months=Nr("months accessor is deprecated. Use month instead",Gb);U.years=Nr("years accessor is deprecated. Use year instead",Xb);U.zone=Nr("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",L$);U.isDSTShifted=Nr("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",V$);function r9(e){return Ke(e*1e3)}function n9(){return Ke.apply(null,arguments).parseZone()}function xk(e){return e}var Re=Bg.prototype;Re.calendar=UF;Re.longDateFormat=GF;Re.invalidDate=XF;Re.ordinal=ZF;Re.preparse=xk;Re.postformat=xk;Re.relativeTime=eU;Re.pastFuture=tU;Re.set=VF;Re.eras=AB;Re.erasParse=TB;Re.erasConvertYear=RB;Re.erasAbbrRegex=NB;Re.erasNameRegex=IB;Re.erasNarrowRegex=zB;Re.months=gU;Re.monthsShort=vU;Re.monthsParse=wU;Re.monthsRegex=SU;Re.monthsShortRegex=_U;Re.week=CU;Re.firstDayOfYear=EU;Re.firstDayOfWeek=jU;Re.weekdays=zU;Re.weekdaysMin=HU;Re.weekdaysShort=YU;Re.weekdaysParse=FU;Re.weekdaysRegex=WU;Re.weekdaysShortRegex=GU;Re.weekdaysMinRegex=KU;Re.isPM=QU;Re.meridiem=JU;function qu(e,t,r,n){var i=ai(),o=kn().set(n,t);return i[r](o,e)}function _k(e,t,r){if(ri(e)&&(t=e,e=void 0),e=e||"",t!=null)return qu(e,t,r,"month");var n,i=[];for(n=0;n<12;n++)i[n]=qu(e,n,r,"month");return i}function av(e,t,r,n){typeof e=="boolean"?(ri(t)&&(r=t,t=void 0),t=t||""):(t=e,r=t,e=!1,ri(t)&&(r=t,t=void 0),t=t||"");var i=ai(),o=e?i._week.dow:0,a,c=[];if(r!=null)return qu(t,(r+o)%7,n,"day");for(a=0;a<7;a++)c[a]=qu(t,(a+o)%7,n,"day");return c}function i9(e,t){return _k(e,t,"months")}function o9(e,t){return _k(e,t,"monthsShort")}function s9(e,t,r){return av(e,t,r,"weekdays")}function a9(e,t,r){return av(e,t,r,"weekdaysShort")}function l9(e,t,r){return av(e,t,r,"weekdaysMin")}Yi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,r=we(e%100/10)===1?"th":t===1?"st":t===2?"nd":t===3?"rd":"th";return e+r}});B.lang=Nr("moment.lang is deprecated. Use moment.locale instead.",Yi);B.langData=Nr("moment.langData is deprecated. Use moment.localeData instead.",ai);var zn=Math.abs;function c9(){var e=this._data;return this._milliseconds=zn(this._milliseconds),this._days=zn(this._days),this._months=zn(this._months),e.milliseconds=zn(e.milliseconds),e.seconds=zn(e.seconds),e.minutes=zn(e.minutes),e.hours=zn(e.hours),e.months=zn(e.months),e.years=zn(e.years),this}function Sk(e,t,r,n){var i=rn(t,r);return e._milliseconds+=n*i._milliseconds,e._days+=n*i._days,e._months+=n*i._months,e._bubble()}function u9(e,t){return Sk(this,e,t,1)}function d9(e,t){return Sk(this,e,t,-1)}function $w(e){return e<0?Math.floor(e):Math.ceil(e)}function f9(){var e=this._milliseconds,t=this._days,r=this._months,n=this._data,i,o,a,c,d;return e>=0&&t>=0&&r>=0||e<=0&&t<=0&&r<=0||(e+=$w(Zp(r)+t)*864e5,t=0,r=0),n.milliseconds=e%1e3,i=Ar(e/1e3),n.seconds=i%60,o=Ar(i/60),n.minutes=o%60,a=Ar(o/60),n.hours=a%24,t+=Ar(a/24),d=Ar(bk(t)),r+=d,t-=$w(Zp(d)),c=Ar(r/12),r%=12,n.days=t,n.months=r,n.years=c,this}function bk(e){return e*4800/146097}function Zp(e){return e*146097/4800}function h9(e){if(!this.isValid())return NaN;var t,r,n=this._milliseconds;if(e=zr(e),e==="month"||e==="quarter"||e==="year")switch(t=this._days+n/864e5,r=this._months+bk(t),e){case"month":return r;case"quarter":return r/3;case"year":return r/12}else switch(t=this._days+Math.round(Zp(this._months)),e){case"week":return t/7+n/6048e5;case"day":return t+n/864e5;case"hour":return t*24+n/36e5;case"minute":return t*1440+n/6e4;case"second":return t*86400+n/1e3;case"millisecond":return Math.floor(t*864e5)+n;default:throw new Error("Unknown unit "+e)}}function m9(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+we(this._months/12)*31536e6:NaN}function li(e){return function(){return this.as(e)}}var p9=li("ms"),g9=li("s"),v9=li("m"),y9=li("h"),w9=li("d"),x9=li("w"),_9=li("M"),S9=li("Q"),b9=li("y");function k9(){return rn(this)}function C9(e){return e=zr(e),this.isValid()?this[e+"s"]():NaN}function Eo(e){return function(){return this.isValid()?this._data[e]:NaN}}var D9=Eo("milliseconds"),j9=Eo("seconds"),E9=Eo("minutes"),A9=Eo("hours"),T9=Eo("days"),R9=Eo("months"),O9=Eo("years");function P9(){return Ar(this.days()/7)}var Fn=Math.round,cs={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function M9(e,t,r,n,i){return i.relativeTime(t||1,!!r,e,n)}function L9(e,t,r,n){var i=rn(e).abs(),o=Fn(i.as("s")),a=Fn(i.as("m")),c=Fn(i.as("h")),d=Fn(i.as("d")),h=Fn(i.as("M")),g=Fn(i.as("w")),v=Fn(i.as("y")),_=o<=r.ss&&["s",o]||o0,_[4]=n,M9.apply(null,_)}function I9(e){return e===void 0?Fn:typeof e=="function"?(Fn=e,!0):!1}function N9(e,t){return cs[e]===void 0?!1:t===void 0?cs[e]:(cs[e]=t,e==="s"&&(cs.ss=t-1),!0)}function z9(e,t){if(!this.isValid())return this.localeData().invalidDate();var r=!1,n=cs,i,o;return typeof e=="object"&&(t=e,e=!1),typeof e=="boolean"&&(r=e),typeof t=="object"&&(n=Object.assign({},cs,t),t.s!=null&&t.ss==null&&(n.ss=t.s-1)),i=this.localeData(),o=L9(this,!r,n,i),r&&(o=i.pastFuture(+this,o)),i.postformat(o)}var Wh=Math.abs;function zo(e){return(e>0)-(e<0)||+e}function vf(){if(!this.isValid())return this.localeData().invalidDate();var e=Wh(this._milliseconds)/1e3,t=Wh(this._days),r=Wh(this._months),n,i,o,a,c=this.asSeconds(),d,h,g,v;return c?(n=Ar(e/60),i=Ar(n/60),e%=60,n%=60,o=Ar(r/12),r%=12,a=e?e.toFixed(3).replace(/\.?0+$/,""):"",d=c<0?"-":"",h=zo(this._months)!==zo(c)?"-":"",g=zo(this._days)!==zo(c)?"-":"",v=zo(this._milliseconds)!==zo(c)?"-":"",d+"P"+(o?h+o+"Y":"")+(r?h+r+"M":"")+(t?g+t+"D":"")+(i||n||e?"T":"")+(i?v+i+"H":"")+(n?v+n+"M":"")+(e?v+a+"S":"")):"P0D"}var De=pf.prototype;De.isValid=T$;De.abs=c9;De.add=u9;De.subtract=d9;De.as=h9;De.asMilliseconds=p9;De.asSeconds=g9;De.asMinutes=v9;De.asHours=y9;De.asDays=w9;De.asWeeks=x9;De.asMonths=_9;De.asQuarters=S9;De.asYears=b9;De.valueOf=m9;De._bubble=f9;De.clone=k9;De.get=C9;De.milliseconds=D9;De.seconds=j9;De.minutes=E9;De.hours=A9;De.days=T9;De.weeks=P9;De.months=R9;De.years=O9;De.humanize=z9;De.toISOString=vf;De.toString=vf;De.toJSON=vf;De.locale=dk;De.localeData=hk;De.toIsoString=Nr("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",vf);De.lang=fk;se("X",0,0,"unix");se("x",0,0,"valueOf");q("x",df);q("X",sU);He("X",function(e,t,r){r._d=new Date(parseFloat(e)*1e3)});He("x",function(e,t,r){r._d=new Date(we(e))});//! moment.js +B.version="2.29.4";YF(Ke);B.fn=U;B.min=D$;B.max=j$;B.now=E$;B.utc=kn;B.unix=r9;B.months=i9;B.isDate=Ml;B.locale=Yi;B.invalid=sf;B.duration=rn;B.isMoment=tn;B.weekdays=s9;B.parseZone=n9;B.localeData=ai;B.isDuration=nu;B.monthsShort=o9;B.weekdaysMin=l9;B.defineLocale=Jg;B.updateLocale=n$;B.locales=i$;B.weekdaysShort=a9;B.normalizeUnits=zr;B.relativeTimeRounding=I9;B.relativeTimeThreshold=N9;B.calendarFormat=J$;B.prototype=U;B.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"};const Y9="/zh-cn/assets/blog-cover-95d8a382.png",H9=new Map([["blogs","技术博客"],["events","活动预告"],["highlights","精彩回顾"],["news-honor-dynamic","新闻 / 荣誉"]]),V9=f.main` background: #fff; -`,Y9=f.div` +`,F9=f.div` max-width: 1440px; margin-inline: auto; padding: 0.96rem 1.65rem 1.56rem; -`,H9=f.div` +`,U9=f.div` display: flex; flex-direction: row-reverse; justify-content: space-between; @@ -2238,23 +2250,23 @@ B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B &:last-child { margin-bottom: 0; } -`,F9=f.img` +`,$9=f.img` padding-left: 0.47rem; width: 4.35rem; height: min-content; border-radius: 0.08rem; -`,V9=f.div` +`,B9=f.div` width: 56%; flex: 1; padding-top: calc(1.22rem - 0.96rem); padding-bottom: calc(0.53rem - 0.27rem); -`,U9=f.div` +`,W9=f.div` padding-bottom: 0.05rem; font-size: 0.15rem; line-height: 0.3rem; font-weight: 500; color: #1c5cff; -`,$9=f.div` +`,G9=f.div` padding-bottom: 0.26rem; font-size: 0.27rem; line-height: 0.33rem; @@ -2264,13 +2276,13 @@ B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B &:hover { color: #531dab; } -`,B9=f.div` +`,K9=f.div` padding-bottom: 0.13rem; font-size: 0.135rem; line-height: 0.24rem; font-weight: 400; color: #7d7d7d; -`,W9=f.div` +`,X9=f.div` display: flex; align-items: center; font-size: 0.12rem; @@ -2285,36 +2297,36 @@ B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B height: 0.08rem; background: #797979; border-radius: 50%; -`,G9=f.div` +`,Q9=f.div` padding-inline: 0.08rem; color: #2f54eb; border: 0.01rem solid #2f54eb; background: #d6e4ff; border-radius: 0.04rem; text-transform: capitalize; -`,K9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>C(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>C(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>C(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>C(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>C(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>C(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>C(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>C(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>C(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>C(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>C(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>C(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>C(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>C(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>C(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>C(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>C(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>C(()=>import("./index-daed041b.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>C(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>C(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>C(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>C(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>C(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>C(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>C(()=>import("./index-8c16a843.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>C(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>C(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>C(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>C(()=>import("./index-4b4d6acc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>C(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>C(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>C(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>C(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>C(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>C(()=>import("./index-cf399721.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>C(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>C(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>C(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>C(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>C(()=>import("./index-e0e6b52c.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>C(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>C(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>C(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>C(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>C(()=>import("./index-c29dde05.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>C(()=>import("./index-a1bcce61.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>C(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-e2a1595e.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>C(()=>import("./index-aaac1d05.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>C(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>C(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>C(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>C(()=>import("./index-07db2d14.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>C(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>C(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>C(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>C(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>C(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>C(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>C(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>C(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>C(()=>import("./index-a520ffab.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>C(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>C(()=>import("./index-c5edc5af.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>C(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>C(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>C(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>C(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>C(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>C(()=>import("./index-1c51c928.js"),[])}),X9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>C(()=>import("./index-67248222.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>C(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>C(()=>import("./index-405a2dbf.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>C(()=>import("./index-9ee6b548.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>C(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>C(()=>import("./index-ca4e9d9f.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>C(()=>import("./index-67a528fa.js"),[])}),Q9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>C(()=>import("./index-62952ba7.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>C(()=>import("./index-012df9e2.js"),[])}),q9=()=>{const e=ht(),t=si(),{title:r}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return K9;case"events":return Bw;case"highlights":return X9;case"news-honor-dynamic":return Q9;default:return Bw}})(),[o,a]=I.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return I.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:I9,children:r&&N9.get(r)}),l.jsx(z9,{children:l.jsx(Y9,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:_,description:b,author:k,editor:D,location:j,cover:y,tags:w}=d;return l.jsxs(H9,{children:[y&&l.jsx(F9,{src:y&&h[0]}),l.jsxs(V9,{children:[l.jsx(U9,{children:B(g).format("YYYY.M.D")}),l.jsx($9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:_}),l.jsx(B9,{children:b}),l.jsxs(W9,{children:[k&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["嘉宾:",k[0]]}),l.jsx(Kh,{})]}),D&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["编辑:",D[0]]}),l.jsx(Kh,{})]}),l.jsxs(Gh,{children:["发表于",j]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Kh,{}),w.map(S=>l.jsx(G9,{children:S},S))]})]})]})]},v)})})})]})},Z9=(e,t)=>{const r=I.useRef({});I.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,_)=>h(v.target.id)-h(_.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},J9=f.div``,eW=f.div` +`,q9=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>b(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>b(()=>import("./index-25293c60.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-f42f30bc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-951bfe33.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-884e893f.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.js"),[])}),Bw=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-0a77c99b.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-c648bdf6.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-5a282940.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>b(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-5d075b3e.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5f61d62d.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-4e05b5cd.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>b(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b0b5bfda.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-1c51c928.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-b9598d44.js"),[])}),Z9=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-e57be735.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-ca4e9d9f.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>import("./index-67a528fa.js"),[])}),J9=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>b(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>import("./index-012df9e2.js"),[])}),eW=()=>{const e=ht(),t=si(),{title:r}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[]);const i=(()=>{switch(r){case"blogs":return q9;case"events":return Bw;case"highlights":return Z9;case"news-honor-dynamic":return J9;default:return Bw}})(),[o,a]=I.useState([]),c=async()=>{a(await Promise.all(Object.keys(i).map(d=>i[d]())))};return I.useEffect(()=>{c()},[t.pathname]),l.jsxs(l.Fragment,{children:[l.jsx(Ir,{cover:Y9,children:r&&H9.get(r)}),l.jsx(V9,{children:l.jsx(F9,{children:o.reverse().map(({metadata:d,assetURLs:h})=>{const{date:g,title:v,label:_,description:k,author:C,editor:D,location:j,cover:y,tags:w}=d;return l.jsxs(U9,{children:[y&&l.jsx($9,{src:y&&h[0]}),l.jsxs(B9,{children:[l.jsx(W9,{children:B(g).format("YYYY.M.D")}),l.jsx(G9,{onClick:()=>{e(`${g}-${v.split(" ").join("-")}`)},children:_}),l.jsx(K9,{children:k}),l.jsxs(X9,{children:[C&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["嘉宾:",C[0]]}),l.jsx(Kh,{})]}),D&&l.jsxs(l.Fragment,{children:[l.jsxs(Gh,{children:["编辑:",D[0]]}),l.jsx(Kh,{})]}),l.jsxs(Gh,{children:["发表于",j]}),w&&l.jsxs(l.Fragment,{children:[l.jsx(Kh,{}),w.map(S=>l.jsx(Q9,{children:S},S))]})]})]})]},v)})})})]})},tW=(e,t)=>{const r=I.useRef({});I.useEffect(()=>{const n=c=>{r.current=c.reduce((g,v)=>(g[v.target.innerHTML]=v,g),r.current);const d=[];Object.keys(r.current).forEach(g=>{const v=r.current[g];v.isIntersecting&&d.push(v)});const h=g=>a.findIndex(v=>v.id===g);if(d.length===1)e(d[0].target.id);else if(d.length>1){const g=d.sort((v,_)=>h(v.target.id)-h(_.target.id));e(g[0].target.id)}},i={rootMargin:"0px 0px -40% 0px"},o=new IntersectionObserver(n,i),a=Array.from(document.querySelectorAll("h2, h3"));return a.forEach(c=>o.observe(c)),()=>o.disconnect()},[t])},rW=f.div``,nW=f.div` display: flex; max-width: 1440px; margin-inline: auto; padding-block: 0.64rem; padding-inline: 1.22rem; padding-top: 1.2rem; -`,tW=f.div` +`,iW=f.div` flex-grow: 1; padding-inline: 0.64rem; -`,rW=f.h1` +`,oW=f.h1` margin-bottom: 0.96rem; color: #1e1e1e; font-size: 0.4rem; line-height: 0.48rem; font-weight: 600; -`,nW=f.div` +`,sW=f.div` background: #fff; border-radius: 0.08rem; -`,iW=f.div` +`,aW=f.div` flex-shrink: 0; width: 300px; -`,oW=f.div` +`,lW=f.div` position: sticky; top: 1.2rem; left: 0; @@ -2323,7 +2335,7 @@ B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B border-radius: 0.08rem; max-height: 60vh; overflow-y: scroll; -`,sW=f.div` +`,cW=f.div` display: block; margin-block: 0.16rem; padding-left: ${({level:e})=>e===3?"48px":"16px"}; @@ -2333,14 +2345,14 @@ B.version="2.29.4";IV(Ke);B.fn=U;B.min=b$;B.max=k$;B.now=C$;B.utc=kn;B.unix=JB;B font-size: 0.18rem; line-height: 1.5; cursor: pointer; -`,aW=Object.assign({"/src/articles/blogs/2022-05-17-Rust-Implementation-of-RDMA/index.md":()=>C(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>C(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>C(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>C(()=>import("./index-9d285d88.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>C(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>C(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>C(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>C(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>C(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>C(()=>import("./index-ddfbefca.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>C(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>C(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>C(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>C(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>C(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>C(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>C(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>C(()=>import("./index-daed041b.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>C(()=>import("./index-c719bd5c.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>C(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-38e8d7df.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>C(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>C(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>C(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>C(()=>import("./index-6f8e9292.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>C(()=>import("./index-8c16a843.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-9cbd4195.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>C(()=>import("./index-f819e53e.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>C(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>C(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>C(()=>import("./index-4b4d6acc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>C(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>C(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>C(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>C(()=>import("./index-90047cd2.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>C(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>C(()=>import("./index-cf399721.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>C(()=>import("./index-96aee43d.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>C(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>C(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>C(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>C(()=>import("./index-e0e6b52c.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>C(()=>import("./index-0e3994dc.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>C(()=>import("./index-69f9dfbf.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>C(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>C(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>C(()=>import("./index-067c93db.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>C(()=>import("./index-c29dde05.js"),[])}),lW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>C(()=>import("./index-a1bcce61.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>C(()=>import("./index-17fcbde5.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-e2a1595e.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>C(()=>import("./index-aaac1d05.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>C(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>C(()=>import("./index-15895cd6.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>C(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>C(()=>import("./index-07db2d14.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>C(()=>import("./index-4e03f569.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>C(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>C(()=>import("./index-ffd93bc8.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>C(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>C(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>C(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>C(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>C(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>C(()=>import("./index-a520ffab.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>C(()=>import("./index-6a3ed4c3.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>C(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>C(()=>import("./index-c5edc5af.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>C(()=>import("./index-8cb22688.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>C(()=>import("./index-69ce89cf.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>C(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>C(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>C(()=>import("./index-50ad21f0.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>C(()=>import("./index-1c51c928.js"),[])}),cW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>C(()=>import("./index-67248222.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>C(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>C(()=>import("./index-405a2dbf.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>C(()=>import("./index-e7ccea1d.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>C(()=>import("./index-9ee6b548.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>C(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>C(()=>import("./index-ca4e9d9f.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>C(()=>import("./index-67a528fa.js"),[])}),uW=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>C(()=>import("./index-62952ba7.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>C(()=>import("./index-012df9e2.js"),[])}),dW=()=>{const{section:e,title:t}=Sn(),[r,n]=I.useState(),[i,o]=I.useState("");Z9(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await aW[`/src/articles/${e}/${t}/index.md`]();case"events":return await lW[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await cW[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await uW[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};I.useEffect(()=>{console.log(r)},[]),I.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(J9,{children:l.jsxs(eW,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(iW,{children:l.jsx(oW,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(sW,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(tW,{children:[l.jsx(rW,{children:r==null?void 0:r.metadata.label}),l.jsx(nW,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function kk(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zu={},fW={get exports(){return Zu},set exports(e){Zu=e}},Ww;function hW(){return Ww||(Ww=1,function(e,t){(function(r,n){e.exports=n()})(Go,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function _(s,u){var m=[],p,x=s.length;for(p=0;p>>0,p;for(p=0;p0)for(m=0;mb(()=>import("./index-8702c933.js"),[]),"/src/articles/blogs/2022-05-27-Crossbeam-Epoch-Algorithm-for-Lock-Free-Programming-in-Rust/index.md":()=>b(()=>import("./index-28c4b418.js"),[]),"/src/articles/blogs/2022-05-27-Managing-RDMA-Memory-in-Rust/index.md":()=>b(()=>import("./index-de3329ad.js"),[]),"/src/articles/blogs/2022-05-27-Memory-Management-for-Lock-Free-Data-Structures-in-the-Rust-Language/index.md":()=>b(()=>import("./index-fe9ae8f0.js"),[]),"/src/articles/blogs/2022-05-27-Rethinking-How-Rust-Async-Enables-High-Performance-IO/index.md":()=>b(()=>import("./index-d81ed83c.js"),[]),"/src/articles/blogs/2022-05-27-Rust-Implementation-of-K8S-Scheduling-Extensions/index.md":()=>b(()=>import("./index-9d5e23a7.js"),[]),"/src/articles/blogs/2022-05-27-Rust-implementation-of-RDMA-asynchronous-programming-(I):-epoll-based-implementation-of-RDMA-asynchronous-operation/index.md":()=>b(()=>import("./index-fd018bec.js"),[]),"/src/articles/blogs/2022-05-27-async-Rust-wraps-UCX-communication-library/index.md":()=>b(()=>import("./index-8c82e7c7.js"),[]),"/src/articles/blogs/2022-05-27-io_uring-Rust-Asynchronous-Library-Implementation/index.md":()=>b(()=>import("./index-e7093119.js"),[]),"/src/articles/blogs/2022-06-11-Computer-Architecture-l-MIT-Training-Q&A-and-Tips/index.md":()=>b(()=>import("./index-29c0b7ce.js"),[]),"/src/articles/blogs/2022-06-15-Etcd-client-cache-practice/index.md":()=>b(()=>import("./index-bfe04780.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-and-lock-free-programming-(1)/index.md":()=>b(()=>import("./index-147df4a9.js"),[]),"/src/articles/blogs/2022-06-15-Garbage-collection-mechanism-in-lock-free-programming-scenarios-(2)/index.md":()=>b(()=>import("./index-b51a8ea2.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(1)/index.md":()=>b(()=>import("./index-5dd90a8c.js"),[]),"/src/articles/blogs/2022-06-15-Memory-Order-(Memory-Order)-problem-(2)/index.md":()=>b(()=>import("./index-426f092b.js"),[]),"/src/articles/blogs/2022-06-15-Using-BPF-to-implement-user-mode-tracing/index.md":()=>b(()=>import("./index-06215d3e.js"),[]),"/src/articles/blogs/2022-06-24-Why-should-a-startup-choose-Rust-for-an-RDMA-library/index.md":()=>b(()=>import("./index-1bdc26aa.js"),[]),"/src/articles/blogs/2022-06-30-Ten-thousand-words-long-article,-detailing-the-hardware-acceleration-and-implementation-of-TRIDENT:-Poseidon-hash-algorithm!/index.md":()=>b(()=>import("./index-25293c60.js"),[]),"/src/articles/blogs/2022-07-07-Rethinking-of-the-Curp-Consensus-Protocol/index.md":()=>b(()=>import("./index-f6eeef5e.js"),[]),"/src/articles/blogs/2022-08-11-DatenLord-|-Xline-Geo-distributed-KV-Storage/index.md":()=>b(()=>import("./index-9cd4971b.js"),[]),"/src/articles/blogs/2022-10-11-Rust-Chat-Room:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-0bd243e2.js"),[]),"/src/articles/blogs/2022-10-20-Wonderful-review-l-Rust-chat-room:-Xline-cross-data-center-consistency-management/index.md":()=>b(()=>import("./index-fa30bf44.js"),[]),"/src/articles/blogs/2022-12-15-Distributed-state-machine-consensus-protocol-Copilot/index.md":()=>b(()=>import("./index-24694c1f.js"),[]),"/src/articles/blogs/2023-01-19-From-Cloud-Computing-to-Sky-Computing-(1)/index.md":()=>b(()=>import("./index-4b85dcd8.js"),[]),"/src/articles/blogs/2023-02-01-Distributed-laboratory-live-broadcast-l-Consensus-algorithm-and-consistent-metadata-management-across-data-centers/index.md":()=>b(()=>import("./index-4270ced0.js"),[]),"/src/articles/blogs/2023-02-16-Database-isolation-level-and-MVCC/index.md":()=>b(()=>import("./index-1dde53bb.js"),[]),"/src/articles/blogs/2023-02-16-Xline-v0.2.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-6f20c5b7.js"),[]),"/src/articles/blogs/2023-03-02-Thinking-about-programs-mathematically-and-verifying-correctness/index.md":()=>b(()=>import("./index-303605cc.js"),[]),"/src/articles/blogs/2023-03-23-Xline-v0.3.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-72b88898.js"),[]),"/src/articles/blogs/2023-04-20-How-to-elegantly-organize-asynchronous-code-in-a-Rust-project/index.md":()=>b(()=>import("./index-7582b288.js"),[]),"/src/articles/blogs/2023-04-24-DatenLord-open-source-product-technology-sharing-l-Xline-source-code-interpretation/index.md":()=>b(()=>import("./index-015cf939.js"),[]),"/src/articles/blogs/2023-05-11-Xline-v0.4.0:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-494dac65.js"),[]),"/src/articles/blogs/2023-05-17-Computer-Architecture|MIT6.175-and-MIT6.375-Study-Notes/index.md":()=>b(()=>import("./index-f42f30bc.js"),[]),"/src/articles/blogs/2023-05-25-Xline-Persistent-Storage-Design-and-Implementation/index.md":()=>b(()=>import("./index-86e42443.js"),[]),"/src/articles/blogs/2023-06-01-From-Cloud-Computing-to-Sky-Computing-(2)/index.md":()=>b(()=>import("./index-7a966399.js"),[]),"/src/articles/blogs/2023-06-21-The-first-cross-cloud-metadata-KV-storage-Xline-officially-entered-the-CNCF-sandbox/index.md":()=>b(()=>import("./index-a8e1cc23.js"),[]),"/src/articles/blogs/2023-06-21-Xline-v0.4.1:-A-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-93097ad1.js"),[]),"/src/articles/blogs/2023-07-13-Interpretation-of-Xline-source-code-(1)——Introduction-to-CURP-protocol/index.md":()=>b(()=>import("./index-5076d4ea.js"),[]),"/src/articles/blogs/2023-07-20-Xline-Source-Code-Interpretation-(II)-Lease-Mechanism-and-Implementation/index.md":()=>b(()=>import("./index-0074c42d.js"),[]),"/src/articles/blogs/2023-07-27-BSV-based-high-performance-parallel-CRC-hardware-circuit-generator/index.md":()=>b(()=>import("./index-40aedb60.js"),[]),"/src/articles/blogs/2023-08-15-Xline-v0.5.0-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-7a7fbe77.js"),[]),"/src/articles/blogs/2023-08-31-Fountain-Code/index.md":()=>b(()=>import("./index-0850e6f5.js"),[]),"/src/articles/blogs/2023-09-14-Xline-Source-Code-Interpretation-(III)--CURP-Server-Implementation/index.md":()=>b(()=>import("./index-277ae463.js"),[]),"/src/articles/blogs/2023-09-28-Bluespec-SytemVerilog-Handshake-Protocol-Interface-Conversion/index.md":()=>b(()=>import("./index-3139538f.js"),[]),"/src/articles/blogs/2023-10-12-Software-and-hardware-co-simulation-l-Overview-of-principles-and-main-components/index.md":()=>b(()=>import("./index-1ec93936.js"),[]),"/src/articles/blogs/2023-10-19-Xline-Source-Code-Interpretation-(IV)-CURP-state-machine-engine/index.md":()=>b(()=>import("./index-a5e56ae7.js"),[]),"/src/articles/blogs/2023-10-26-Application-of-data-flow-programming-in-hardware-design/index.md":()=>b(()=>import("./index-951bfe33.js"),[]),"/src/articles/blogs/2023-11-02-blue-ethernet-High-Performance-FPGA-Network-Packet-Processing-Project-Details/index.md":()=>b(()=>import("./index-2a54f9b1.js"),[]),"/src/articles/blogs/2023-11-23-Xline-v0.6.0:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-b73b42f4.js"),[]),"/src/articles/blogs/2023-12-28-Xline-command-de-duplication-mechanism-(I)-Introduction-to-RIFL/index.md":()=>b(()=>import("./index-1b00c887.js"),[]),"/src/articles/blogs/2024-01-11-Open-source-Bluespec-bsc-compiler-and-reusable-example-designs/index.md":()=>b(()=>import("./index-4da057d8.js"),[]),"/src/articles/blogs/2024-01-18-Xline-v0.6.1:-a-distributed-KV-store-for-metadata-management/index.md":()=>b(()=>import("./index-28199dec.js"),[]),"/src/articles/blogs/2024-01-25-Agile-Digital-Chip-Design-and-Verification-with-SpinalHDL-and-Cocotb/index.md":()=>b(()=>import("./index-884e893f.js"),[]),"/src/articles/blogs/2024-02-01-Xline-Jepsen-test-analysis/index.md":()=>b(()=>import("./index-c0527a8b.js"),[]),"/src/articles/blogs/2024-03-07-Membership-Change-Source-Code-Interpretation/index.md":()=>b(()=>import("./index-836388b4.js"),[]),"/src/articles/blogs/2024-03-21-Early-Explorations-and-Practices-of-Xline-a-Stateful-Application-Managed-by-Karmada/index.md":()=>b(()=>import("./index-557885ec.js"),[])}),dW=Object.assign({"/src/articles/events/2022-05-17-RDMA-Software-Interface-High-Level-Package/index.md":()=>b(()=>import("./index-043be87f.js"),[]),"/src/articles/events/2022-08-04-When-RDMA-meets-Rust/index.md":()=>b(()=>import("./index-0a77c99b.js"),[]),"/src/articles/events/2022-08-23-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-047539e4.js"),[]),"/src/articles/events/2022-10-11-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-dd1d4688.js"),[]),"/src/articles/events/2022-11-11-Datan-Technology-invites-you-who-love-challenges-to-participate-in-Rust-China-Hackathon-2022/index.md":()=>b(()=>import("./index-b9cc4e07.js"),[]),"/src/articles/events/2022-11-24-The-Rust-China-Hackathon-2022-Datan-Technology-Group-Air-Presentation-is-here/index.md":()=>b(()=>import("./index-cf17c7a4.js"),[]),"/src/articles/events/2022-12-08-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-28613687.js"),[]),"/src/articles/events/2022-12-08-Welcome-to-sign-up-for-the-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-e197de7f.js"),[]),"/src/articles/events/2023-01-06-Datan-Technology-2023-Open-Source-Graduation-Design-Internship-Recruitment/index.md":()=>b(()=>import("./index-c648bdf6.js"),[]),"/src/articles/events/2023-01-12-Welcome-to-join-Datan-Technology-hardware-design-learning-community/index.md":()=>b(()=>import("./index-1179d885.js"),[]),"/src/articles/events/2023-02-01-Consensus-Algorithms-and-Metadata-Management-for-Cross-Data-Center-Consistency/index.md":()=>b(()=>import("./index-5689e7f4.js"),[]),"/src/articles/events/2023-03-31-4.8-Beijing-Rust-Meetup-|-Call-For-Presenters/index.md":()=>b(()=>import("./index-5a282940.js"),[]),"/src/articles/events/2023-04-05-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-d2a8186a.js"),[]),"/src/articles/events/2023-05-04-Meet-this-summer|Datan-Technology-invites-you-to-participate-in-the-2023-Open-Source-Summer/index.md":()=>b(()=>import("./index-3dea6c6a.js"),[]),"/src/articles/events/2023-06-11-Countdown-to-Rust-X-DatenLord-l-Rust-China-Conf-2023/index.md":()=>b(()=>import("./index-0c25eea3.js"),[]),"/src/articles/events/2023-07-03-SpinalHDL-usage-and-development-experience-workshop/index.md":()=>b(()=>import("./index-a82e036b.js"),[]),"/src/articles/events/2023-08-01-Countdown-to-6-days-l-Opportunities-and-Challenges-The-Development-Trend-of-Generative-AI-and-its-Application-on-the-Ground/index.md":()=>b(()=>import("./index-4d1333f2.js"),[]),"/src/articles/events/2023-08-15-DatenLord-X-Segmentfault-Live-Stream-Preview-l-CURP-Protocol-in-Industrial-Practice/index.md":()=>b(()=>import("./index-5d075b3e.js"),[]),"/src/articles/events/2023-08-20-Upcoming-Events-l-2nd-Hardware-Agile-Development-and-Verification-Methodology-Workshop/index.md":()=>b(()=>import("./index-5f61d62d.js"),[]),"/src/articles/events/2023-09-07-The-2nd-Hardware-Agile-Development-and-Methodology-Workshop-l-2023-RISC-V-China-Summit-Concurrent-Events-Successfully-Held/index.md":()=>b(()=>import("./index-a154d453.js"),[]),"/src/articles/events/2023-09-19-MIT-Coursework-Orientation-for-Newcomers/index.md":()=>b(()=>import("./index-5fa4b651.js"),[]),"/src/articles/events/2023-11-09-Exploring-the-Future-of-SpinalHDL-Applications-in-2023-Online-Workshop/index.md":()=>b(()=>import("./index-dfd283a0.js"),[]),"/src/articles/events/2023-11-17-Ding!-You've-received-a-Hackthon-invitation-from-Dartan-Technologies!/index.md":()=>b(()=>import("./index-4e05b5cd.js"),[]),"/src/articles/events/2023-12-05-Countdown-to-5-days:-SpinalHDL-application-prospect-exploration-online-seminar/index.md":()=>b(()=>import("./index-24fab036.js"),[]),"/src/articles/events/2023-12-05-Ding!-2023-hackathon-tips-fresh-from-the-oven!-Last-week-to-sign-up-before-it's-too-late!/index.md":()=>b(()=>import("./index-b8dbda9f.js"),[]),"/src/articles/events/2023-12-14-MIT-Architecture-Open-Course-Learning-Community-Version-2.0-is-officially-launched~/index.md":()=>b(()=>import("./index-b0b5bfda.js"),[]),"/src/articles/events/2024-01-02-Highlights-I-DatenLord-Hackathon-2023-came-to-a-successful-conclusion!/index.md":()=>b(()=>import("./index-1c51c928.js"),[]),"/src/articles/events/2024-02-22-Recruitment-can't-stop-Dartan-Technology-2024-internship-positions-waiting-for-you/index.md":()=>b(()=>import("./index-db271263.js"),[]),"/src/articles/events/2024-02-29-A-Challenge-Letter-from-DatenLord-on-GSoC-2024/index.md":()=>b(()=>import("./index-b9598d44.js"),[])}),fW=Object.assign({"/src/articles/highlights/2022-07-28-Creatively-fine-tuned-wheels:-RDMA's-Rust-safety-practices/index.md":()=>b(()=>import("./index-37f93c7b.js"),[]),"/src/articles/highlights/2022-08-04-Rust-X-Datenlord:-Review-of-the-Second-China-Rust-Developer-Conference/index.md":()=>b(()=>import("./index-8f0491cb.js"),[]),"/src/articles/highlights/2022-09-08-Discussion-on-Hardware-Agile-Development-and-Verification-Methodology/index.md":()=>b(()=>import("./index-e57be735.js"),[]),"/src/articles/highlights/2022-10-20-Rust-Chatterbox:-Xline-Cross-Data-Center-Consistency-Management/index.md":()=>b(()=>import("./index-78a34e98.js"),[]),"/src/articles/highlights/2022-12-12-SpinalHDL-Application-Prospect-Exploration-Online-Seminar/index.md":()=>b(()=>import("./index-3b5176dc.js"),[]),"/src/articles/highlights/2023-01-12-Rust-China-Hackathon-2022-Datan-Technology-Group/index.md":()=>b(()=>import("./index-354c3565.js"),[]),"/src/articles/highlights/2023-04-13-4.8-Beijing-Rust-Meetup/index.md":()=>b(()=>import("./index-ca4e9d9f.js"),[]),"/src/articles/highlights/2023-12-21-Highlights:-2023-SpinalHDL-Application-Prospect-Exploration-Workshop/index.md":()=>b(()=>import("./index-67a528fa.js"),[])}),hW=Object.assign({"/src/articles/news-honor-dynamic/2022-08-04-Dartan-Technology-Invited-to-Do-Hardware-Acceleration-Research-Sharing-at-2022-China-Computer-Society-Chip-Conference/index.md":()=>b(()=>import("./index-1f712296.js"),[]),"/src/articles/news-honor-dynamic/2023-03-31-Datan-Technology-Entrepreneurship-is-a-rock-and-roll-in-the-soul/index.md":()=>b(()=>import("./index-012df9e2.js"),[])}),mW=()=>{const{section:e,title:t}=Sn(),[r,n]=I.useState(),[i,o]=I.useState("");tW(o,r);const a=async()=>{console.log(`/src/articles/${e}/${t}/index.md`);const h=await(async()=>{switch(e){case"blogs":return await uW[`/src/articles/${e}/${t}/index.md`]();case"events":return await dW[`/src/articles/${e}/${t}/index.md`]();case"highlights":return await fW[`/src/articles/${e}/${t}/index.md`]();case"news-honor-dynamic":return await hW[`/src/articles/${e}/${t}/index.md`]()}})();n(h)};I.useEffect(()=>{console.log(r)},[]),I.useEffect(()=>{a(),window.scrollTo(0,0)},[]);const c=d=>{var h;(h=document.querySelector(`#${d}`))==null||h.scrollIntoView({})};return l.jsx(rW,{children:l.jsxs(nW,{children:[(r==null?void 0:r.toc.length)!==0&&l.jsx(aW,{children:l.jsx(lW,{children:((r==null?void 0:r.toc)||[]).map(({label:d,level:h})=>{const g=d.split(" ").join("-").toLowerCase();return l.jsx(cW,{level:h,isActive:i===g,onClick:()=>c(g),children:d},d)})})}),l.jsxs(iW,{children:[l.jsx(oW,{children:r==null?void 0:r.metadata.label}),l.jsx(sW,{className:"content",dangerouslySetInnerHTML:{__html:(r==null?void 0:r.default)||""}})]})]})})};function kk(e){throw new Error('Could not dynamically require "'+e+'". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.')}var Zu={},pW={get exports(){return Zu},set exports(e){Zu=e}},Ww;function gW(){return Ww||(Ww=1,function(e,t){(function(r,n){e.exports=n()})(Go,function(){var r;function n(){return r.apply(null,arguments)}function i(s){r=s}function o(s){return s instanceof Array||Object.prototype.toString.call(s)==="[object Array]"}function a(s){return s!=null&&Object.prototype.toString.call(s)==="[object Object]"}function c(s,u){return Object.prototype.hasOwnProperty.call(s,u)}function d(s){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(s).length===0;var u;for(u in s)if(c(s,u))return!1;return!0}function h(s){return s===void 0}function g(s){return typeof s=="number"||Object.prototype.toString.call(s)==="[object Number]"}function v(s){return s instanceof Date||Object.prototype.toString.call(s)==="[object Date]"}function _(s,u){var m=[],p,x=s.length;for(p=0;p>>0,p;for(p=0;p0)for(m=0;m=0;return(A?m?"+":"":"-")+Math.pow(10,Math.max(0,x)).toString().substr(1)+p}var ue=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,he=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,st={},Ve={};function K(s,u,m,p){var x=p;typeof p=="string"&&(x=function(){return this[p]()}),s&&(Ve[s]=x),u&&(Ve[u[0]]=function(){return Q(x.apply(this,arguments),u[1],u[2])}),m&&(Ve[m]=function(){return this.localeData().ordinal(x.apply(this,arguments),s)})}function zt(s){return s.match(/\[[\s\S]/)?s.replace(/^\[|\]$/g,""):s.replace(/\\/g,"")}function rr(s){var u=s.match(ue),m,p;for(m=0,p=u.length;m=0&&he.test(s);)s=s.replace(he,p),he.lastIndex=0,m-=1;return s}var mr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Ki(s){var u=this._longDateFormat[s],m=this._longDateFormat[s.toUpperCase()];return u||!m?u:(this._longDateFormat[s]=m.match(ue).map(function(p){return p==="MMMM"||p==="MM"||p==="DD"||p==="dddd"?p.slice(1):p}).join(""),this._longDateFormat[s])}var Dr="Invalid date";function pr(){return this._invalidDate}var qs="%d",Zs=/\d{1,2}/;function Js(s){return this._ordinal.replace("%d",s)}var ci={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Fl(s,u,m,p){var x=this._relativeTime[m];return G(x)?x(s,u,m,p):x.replace(/%d/i,s)}function Vl(s,u){var m=this._relativeTime[s>0?"future":"past"];return G(m)?m(u):m.replace(/%s/i,u)}var ui={};function Dt(s,u){var m=s.toLowerCase();ui[m]=ui[m+"s"]=ui[u]=s}function jt(s){return typeof s=="string"?ui[s]||ui[s.toLowerCase()]:void 0}function di(s){var u={},m,p;for(p in s)c(s,p)&&(m=jt(p),m&&(u[m]=s[p]));return u}var ea={};function pt(s,u){ea[s]=u}function xf(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:ea[m]});return u.sort(function(p,x){return p.priority-x.priority}),u}function To(s){return s%4===0&&s%100!==0||s%400===0}function Kt(s){return s<0?Math.ceil(s)||0:Math.floor(s)}function ge(s){var u=+s,m=0;return u!==0&&isFinite(u)&&(m=Kt(u)),m}function M(s,u){return function(m){return m!=null?(H(this,s,m),n.updateOffset(this,u),this):N(this,s)}}function N(s,u){return s.isValid()?s._d["get"+(s._isUTC?"UTC":"")+u]():NaN}function H(s,u,m){s.isValid()&&!isNaN(m)&&(u==="FullYear"&&To(s.year())&&s.month()===1&&s.date()===29?(m=ge(m),s._d["set"+(s._isUTC?"UTC":"")+u](m,s.month(),$l(m,s.month()))):s._d["set"+(s._isUTC?"UTC":"")+u](m))}function J(s){return s=jt(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=di(s);var m=xf(s),p,x=m.length;for(p=0;p68?1900:2e3)};var xv=M("FullYear",!0);function cC(){return To(this.year())}function uC(s,u,m,p,x,A,L){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,x,A,L),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,x,A,L),oe}function na(s){var u,m;return s<100&&s>=0?(m=Array.prototype.slice.call(arguments),m[0]=s+400,u=new Date(Date.UTC.apply(null,m)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(s)):u=new Date(Date.UTC.apply(null,arguments)),u}function Bl(s,u,m){var p=7+u-m,x=(7+na(s,0,p).getUTCDay()-u)%7;return-x+p-1}function _v(s,u,m,p,x){var A=(7+m-p)%7,L=Bl(s,p,x),oe=1+7*(u-1)+A+L,ve,Ye;return oe<=0?(ve=s-1,Ye=ra(ve)+oe):oe>ra(s)?(ve=s+1,Ye=oe-ra(s)):(ve=s,Ye=oe),{year:ve,dayOfYear:Ye}}function ia(s,u,m){var p=Bl(s.year(),u,m),x=Math.floor((s.dayOfYear()-p-1)/7)+1,A,L;return x<1?(L=s.year()-1,A=x+On(L,u,m)):x>On(s.year(),u,m)?(A=x-On(s.year(),u,m),L=s.year()+1):(L=s.year(),A=x),{week:A,year:L}}function On(s,u,m){var p=Bl(s,u,m),x=Bl(s+1,u,m);return(ra(s)-p+x)/7}K("w",["ww",2],"wo","week"),K("W",["WW",2],"Wo","isoWeek"),Dt("week","w"),Dt("isoWeek","W"),pt("week",5),pt("isoWeek",5),X("w",ae),X("ww",ae,ie),X("W",ae),X("WW",ae,ie),An(["w","ww","W","WW"],function(s,u,m,p){u[p.substr(0,1)]=ge(s)});function dC(s){return ia(s,this._week.dow,this._week.doy).week}var fC={dow:0,doy:6};function hC(){return this._week.dow}function mC(){return this._week.doy}function pC(s){var u=this.localeData().week(this);return s==null?u:this.add((s-u)*7,"d")}function gC(s){var u=ia(this,1,4).week;return s==null?u:this.add((s-u)*7,"d")}K("d",0,"do","day"),K("dd",0,0,function(s){return this.localeData().weekdaysMin(this,s)}),K("ddd",0,0,function(s){return this.localeData().weekdaysShort(this,s)}),K("dddd",0,0,function(s){return this.localeData().weekdays(this,s)}),K("e",0,0,"weekday"),K("E",0,0,"isoWeekday"),Dt("day","d"),Dt("weekday","e"),Dt("isoWeekday","E"),pt("day",11),pt("weekday",11),pt("isoWeekday",11),X("d",ae),X("e",ae),X("E",ae),X("dd",function(s,u){return u.weekdaysMinRegex(s)}),X("ddd",function(s,u){return u.weekdaysShortRegex(s)}),X("dddd",function(s,u){return u.weekdaysRegex(s)}),An(["dd","ddd","dddd"],function(s,u,m,p){var x=m._locale.weekdaysParse(s,p,m._strict);x!=null?u.d=x:j(m).invalidWeekday=s}),An(["d","e","E"],function(s,u,m,p){u[p]=ge(s)});function vC(s,u){return typeof s!="string"?s:isNaN(s)?(s=u.weekdaysParse(s),typeof s=="number"?s:null):parseInt(s,10)}function yC(s,u){return typeof s=="string"?u.weekdaysParse(s)%7||7:isNaN(s)?null:s}function _f(s,u){return s.slice(u,7).concat(s.slice(0,u))}var wC="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Sv="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),xC="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_C=En,SC=En,bC=En;function kC(s,u){var m=o(this._weekdays)?this._weekdays:this._weekdays[s&&s!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return s===!0?_f(m,this._week.dow):s?m[s.day()]:m}function CC(s){return s===!0?_f(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function DC(s){return s===!0?_f(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function jC(s,u,m){var p,x,A,L=s.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)A=k([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(A,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(A,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(A,"").toLocaleLowerCase();return m?u==="dddd"?(x=ut.call(this._weekdaysParse,L),x!==-1?x:null):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null):(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null):u==="dddd"?(x=ut.call(this._weekdaysParse,L),x!==-1||(x=ut.call(this._shortWeekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):(x=ut.call(this._minWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null))}function EC(s,u,m){var p,x,A;if(this._weekdaysParseExact)return jC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(x=k([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(x,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(x,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(x,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(A="^"+this.weekdays(x,"")+"|^"+this.weekdaysShort(x,"")+"|^"+this.weekdaysMin(x,""),this._weekdaysParse[p]=new RegExp(A.replace(".",""),"i")),m&&u==="dddd"&&this._fullWeekdaysParse[p].test(s))return p;if(m&&u==="ddd"&&this._shortWeekdaysParse[p].test(s))return p;if(m&&u==="dd"&&this._minWeekdaysParse[p].test(s))return p;if(!m&&this._weekdaysParse[p].test(s))return p}}function AC(s){if(!this.isValid())return s!=null?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return s!=null?(s=vC(s,this.localeData()),this.add(s-u,"d")):u}function TC(s){if(!this.isValid())return s!=null?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return s==null?u:this.add(s-u,"d")}function RC(s){if(!this.isValid())return s!=null?this:NaN;if(s!=null){var u=yC(s,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function OC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=_C),this._weekdaysStrictRegex&&s?this._weekdaysStrictRegex:this._weekdaysRegex)}function PC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=SC),this._weekdaysShortStrictRegex&&s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function MC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=bC),this._weekdaysMinStrictRegex&&s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Sf(){function s(Xt,Nn){return Nn.length-Xt.length}var u=[],m=[],p=[],x=[],A,L,oe,ve,Ye;for(A=0;A<7;A++)L=k([2e3,1]).day(A),oe=gt(this.weekdaysMin(L,"")),ve=gt(this.weekdaysShort(L,"")),Ye=gt(this.weekdays(L,"")),u.push(oe),m.push(ve),p.push(Ye),x.push(oe),x.push(ve),x.push(Ye);u.sort(s),m.sort(s),p.sort(s),x.sort(s),this._weekdaysRegex=new RegExp("^("+x.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+m.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function bf(){return this.hours()%12||12}function LC(){return this.hours()||24}K("H",["HH",2],0,"hour"),K("h",["hh",2],0,bf),K("k",["kk",2],0,LC),K("hmm",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)}),K("hmmss",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),K("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),K("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)});function bv(s,u){K(s,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}bv("a",!0),bv("A",!1),Dt("hour","h"),pt("hour",13);function kv(s,u){return u._meridiemParse}X("a",kv),X("A",kv),X("H",ae),X("h",ae),X("k",ae),X("HH",ae,ie),X("hh",ae,ie),X("kk",ae,ie),X("hmm",xt),X("hmmss",ct),X("Hmm",xt),X("Hmmss",ct),me(["H","HH"],_t),me(["k","kk"],function(s,u,m){var p=ge(s);u[_t]=p===24?0:p}),me(["a","A"],function(s,u,m){m._isPm=m._locale.isPM(s),m._meridiem=s}),me(["h","hh"],function(s,u,m){u[_t]=ge(s),j(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Fr]=ge(s.substr(p)),j(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Fr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x)),j(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Fr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Fr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x))});function IC(s){return(s+"").toLowerCase().charAt(0)==="p"}var NC=/[ap]\.?m?\.?/i,zC=M("Hours",!0);function YC(s,u,m){return s>11?m?"pm":"PM":m?"am":"AM"}var Cv={calendar:$,longDateFormat:mr,invalidDate:Dr,ordinal:qs,dayOfMonthOrdinalParse:Zs,relativeTime:ci,months:Jk,monthsShort:pv,week:fC,weekdays:wC,weekdaysMin:xC,weekdaysShort:Sv,meridiemParse:NC},Qe={},oa={},sa;function HC(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(x=Wl(A.slice(0,m).join("-")),x)return x;if(p&&p.length>=m&&HC(A,p)>=m-1)break;m--}u++}return sa}function VC(s){return s.match("^[^/\\\\]*$")!=null}function Wl(s){var u=null,m;if(Qe[s]===void 0&&e&&e.exports&&VC(s))try{u=sa._abbr,m=kk,m("./locale/"+s),hi(u)}catch{Qe[s]=null}return Qe[s]}function hi(s,u){var m;return s&&(h(u)?m=Pn(s):m=kf(s,u),m?sa=m:typeof console<"u"&&console.warn&&console.warn("Locale "+s+" not found. Did you forget to load it?")),sa._abbr}function kf(s,u){if(u!==null){var m,p=Cv;if(u.abbr=s,Qe[s]!=null)te("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=Qe[s]._config;else if(u.parentLocale!=null)if(Qe[u.parentLocale]!=null)p=Qe[u.parentLocale]._config;else if(m=Wl(u.parentLocale),m!=null)p=m._config;else return oa[u.parentLocale]||(oa[u.parentLocale]=[]),oa[u.parentLocale].push({name:s,config:u}),null;return Qe[s]=new ze(Ee(p,u)),oa[s]&&oa[s].forEach(function(x){kf(x.name,x.config)}),hi(s),Qe[s]}else return delete Qe[s],null}function UC(s,u){if(u!=null){var m,p,x=Cv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(Ee(Qe[s]._config,u)):(p=Wl(s),p!=null&&(x=p._config),u=Ee(x,u),p==null&&(u.abbr=s),m=new ze(u),m.parentLocale=Qe[s],Qe[s]=m),hi(s)}else Qe[s]!=null&&(Qe[s].parentLocale!=null?(Qe[s]=Qe[s].parentLocale,s===hi()&&hi(s)):Qe[s]!=null&&delete Qe[s]);return Qe[s]}function Pn(s){var u;if(s&&s._locale&&s._locale._abbr&&(s=s._locale._abbr),!s)return sa;if(!o(s)){if(u=Wl(s),u)return u;s=[s]}return FC(s)}function $C(){return mt(Qe)}function Cf(s){var u,m=s._a;return m&&j(s).overflow===-2&&(u=m[Tn]<0||m[Tn]>11?Tn:m[an]<1||m[an]>$l(m[Et],m[Tn])?an:m[_t]<0||m[_t]>24||m[_t]===24&&(m[Fr]!==0||m[Rn]!==0||m[Qi]!==0)?_t:m[Fr]<0||m[Fr]>59?Fr:m[Rn]<0||m[Rn]>59?Rn:m[Qi]<0||m[Qi]>999?Qi:-1,j(s)._overflowDayOfYear&&(uan)&&(u=an),j(s)._overflowWeeks&&u===-1&&(u=Qk),j(s)._overflowWeekday&&u===-1&&(u=qk),j(s).overflow=u),s}var BC=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,WC=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,GC=/Z|[+-]\d\d(?::?\d\d)?/,Gl=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Df=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],KC=/^\/?Date\((-?\d+)/i,XC=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,QC={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function jv(s){var u,m,p=s._i,x=BC.exec(p)||WC.exec(p),A,L,oe,ve,Ye=Gl.length,Xt=Df.length;if(x){for(j(s).iso=!0,u=0,m=Ye;ura(L)||s._dayOfYear===0)&&(j(s)._overflowDayOfYear=!0),m=na(L,0,s._dayOfYear),s._a[Tn]=m.getUTCMonth(),s._a[an]=m.getUTCDate()),u=0;u<3&&s._a[u]==null;++u)s._a[u]=p[u]=x[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[_t]===24&&s._a[Fr]===0&&s._a[Rn]===0&&s._a[Qi]===0&&(s._nextDay=!0,s._a[_t]=0),s._d=(s._useUTC?na:uC).apply(null,p),A=s._useUTC?s._d.getUTCDay():s._d.getDay(),s._tzm!=null&&s._d.setUTCMinutes(s._d.getUTCMinutes()-s._tzm),s._nextDay&&(s._a[_t]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==A&&(j(s).weekdayMismatch=!0)}}function iD(s){var u,m,p,x,A,L,oe,ve,Ye;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(A=1,L=4,m=Ro(u.GG,s._a[Et],ia($e(),1,4).year),p=Ro(u.W,1),x=Ro(u.E,1),(x<1||x>7)&&(ve=!0)):(A=s._locale._week.dow,L=s._locale._week.doy,Ye=ia($e(),A,L),m=Ro(u.gg,s._a[Et],Ye.year),p=Ro(u.w,Ye.week),u.d!=null?(x=u.d,(x<0||x>6)&&(ve=!0)):u.e!=null?(x=u.e+A,(u.e<0||u.e>6)&&(ve=!0)):x=A),p<1||p>On(m,A,L)?j(s)._overflowWeeks=!0:ve!=null?j(s)._overflowWeekday=!0:(oe=_v(m,p,x,A,L),s._a[Et]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Ef(s){if(s._f===n.ISO_8601){jv(s);return}if(s._f===n.RFC_2822){Ev(s);return}s._a=[],j(s).empty=!0;var u=""+s._i,m,p,x,A,L,oe=u.length,ve=0,Ye,Xt;for(x=Hr(s._f,s._locale).match(ue)||[],Xt=x.length,m=0;m0&&j(s).unusedInput.push(L),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Ve[A]?(p?j(s).empty=!1:j(s).unusedTokens.push(A),Ul(A,p,s)):s._strict&&!p&&j(s).unusedTokens.push(A);j(s).charsLeftOver=oe-ve,u.length>0&&j(s).unusedInput.push(u),s._a[_t]<=12&&j(s).bigHour===!0&&s._a[_t]>0&&(j(s).bigHour=void 0),j(s).parsedDateParts=s._a.slice(0),j(s).meridiem=s._meridiem,s._a[_t]=oD(s._locale,s._a[_t],s._meridiem),Ye=j(s).era,Ye!==null&&(s._a[Et]=s._locale.erasConvertYear(Ye,s._a[Et])),jf(s),Cf(s)}function oD(s,u,m){var p;return m==null?u:s.meridiemHour!=null?s.meridiemHour(u,m):(s.isPM!=null&&(p=s.isPM(m),p&&u<12&&(u+=12),!p&&u===12&&(u=0)),u)}function sD(s){var u,m,p,x,A,L,oe=!1,ve=s._f.length;if(ve===0){j(s).invalidFormat=!0,s._d=new Date(NaN);return}for(x=0;xthis?this:s:S()});function Rv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return $e();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function jD(){if(!h(this._isDSTShifted))return this._isDSTShifted;var s={},u;return R(s,this),s=Av(s),s._a?(u=s._isUTC?k(s._a):$e(s._a),this._isDSTShifted=this.isValid()&&yD(s._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function ED(){return this.isValid()?!this._isUTC:!1}function AD(){return this.isValid()?this._isUTC:!1}function Pv(){return this.isValid()?this._isUTC&&this._offset===0:!1}var TD=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,RD=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Vr(s,u){var m=s,p=null,x,A,L;return Xl(s)?m={ms:s._milliseconds,d:s._days,M:s._months}:g(s)||!isNaN(+s)?(m={},u?m[u]=+s:m.milliseconds=+s):(p=TD.exec(s))?(x=p[1]==="-"?-1:1,m={y:0,d:ge(p[an])*x,h:ge(p[_t])*x,m:ge(p[Fr])*x,s:ge(p[Rn])*x,ms:ge(Af(p[Qi]*1e3))*x}):(p=RD.exec(s))?(x=p[1]==="-"?-1:1,m={y:qi(p[2],x),M:qi(p[3],x),w:qi(p[4],x),d:qi(p[5],x),h:qi(p[6],x),m:qi(p[7],x),s:qi(p[8],x)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(L=OD($e(m.from),$e(m.to)),m={},m.ms=L.milliseconds,m.M=L.months),A=new Kl(m),Xl(s)&&c(s,"_locale")&&(A._locale=s._locale),Xl(s)&&c(s,"_isValid")&&(A._isValid=s._isValid),A}Vr.fn=Kl.prototype,Vr.invalid=vD;function qi(s,u){var m=s&&parseFloat(s.replace(",","."));return(isNaN(m)?0:m)*u}function Mv(s,u){var m={};return m.months=u.month()-s.month()+(u.year()-s.year())*12,s.clone().add(m.months,"M").isAfter(u)&&--m.months,m.milliseconds=+u-+s.clone().add(m.months,"M"),m}function OD(s,u){var m;return s.isValid()&&u.isValid()?(u=Rf(u,s),s.isBefore(u)?m=Mv(s,u):(m=Mv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function Lv(s,u){return function(m,p){var x,A;return p!==null&&!isNaN(+p)&&(te(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),A=m,m=p,p=A),x=Vr(m,p),Iv(this,x,s),this}}function Iv(s,u,m,p){var x=u._milliseconds,A=Af(u._days),L=Af(u._months);s.isValid()&&(p=p??!0,L&&vv(s,N(s,"Month")+L*m),A&&H(s,"Date",N(s,"Date")+A*m),x&&s._d.setTime(s._d.valueOf()+x*m),p&&n.updateOffset(s,A||L))}var PD=Lv(1,"add"),MD=Lv(-1,"subtract");function Nv(s){return typeof s=="string"||s instanceof String}function LD(s){return O(s)||v(s)||Nv(s)||g(s)||ND(s)||ID(s)||s===null||s===void 0}function ID(s){var u=a(s)&&!d(s),m=!1,p=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],x,A,L=p.length;for(x=0;xm.valueOf():m.valueOf()9999?Yr(m,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):G(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Yr(m,"Z")):Yr(m,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function qD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var s="moment",u="",m,p,x,A;return this.isLocal()||(s=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),m="["+s+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",x="-MM-DD[T]HH:mm:ss.SSS",A=u+'[")]',this.format(m+p+x+A)}function ZD(s){s||(s=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=Yr(this,s);return this.localeData().postformat(u)}function JD(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Vr({to:this,from:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function ej(s){return this.from($e(),s)}function tj(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Vr({from:this,to:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function rj(s){return this.to($e(),s)}function zv(s){var u;return s===void 0?this._locale._abbr:(u=Pn(s),u!=null&&(this._locale=u),this)}var Yv=Y("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(s){return s===void 0?this.localeData():this.locale(s)});function Hv(){return this._locale}var ql=1e3,Oo=60*ql,Zl=60*Oo,Fv=(365*400+97)*24*Zl;function Po(s,u){return(s%u+u)%u}function Vv(s,u,m){return s<100&&s>=0?new Date(s+400,u,m)-Fv:new Date(s,u,m).valueOf()}function Uv(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-Fv:Date.UTC(s,u,m)}function nj(s){var u,m;if(s=jt(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Vv,s){case"year":u=m(this.year(),0,1);break;case"quarter":u=m(this.year(),this.month()-this.month()%3,1);break;case"month":u=m(this.year(),this.month(),1);break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=m(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl);break;case"minute":u=this._d.valueOf(),u-=Po(u,Oo);break;case"second":u=this._d.valueOf(),u-=Po(u,ql);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function ij(s){var u,m;if(s=jt(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Vv,s){case"year":u=m(this.year()+1,0,1)-1;break;case"quarter":u=m(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=m(this.year(),this.month()+1,1)-1;break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=m(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=Zl-Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl)-1;break;case"minute":u=this._d.valueOf(),u+=Oo-Po(u,Oo)-1;break;case"second":u=this._d.valueOf(),u+=ql-Po(u,ql)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function oj(){return this._d.valueOf()-(this._offset||0)*6e4}function sj(){return Math.floor(this.valueOf()/1e3)}function aj(){return new Date(this.valueOf())}function lj(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function cj(){var s=this;return{years:s.year(),months:s.month(),date:s.date(),hours:s.hours(),minutes:s.minutes(),seconds:s.seconds(),milliseconds:s.milliseconds()}}function uj(){return this.isValid()?this.toISOString():null}function dj(){return w(this)}function fj(){return b({},j(this))}function hj(){return j(this).overflow}function mj(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}K("N",0,0,"eraAbbr"),K("NN",0,0,"eraAbbr"),K("NNN",0,0,"eraAbbr"),K("NNNN",0,0,"eraName"),K("NNNNN",0,0,"eraNarrow"),K("y",["y",1],"yo","eraYear"),K("y",["yy",2],0,"eraYear"),K("y",["yyy",3],0,"eraYear"),K("y",["yyyy",4],0,"eraYear"),X("N",Pf),X("NN",Pf),X("NNN",Pf),X("NNNN",Cj),X("NNNNN",Dj),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var x=m._locale.erasParse(s,p,m._strict);x?j(m).era=x:j(m).invalidEra=s}),X("y",on),X("yy",on),X("yyy",on),X("yyyy",on),X("yo",jj),me(["y","yy","yyy","yyyy"],Et),me(["yo"],function(s,u,m,p){var x;m._locale._eraYearOrdinalRegex&&(x=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[Et]=m._locale.eraYearOrdinalParse(s,x):u[Et]=parseInt(s,10)});function pj(s,u){var m,p,x,A=this._eras||Pn("en")._eras;for(m=0,p=A.length;m=0)return A[p]}function vj(s,u){var m=s.since<=s.until?1:-1;return u===void 0?n(s.since).year():n(s.since).year()+(u-s.offset)*m}function yj(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sA&&(u=A),Mj.call(this,s,u,m,p,x))}function Mj(s,u,m,p,x){var A=_v(s,u,m,p,x),L=na(A.year,0,A.dayOfYear);return this.year(L.getUTCFullYear()),this.month(L.getUTCMonth()),this.date(L.getUTCDate()),this}K("Q",0,"Qo","quarter"),Dt("quarter","Q"),pt("quarter",7),X("Q",fe),me("Q",function(s,u){u[Tn]=(ge(s)-1)*3});function Lj(s){return s==null?Math.ceil((this.month()+1)/3):this.month((s-1)*3+this.month()%3)}K("D",["DD",2],"Do","date"),Dt("date","D"),pt("date",9),X("D",ae),X("DD",ae,ie),X("Do",function(s,u){return s?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),me(["D","DD"],an),me("Do",function(s,u){u[an]=ge(s.match(ae)[0])});var Bv=M("Date",!0);K("DDD",["DDDD",3],"DDDo","dayOfYear"),Dt("dayOfYear","DDD"),pt("dayOfYear",4),X("DDD",tt),X("DDDD",ce),me(["DDD","DDDD"],function(s,u,m){m._dayOfYear=ge(s)});function Ij(s){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return s==null?u:this.add(s-u,"d")}K("m",["mm",2],0,"minute"),Dt("minute","m"),pt("minute",14),X("m",ae),X("mm",ae,ie),me(["m","mm"],Fr);var Nj=M("Minutes",!1);K("s",["ss",2],0,"second"),Dt("second","s"),pt("second",15),X("s",ae),X("ss",ae,ie),me(["s","ss"],Rn);var zj=M("Seconds",!1);K("S",0,0,function(){return~~(this.millisecond()/100)}),K(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),K(0,["SSS",3],0,"millisecond"),K(0,["SSSS",4],0,function(){return this.millisecond()*10}),K(0,["SSSSS",5],0,function(){return this.millisecond()*100}),K(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),K(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),K(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),K(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),Dt("millisecond","ms"),pt("millisecond",16),X("S",tt,fe),X("SS",tt,ie),X("SSS",tt,ce);var mi,Wv;for(mi="SSSS";mi.length<=9;mi+="S")X(mi,on);function Yj(s,u){u[Qi]=ge(("0."+s)*1e3)}for(mi="S";mi.length<=9;mi+="S")me(mi,Yj);Wv=M("Milliseconds",!1),K("z",0,0,"zoneAbbr"),K("zz",0,0,"zoneName");function Hj(){return this._isUTC?"UTC":""}function Fj(){return this._isUTC?"Coordinated Universal Time":""}var V=P.prototype;V.add=PD,V.calendar=HD,V.clone=FD,V.diff=KD,V.endOf=ij,V.format=ZD,V.from=JD,V.fromNow=ej,V.to=tj,V.toNow=rj,V.get=J,V.invalidAt=hj,V.isAfter=VD,V.isBefore=UD,V.isBetween=$D,V.isSame=BD,V.isSameOrAfter=WD,V.isSameOrBefore=GD,V.isValid=dj,V.lang=Yv,V.locale=zv,V.localeData=Hv,V.max=dD,V.min=uD,V.parsingFlags=fj,V.set=re,V.startOf=nj,V.subtract=MD,V.toArray=lj,V.toObject=cj,V.toDate=aj,V.toISOString=QD,V.inspect=qD,typeof Symbol<"u"&&Symbol.for!=null&&(V[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),V.toJSON=uj,V.toString=XD,V.unix=sj,V.valueOf=oj,V.creationData=mj,V.eraName=yj,V.eraNarrow=wj,V.eraAbbr=xj,V.eraYear=_j,V.year=xv,V.isLeapYear=cC,V.weekYear=Ej,V.isoWeekYear=Aj,V.quarter=V.quarters=Lj,V.month=yv,V.daysInMonth=sC,V.week=V.weeks=pC,V.isoWeek=V.isoWeeks=gC,V.weeksInYear=Oj,V.weeksInWeekYear=Pj,V.isoWeeksInYear=Tj,V.isoWeeksInISOWeekYear=Rj,V.date=Bv,V.day=V.days=AC,V.weekday=TC,V.isoWeekday=RC,V.dayOfYear=Ij,V.hour=V.hours=zC,V.minute=V.minutes=Nj,V.second=V.seconds=zj,V.millisecond=V.milliseconds=Wv,V.utcOffset=xD,V.utc=SD,V.local=bD,V.parseZone=kD,V.hasAlignedHourOffset=CD,V.isDST=DD,V.isLocal=ED,V.isUtcOffset=AD,V.isUtc=Pv,V.isUTC=Pv,V.zoneAbbr=Hj,V.zoneName=Fj,V.dates=Y("dates accessor is deprecated. Use date instead.",Bv),V.months=Y("months accessor is deprecated. Use month instead",yv),V.years=Y("years accessor is deprecated. Use year instead",xv),V.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_D),V.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",jD);function Vj(s){return $e(s*1e3)}function Uj(){return $e.apply(null,arguments).parseZone()}function Gv(s){return s}var Ae=ze.prototype;Ae.calendar=le,Ae.longDateFormat=Ki,Ae.invalidDate=pr,Ae.ordinal=Js,Ae.preparse=Gv,Ae.postformat=Gv,Ae.relativeTime=Fl,Ae.pastFuture=Vl,Ae.set=lt,Ae.eras=pj,Ae.erasParse=gj,Ae.erasConvertYear=vj,Ae.erasAbbrRegex=bj,Ae.erasNameRegex=Sj,Ae.erasNarrowRegex=kj,Ae.months=rC,Ae.monthsShort=nC,Ae.monthsParse=oC,Ae.monthsRegex=lC,Ae.monthsShortRegex=aC,Ae.week=dC,Ae.firstDayOfYear=mC,Ae.firstDayOfWeek=hC,Ae.weekdays=kC,Ae.weekdaysMin=DC,Ae.weekdaysShort=CC,Ae.weekdaysParse=EC,Ae.weekdaysRegex=OC,Ae.weekdaysShortRegex=PC,Ae.weekdaysMinRegex=MC,Ae.isPM=IC,Ae.meridiem=YC;function ec(s,u,m,p){var x=Pn(),A=k().set(p,u);return x[m](A,s)}function Kv(s,u,m){if(g(s)&&(u=s,s=void 0),s=s||"",u!=null)return ec(s,u,m,"month");var p,x=[];for(p=0;p<12;p++)x[p]=ec(s,p,m,"month");return x}function Lf(s,u,m,p){typeof s=="boolean"?(g(u)&&(m=u,u=void 0),u=u||""):(u=s,m=u,s=!1,g(u)&&(m=u,u=void 0),u=u||"");var x=Pn(),A=s?x._week.dow:0,L,oe=[];if(m!=null)return ec(u,(m+A)%7,p,"day");for(L=0;L<7;L++)oe[L]=ec(u,(L+A)%7,p,"day");return oe}function $j(s,u){return Kv(s,u,"months")}function Bj(s,u){return Kv(s,u,"monthsShort")}function Wj(s,u,m){return Lf(s,u,m,"weekdays")}function Gj(s,u,m){return Lf(s,u,m,"weekdaysShort")}function Kj(s,u,m){return Lf(s,u,m,"weekdaysMin")}hi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(s){var u=s%10,m=ge(s%100/10)===1?"th":u===1?"st":u===2?"nd":u===3?"rd":"th";return s+m}}),n.lang=Y("moment.lang is deprecated. Use moment.locale instead.",hi),n.langData=Y("moment.langData is deprecated. Use moment.localeData instead.",Pn);var Mn=Math.abs;function Xj(){var s=this._data;return this._milliseconds=Mn(this._milliseconds),this._days=Mn(this._days),this._months=Mn(this._months),s.milliseconds=Mn(s.milliseconds),s.seconds=Mn(s.seconds),s.minutes=Mn(s.minutes),s.hours=Mn(s.hours),s.months=Mn(s.months),s.years=Mn(s.years),this}function Xv(s,u,m,p){var x=Vr(u,m);return s._milliseconds+=p*x._milliseconds,s._days+=p*x._days,s._months+=p*x._months,s._bubble()}function Qj(s,u){return Xv(this,s,u,1)}function qj(s,u){return Xv(this,s,u,-1)}function Qv(s){return s<0?Math.floor(s):Math.ceil(s)}function Zj(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,x,A,L,oe,ve;return s>=0&&u>=0&&m>=0||s<=0&&u<=0&&m<=0||(s+=Qv(If(m)+u)*864e5,u=0,m=0),p.milliseconds=s%1e3,x=Kt(s/1e3),p.seconds=x%60,A=Kt(x/60),p.minutes=A%60,L=Kt(A/60),p.hours=L%24,u+=Kt(L/24),ve=Kt(qv(u)),m+=ve,u-=Qv(If(ve)),oe=Kt(m/12),m%=12,p.days=u,p.months=m,p.years=oe,this}function qv(s){return s*4800/146097}function If(s){return s*146097/4800}function Jj(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=jt(s),s==="month"||s==="quarter"||s==="year")switch(u=this._days+p/864e5,m=this._months+qv(u),s){case"month":return m;case"quarter":return m/3;case"year":return m/12}else switch(u=this._days+Math.round(If(this._months)),s){case"week":return u/7+p/6048e5;case"day":return u+p/864e5;case"hour":return u*24+p/36e5;case"minute":return u*1440+p/6e4;case"second":return u*86400+p/1e3;case"millisecond":return Math.floor(u*864e5)+p;default:throw new Error("Unknown unit "+s)}}function eE(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function Ln(s){return function(){return this.as(s)}}var tE=Ln("ms"),rE=Ln("s"),nE=Ln("m"),iE=Ln("h"),oE=Ln("d"),sE=Ln("w"),aE=Ln("M"),lE=Ln("Q"),cE=Ln("y");function uE(){return Vr(this)}function dE(s){return s=jt(s),this.isValid()?this[s+"s"]():NaN}function Zi(s){return function(){return this.isValid()?this._data[s]:NaN}}var fE=Zi("milliseconds"),hE=Zi("seconds"),mE=Zi("minutes"),pE=Zi("hours"),gE=Zi("days"),vE=Zi("months"),yE=Zi("years");function wE(){return Kt(this.days()/7)}var In=Math.round,Mo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function xE(s,u,m,p,x){return x.relativeTime(u||1,!!m,s,p)}function _E(s,u,m,p){var x=Vr(s).abs(),A=In(x.as("s")),L=In(x.as("m")),oe=In(x.as("h")),ve=In(x.as("d")),Ye=In(x.as("M")),Xt=In(x.as("w")),Nn=In(x.as("y")),pi=A<=m.ss&&["s",A]||A0,pi[4]=p,xE.apply(null,pi)}function SE(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function bE(s,u){return Mo[s]===void 0?!1:u===void 0?Mo[s]:(Mo[s]=u,s==="s"&&(Mo.ss=u-1),!0)}function kE(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=Mo,x,A;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},Mo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),x=this.localeData(),A=_E(this,!m,p,x),m&&(A=x.pastFuture(+this,A)),x.postformat(A)}var Nf=Math.abs;function Lo(s){return(s>0)-(s<0)||+s}function tc(){if(!this.isValid())return this.localeData().invalidDate();var s=Nf(this._milliseconds)/1e3,u=Nf(this._days),m=Nf(this._months),p,x,A,L,oe=this.asSeconds(),ve,Ye,Xt,Nn;return oe?(p=Kt(s/60),x=Kt(p/60),s%=60,p%=60,A=Kt(m/12),m%=12,L=s?s.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",Ye=Lo(this._months)!==Lo(oe)?"-":"",Xt=Lo(this._days)!==Lo(oe)?"-":"",Nn=Lo(this._milliseconds)!==Lo(oe)?"-":"",ve+"P"+(A?Ye+A+"Y":"")+(m?Ye+m+"M":"")+(u?Xt+u+"D":"")+(x||p||s?"T":"")+(x?Nn+x+"H":"")+(p?Nn+p+"M":"")+(s?Nn+L+"S":"")):"P0D"}var Ce=Kl.prototype;Ce.isValid=gD,Ce.abs=Xj,Ce.add=Qj,Ce.subtract=qj,Ce.as=Jj,Ce.asMilliseconds=tE,Ce.asSeconds=rE,Ce.asMinutes=nE,Ce.asHours=iE,Ce.asDays=oE,Ce.asWeeks=sE,Ce.asMonths=aE,Ce.asQuarters=lE,Ce.asYears=cE,Ce.valueOf=eE,Ce._bubble=Zj,Ce.clone=uE,Ce.get=dE,Ce.milliseconds=fE,Ce.seconds=hE,Ce.minutes=mE,Ce.hours=pE,Ce.days=gE,Ce.weeks=wE,Ce.months=vE,Ce.years=yE,Ce.humanize=kE,Ce.toISOString=tc,Ce.toString=tc,Ce.toJSON=tc,Ce.locale=zv,Ce.localeData=Hv,Ce.toIsoString=Y("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",tc),Ce.lang=Yv,K("X",0,0,"unix"),K("x",0,0,"valueOf"),X("x",Dn),X("X",ta),me("X",function(s,u,m){m._d=new Date(parseFloat(s)*1e3)}),me("x",function(s,u,m){m._d=new Date(ge(s))});//! moment.js -return n.version="2.29.4",i($e),n.fn=V,n.min=fD,n.max=hD,n.now=mD,n.utc=k,n.unix=Vj,n.months=$j,n.isDate=v,n.locale=hi,n.invalid=S,n.duration=Vr,n.isMoment=O,n.weekdays=Wj,n.parseZone=Uj,n.localeData=Pn,n.isDuration=Xl,n.monthsShort=Bj,n.weekdaysMin=Kj,n.defineLocale=kf,n.updateLocale=UC,n.locales=$C,n.weekdaysShort=Gj,n.normalizeUnits=jt,n.relativeTimeRounding=SE,n.relativeTimeThreshold=bE,n.calendarFormat=YD,n.prototype=V,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n})}(fW)),Zu}(function(e,t){(function(r,n){n(typeof kk=="function"?hW():r.moment)})(Go,function(r){//! moment.js locale configuration -var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(i,o){return i===12&&(i=0),o==="凌晨"||o==="早上"||o==="上午"?i:o==="下午"||o==="晚上"?i+12:i>=11?i:i+12},meridiem:function(i,o,a){var c=i*100+o;return c<600?"凌晨":c<900?"早上":c<1130?"上午":c<1230?"中午":c<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(i){return i.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(i){return this.week()!==i.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(i,o){switch(o){case"d":case"D":case"DDD":return i+"日";case"M":return i+"月";case"w":case"W":return i+"周";default:return i}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return n})})();const Ck="/zh-cn/assets/wechat-qrcode-8dca7947.png",Dk="/zh-cn/assets/logo-image-91f154f1.svg",jk="/zh-cn/assets/location-cf5a6f84.svg",Ek="/zh-cn/assets/clock-718648c0.svg",Ak="/zh-cn/assets/calendar-cd5a76f0.svg";B.locale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:mW,Paragraph:pW}=Pe,{CNTitleMedium:Tk,CNTitleSmall:gW}=mW,{CNBodySmall:Ao,CNMarkSmall:vW,CNBodyLarge:yW,CNMarkMedium:Rk}=pW,wW=f.div` +`+new Error().stack),m=!1}return u.apply(this,arguments)},u)}var ee={};function te(s,u){n.deprecationHandler!=null&&n.deprecationHandler(s,u),ee[s]||(z(u),ee[s]=!0)}n.suppressDeprecationWarnings=!1,n.deprecationHandler=null;function G(s){return typeof Function<"u"&&s instanceof Function||Object.prototype.toString.call(s)==="[object Function]"}function lt(s){var u,m;for(m in s)c(s,m)&&(u=s[m],G(u)?this[m]=u:this["_"+m]=u);this._config=s,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function Ee(s,u){var m=k({},s),p;for(p in u)c(u,p)&&(a(s[p])&&a(u[p])?(m[p]={},k(m[p],s[p]),k(m[p],u[p])):u[p]!=null?m[p]=u[p]:delete m[p]);for(p in s)c(s,p)&&!c(u,p)&&a(s[p])&&(m[p]=k({},m[p]));return m}function ze(s){s!=null&&this.set(s)}var mt;Object.keys?mt=Object.keys:mt=function(s){var u,m=[];for(u in s)c(s,u)&&m.push(u);return m};var $={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"};function le(s,u,m){var p=this._calendar[s]||this._calendar.sameElse;return G(p)?p.call(u,m):p}function Q(s,u,m){var p=""+Math.abs(s),x=u-p.length,A=s>=0;return(A?m?"+":"":"-")+Math.pow(10,Math.max(0,x)).toString().substr(1)+p}var ue=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,he=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,st={},Fe={};function K(s,u,m,p){var x=p;typeof p=="string"&&(x=function(){return this[p]()}),s&&(Fe[s]=x),u&&(Fe[u[0]]=function(){return Q(x.apply(this,arguments),u[1],u[2])}),m&&(Fe[m]=function(){return this.localeData().ordinal(x.apply(this,arguments),s)})}function zt(s){return s.match(/\[[\s\S]/)?s.replace(/^\[|\]$/g,""):s.replace(/\\/g,"")}function rr(s){var u=s.match(ue),m,p;for(m=0,p=u.length;m=0&&he.test(s);)s=s.replace(he,p),he.lastIndex=0,m-=1;return s}var mr={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"};function Ki(s){var u=this._longDateFormat[s],m=this._longDateFormat[s.toUpperCase()];return u||!m?u:(this._longDateFormat[s]=m.match(ue).map(function(p){return p==="MMMM"||p==="MM"||p==="DD"||p==="dddd"?p.slice(1):p}).join(""),this._longDateFormat[s])}var Dr="Invalid date";function pr(){return this._invalidDate}var qs="%d",Zs=/\d{1,2}/;function Js(s){return this._ordinal.replace("%d",s)}var ci={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"};function Vl(s,u,m,p){var x=this._relativeTime[m];return G(x)?x(s,u,m,p):x.replace(/%d/i,s)}function Fl(s,u){var m=this._relativeTime[s>0?"future":"past"];return G(m)?m(u):m.replace(/%s/i,u)}var ui={};function Dt(s,u){var m=s.toLowerCase();ui[m]=ui[m+"s"]=ui[u]=s}function jt(s){return typeof s=="string"?ui[s]||ui[s.toLowerCase()]:void 0}function di(s){var u={},m,p;for(p in s)c(s,p)&&(m=jt(p),m&&(u[m]=s[p]));return u}var ea={};function pt(s,u){ea[s]=u}function xf(s){var u=[],m;for(m in s)c(s,m)&&u.push({unit:m,priority:ea[m]});return u.sort(function(p,x){return p.priority-x.priority}),u}function To(s){return s%4===0&&s%100!==0||s%400===0}function Kt(s){return s<0?Math.ceil(s)||0:Math.floor(s)}function ge(s){var u=+s,m=0;return u!==0&&isFinite(u)&&(m=Kt(u)),m}function M(s,u){return function(m){return m!=null?(H(this,s,m),n.updateOffset(this,u),this):N(this,s)}}function N(s,u){return s.isValid()?s._d["get"+(s._isUTC?"UTC":"")+u]():NaN}function H(s,u,m){s.isValid()&&!isNaN(m)&&(u==="FullYear"&&To(s.year())&&s.month()===1&&s.date()===29?(m=ge(m),s._d["set"+(s._isUTC?"UTC":"")+u](m,s.month(),$l(m,s.month()))):s._d["set"+(s._isUTC?"UTC":"")+u](m))}function J(s){return s=jt(s),G(this[s])?this[s]():this}function re(s,u){if(typeof s=="object"){s=di(s);var m=xf(s),p,x=m.length;for(p=0;p68?1900:2e3)};var xv=M("FullYear",!0);function cC(){return To(this.year())}function uC(s,u,m,p,x,A,L){var oe;return s<100&&s>=0?(oe=new Date(s+400,u,m,p,x,A,L),isFinite(oe.getFullYear())&&oe.setFullYear(s)):oe=new Date(s,u,m,p,x,A,L),oe}function na(s){var u,m;return s<100&&s>=0?(m=Array.prototype.slice.call(arguments),m[0]=s+400,u=new Date(Date.UTC.apply(null,m)),isFinite(u.getUTCFullYear())&&u.setUTCFullYear(s)):u=new Date(Date.UTC.apply(null,arguments)),u}function Bl(s,u,m){var p=7+u-m,x=(7+na(s,0,p).getUTCDay()-u)%7;return-x+p-1}function _v(s,u,m,p,x){var A=(7+m-p)%7,L=Bl(s,p,x),oe=1+7*(u-1)+A+L,ve,Ye;return oe<=0?(ve=s-1,Ye=ra(ve)+oe):oe>ra(s)?(ve=s+1,Ye=oe-ra(s)):(ve=s,Ye=oe),{year:ve,dayOfYear:Ye}}function ia(s,u,m){var p=Bl(s.year(),u,m),x=Math.floor((s.dayOfYear()-p-1)/7)+1,A,L;return x<1?(L=s.year()-1,A=x+On(L,u,m)):x>On(s.year(),u,m)?(A=x-On(s.year(),u,m),L=s.year()+1):(L=s.year(),A=x),{week:A,year:L}}function On(s,u,m){var p=Bl(s,u,m),x=Bl(s+1,u,m);return(ra(s)-p+x)/7}K("w",["ww",2],"wo","week"),K("W",["WW",2],"Wo","isoWeek"),Dt("week","w"),Dt("isoWeek","W"),pt("week",5),pt("isoWeek",5),X("w",ae),X("ww",ae,ie),X("W",ae),X("WW",ae,ie),An(["w","ww","W","WW"],function(s,u,m,p){u[p.substr(0,1)]=ge(s)});function dC(s){return ia(s,this._week.dow,this._week.doy).week}var fC={dow:0,doy:6};function hC(){return this._week.dow}function mC(){return this._week.doy}function pC(s){var u=this.localeData().week(this);return s==null?u:this.add((s-u)*7,"d")}function gC(s){var u=ia(this,1,4).week;return s==null?u:this.add((s-u)*7,"d")}K("d",0,"do","day"),K("dd",0,0,function(s){return this.localeData().weekdaysMin(this,s)}),K("ddd",0,0,function(s){return this.localeData().weekdaysShort(this,s)}),K("dddd",0,0,function(s){return this.localeData().weekdays(this,s)}),K("e",0,0,"weekday"),K("E",0,0,"isoWeekday"),Dt("day","d"),Dt("weekday","e"),Dt("isoWeekday","E"),pt("day",11),pt("weekday",11),pt("isoWeekday",11),X("d",ae),X("e",ae),X("E",ae),X("dd",function(s,u){return u.weekdaysMinRegex(s)}),X("ddd",function(s,u){return u.weekdaysShortRegex(s)}),X("dddd",function(s,u){return u.weekdaysRegex(s)}),An(["dd","ddd","dddd"],function(s,u,m,p){var x=m._locale.weekdaysParse(s,p,m._strict);x!=null?u.d=x:j(m).invalidWeekday=s}),An(["d","e","E"],function(s,u,m,p){u[p]=ge(s)});function vC(s,u){return typeof s!="string"?s:isNaN(s)?(s=u.weekdaysParse(s),typeof s=="number"?s:null):parseInt(s,10)}function yC(s,u){return typeof s=="string"?u.weekdaysParse(s)%7||7:isNaN(s)?null:s}function _f(s,u){return s.slice(u,7).concat(s.slice(0,u))}var wC="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Sv="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),xC="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),_C=En,SC=En,bC=En;function kC(s,u){var m=o(this._weekdays)?this._weekdays:this._weekdays[s&&s!==!0&&this._weekdays.isFormat.test(u)?"format":"standalone"];return s===!0?_f(m,this._week.dow):s?m[s.day()]:m}function CC(s){return s===!0?_f(this._weekdaysShort,this._week.dow):s?this._weekdaysShort[s.day()]:this._weekdaysShort}function DC(s){return s===!0?_f(this._weekdaysMin,this._week.dow):s?this._weekdaysMin[s.day()]:this._weekdaysMin}function jC(s,u,m){var p,x,A,L=s.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],p=0;p<7;++p)A=C([2e3,1]).day(p),this._minWeekdaysParse[p]=this.weekdaysMin(A,"").toLocaleLowerCase(),this._shortWeekdaysParse[p]=this.weekdaysShort(A,"").toLocaleLowerCase(),this._weekdaysParse[p]=this.weekdays(A,"").toLocaleLowerCase();return m?u==="dddd"?(x=ut.call(this._weekdaysParse,L),x!==-1?x:null):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null):(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null):u==="dddd"?(x=ut.call(this._weekdaysParse,L),x!==-1||(x=ut.call(this._shortWeekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):u==="ddd"?(x=ut.call(this._shortWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._minWeekdaysParse,L),x!==-1?x:null)):(x=ut.call(this._minWeekdaysParse,L),x!==-1||(x=ut.call(this._weekdaysParse,L),x!==-1)?x:(x=ut.call(this._shortWeekdaysParse,L),x!==-1?x:null))}function EC(s,u,m){var p,x,A;if(this._weekdaysParseExact)return jC.call(this,s,u,m);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),p=0;p<7;p++){if(x=C([2e3,1]).day(p),m&&!this._fullWeekdaysParse[p]&&(this._fullWeekdaysParse[p]=new RegExp("^"+this.weekdays(x,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[p]=new RegExp("^"+this.weekdaysShort(x,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[p]=new RegExp("^"+this.weekdaysMin(x,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[p]||(A="^"+this.weekdays(x,"")+"|^"+this.weekdaysShort(x,"")+"|^"+this.weekdaysMin(x,""),this._weekdaysParse[p]=new RegExp(A.replace(".",""),"i")),m&&u==="dddd"&&this._fullWeekdaysParse[p].test(s))return p;if(m&&u==="ddd"&&this._shortWeekdaysParse[p].test(s))return p;if(m&&u==="dd"&&this._minWeekdaysParse[p].test(s))return p;if(!m&&this._weekdaysParse[p].test(s))return p}}function AC(s){if(!this.isValid())return s!=null?this:NaN;var u=this._isUTC?this._d.getUTCDay():this._d.getDay();return s!=null?(s=vC(s,this.localeData()),this.add(s-u,"d")):u}function TC(s){if(!this.isValid())return s!=null?this:NaN;var u=(this.day()+7-this.localeData()._week.dow)%7;return s==null?u:this.add(s-u,"d")}function RC(s){if(!this.isValid())return s!=null?this:NaN;if(s!=null){var u=yC(s,this.localeData());return this.day(this.day()%7?u:u-7)}else return this.day()||7}function OC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysStrictRegex:this._weekdaysRegex):(c(this,"_weekdaysRegex")||(this._weekdaysRegex=_C),this._weekdaysStrictRegex&&s?this._weekdaysStrictRegex:this._weekdaysRegex)}function PC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(c(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=SC),this._weekdaysShortStrictRegex&&s?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function MC(s){return this._weekdaysParseExact?(c(this,"_weekdaysRegex")||Sf.call(this),s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(c(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=bC),this._weekdaysMinStrictRegex&&s?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Sf(){function s(Xt,Nn){return Nn.length-Xt.length}var u=[],m=[],p=[],x=[],A,L,oe,ve,Ye;for(A=0;A<7;A++)L=C([2e3,1]).day(A),oe=gt(this.weekdaysMin(L,"")),ve=gt(this.weekdaysShort(L,"")),Ye=gt(this.weekdays(L,"")),u.push(oe),m.push(ve),p.push(Ye),x.push(oe),x.push(ve),x.push(Ye);u.sort(s),m.sort(s),p.sort(s),x.sort(s),this._weekdaysRegex=new RegExp("^("+x.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+p.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+m.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+u.join("|")+")","i")}function bf(){return this.hours()%12||12}function LC(){return this.hours()||24}K("H",["HH",2],0,"hour"),K("h",["hh",2],0,bf),K("k",["kk",2],0,LC),K("hmm",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)}),K("hmmss",0,0,function(){return""+bf.apply(this)+Q(this.minutes(),2)+Q(this.seconds(),2)}),K("Hmm",0,0,function(){return""+this.hours()+Q(this.minutes(),2)}),K("Hmmss",0,0,function(){return""+this.hours()+Q(this.minutes(),2)+Q(this.seconds(),2)});function bv(s,u){K(s,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),u)})}bv("a",!0),bv("A",!1),Dt("hour","h"),pt("hour",13);function kv(s,u){return u._meridiemParse}X("a",kv),X("A",kv),X("H",ae),X("h",ae),X("k",ae),X("HH",ae,ie),X("hh",ae,ie),X("kk",ae,ie),X("hmm",xt),X("hmmss",ct),X("Hmm",xt),X("Hmmss",ct),me(["H","HH"],_t),me(["k","kk"],function(s,u,m){var p=ge(s);u[_t]=p===24?0:p}),me(["a","A"],function(s,u,m){m._isPm=m._locale.isPM(s),m._meridiem=s}),me(["h","hh"],function(s,u,m){u[_t]=ge(s),j(m).bigHour=!0}),me("hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p)),j(m).bigHour=!0}),me("hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x)),j(m).bigHour=!0}),me("Hmm",function(s,u,m){var p=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p))}),me("Hmmss",function(s,u,m){var p=s.length-4,x=s.length-2;u[_t]=ge(s.substr(0,p)),u[Vr]=ge(s.substr(p,2)),u[Rn]=ge(s.substr(x))});function IC(s){return(s+"").toLowerCase().charAt(0)==="p"}var NC=/[ap]\.?m?\.?/i,zC=M("Hours",!0);function YC(s,u,m){return s>11?m?"pm":"PM":m?"am":"AM"}var Cv={calendar:$,longDateFormat:mr,invalidDate:Dr,ordinal:qs,dayOfMonthOrdinalParse:Zs,relativeTime:ci,months:Jk,monthsShort:pv,week:fC,weekdays:wC,weekdaysMin:xC,weekdaysShort:Sv,meridiemParse:NC},Qe={},oa={},sa;function HC(s,u){var m,p=Math.min(s.length,u.length);for(m=0;m0;){if(x=Wl(A.slice(0,m).join("-")),x)return x;if(p&&p.length>=m&&HC(A,p)>=m-1)break;m--}u++}return sa}function FC(s){return s.match("^[^/\\\\]*$")!=null}function Wl(s){var u=null,m;if(Qe[s]===void 0&&e&&e.exports&&FC(s))try{u=sa._abbr,m=kk,m("./locale/"+s),hi(u)}catch{Qe[s]=null}return Qe[s]}function hi(s,u){var m;return s&&(h(u)?m=Pn(s):m=kf(s,u),m?sa=m:typeof console<"u"&&console.warn&&console.warn("Locale "+s+" not found. Did you forget to load it?")),sa._abbr}function kf(s,u){if(u!==null){var m,p=Cv;if(u.abbr=s,Qe[s]!=null)te("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),p=Qe[s]._config;else if(u.parentLocale!=null)if(Qe[u.parentLocale]!=null)p=Qe[u.parentLocale]._config;else if(m=Wl(u.parentLocale),m!=null)p=m._config;else return oa[u.parentLocale]||(oa[u.parentLocale]=[]),oa[u.parentLocale].push({name:s,config:u}),null;return Qe[s]=new ze(Ee(p,u)),oa[s]&&oa[s].forEach(function(x){kf(x.name,x.config)}),hi(s),Qe[s]}else return delete Qe[s],null}function UC(s,u){if(u!=null){var m,p,x=Cv;Qe[s]!=null&&Qe[s].parentLocale!=null?Qe[s].set(Ee(Qe[s]._config,u)):(p=Wl(s),p!=null&&(x=p._config),u=Ee(x,u),p==null&&(u.abbr=s),m=new ze(u),m.parentLocale=Qe[s],Qe[s]=m),hi(s)}else Qe[s]!=null&&(Qe[s].parentLocale!=null?(Qe[s]=Qe[s].parentLocale,s===hi()&&hi(s)):Qe[s]!=null&&delete Qe[s]);return Qe[s]}function Pn(s){var u;if(s&&s._locale&&s._locale._abbr&&(s=s._locale._abbr),!s)return sa;if(!o(s)){if(u=Wl(s),u)return u;s=[s]}return VC(s)}function $C(){return mt(Qe)}function Cf(s){var u,m=s._a;return m&&j(s).overflow===-2&&(u=m[Tn]<0||m[Tn]>11?Tn:m[an]<1||m[an]>$l(m[Et],m[Tn])?an:m[_t]<0||m[_t]>24||m[_t]===24&&(m[Vr]!==0||m[Rn]!==0||m[Qi]!==0)?_t:m[Vr]<0||m[Vr]>59?Vr:m[Rn]<0||m[Rn]>59?Rn:m[Qi]<0||m[Qi]>999?Qi:-1,j(s)._overflowDayOfYear&&(uan)&&(u=an),j(s)._overflowWeeks&&u===-1&&(u=Qk),j(s)._overflowWeekday&&u===-1&&(u=qk),j(s).overflow=u),s}var BC=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,WC=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/,GC=/Z|[+-]\d\d(?::?\d\d)?/,Gl=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/],["YYYYMM",/\d{6}/,!1],["YYYY",/\d{4}/,!1]],Df=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],KC=/^\/?Date\((-?\d+)/i,XC=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,QC={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function jv(s){var u,m,p=s._i,x=BC.exec(p)||WC.exec(p),A,L,oe,ve,Ye=Gl.length,Xt=Df.length;if(x){for(j(s).iso=!0,u=0,m=Ye;ura(L)||s._dayOfYear===0)&&(j(s)._overflowDayOfYear=!0),m=na(L,0,s._dayOfYear),s._a[Tn]=m.getUTCMonth(),s._a[an]=m.getUTCDate()),u=0;u<3&&s._a[u]==null;++u)s._a[u]=p[u]=x[u];for(;u<7;u++)s._a[u]=p[u]=s._a[u]==null?u===2?1:0:s._a[u];s._a[_t]===24&&s._a[Vr]===0&&s._a[Rn]===0&&s._a[Qi]===0&&(s._nextDay=!0,s._a[_t]=0),s._d=(s._useUTC?na:uC).apply(null,p),A=s._useUTC?s._d.getUTCDay():s._d.getDay(),s._tzm!=null&&s._d.setUTCMinutes(s._d.getUTCMinutes()-s._tzm),s._nextDay&&(s._a[_t]=24),s._w&&typeof s._w.d<"u"&&s._w.d!==A&&(j(s).weekdayMismatch=!0)}}function iD(s){var u,m,p,x,A,L,oe,ve,Ye;u=s._w,u.GG!=null||u.W!=null||u.E!=null?(A=1,L=4,m=Ro(u.GG,s._a[Et],ia($e(),1,4).year),p=Ro(u.W,1),x=Ro(u.E,1),(x<1||x>7)&&(ve=!0)):(A=s._locale._week.dow,L=s._locale._week.doy,Ye=ia($e(),A,L),m=Ro(u.gg,s._a[Et],Ye.year),p=Ro(u.w,Ye.week),u.d!=null?(x=u.d,(x<0||x>6)&&(ve=!0)):u.e!=null?(x=u.e+A,(u.e<0||u.e>6)&&(ve=!0)):x=A),p<1||p>On(m,A,L)?j(s)._overflowWeeks=!0:ve!=null?j(s)._overflowWeekday=!0:(oe=_v(m,p,x,A,L),s._a[Et]=oe.year,s._dayOfYear=oe.dayOfYear)}n.ISO_8601=function(){},n.RFC_2822=function(){};function Ef(s){if(s._f===n.ISO_8601){jv(s);return}if(s._f===n.RFC_2822){Ev(s);return}s._a=[],j(s).empty=!0;var u=""+s._i,m,p,x,A,L,oe=u.length,ve=0,Ye,Xt;for(x=Hr(s._f,s._locale).match(ue)||[],Xt=x.length,m=0;m0&&j(s).unusedInput.push(L),u=u.slice(u.indexOf(p)+p.length),ve+=p.length),Fe[A]?(p?j(s).empty=!1:j(s).unusedTokens.push(A),Ul(A,p,s)):s._strict&&!p&&j(s).unusedTokens.push(A);j(s).charsLeftOver=oe-ve,u.length>0&&j(s).unusedInput.push(u),s._a[_t]<=12&&j(s).bigHour===!0&&s._a[_t]>0&&(j(s).bigHour=void 0),j(s).parsedDateParts=s._a.slice(0),j(s).meridiem=s._meridiem,s._a[_t]=oD(s._locale,s._a[_t],s._meridiem),Ye=j(s).era,Ye!==null&&(s._a[Et]=s._locale.erasConvertYear(Ye,s._a[Et])),jf(s),Cf(s)}function oD(s,u,m){var p;return m==null?u:s.meridiemHour!=null?s.meridiemHour(u,m):(s.isPM!=null&&(p=s.isPM(m),p&&u<12&&(u+=12),!p&&u===12&&(u=0)),u)}function sD(s){var u,m,p,x,A,L,oe=!1,ve=s._f.length;if(ve===0){j(s).invalidFormat=!0,s._d=new Date(NaN);return}for(x=0;xthis?this:s:S()});function Rv(s,u){var m,p;if(u.length===1&&o(u[0])&&(u=u[0]),!u.length)return $e();for(m=u[0],p=1;pthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function jD(){if(!h(this._isDSTShifted))return this._isDSTShifted;var s={},u;return R(s,this),s=Av(s),s._a?(u=s._isUTC?C(s._a):$e(s._a),this._isDSTShifted=this.isValid()&&yD(s._a,u.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function ED(){return this.isValid()?!this._isUTC:!1}function AD(){return this.isValid()?this._isUTC:!1}function Pv(){return this.isValid()?this._isUTC&&this._offset===0:!1}var TD=/^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/,RD=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function Fr(s,u){var m=s,p=null,x,A,L;return Xl(s)?m={ms:s._milliseconds,d:s._days,M:s._months}:g(s)||!isNaN(+s)?(m={},u?m[u]=+s:m.milliseconds=+s):(p=TD.exec(s))?(x=p[1]==="-"?-1:1,m={y:0,d:ge(p[an])*x,h:ge(p[_t])*x,m:ge(p[Vr])*x,s:ge(p[Rn])*x,ms:ge(Af(p[Qi]*1e3))*x}):(p=RD.exec(s))?(x=p[1]==="-"?-1:1,m={y:qi(p[2],x),M:qi(p[3],x),w:qi(p[4],x),d:qi(p[5],x),h:qi(p[6],x),m:qi(p[7],x),s:qi(p[8],x)}):m==null?m={}:typeof m=="object"&&("from"in m||"to"in m)&&(L=OD($e(m.from),$e(m.to)),m={},m.ms=L.milliseconds,m.M=L.months),A=new Kl(m),Xl(s)&&c(s,"_locale")&&(A._locale=s._locale),Xl(s)&&c(s,"_isValid")&&(A._isValid=s._isValid),A}Fr.fn=Kl.prototype,Fr.invalid=vD;function qi(s,u){var m=s&&parseFloat(s.replace(",","."));return(isNaN(m)?0:m)*u}function Mv(s,u){var m={};return m.months=u.month()-s.month()+(u.year()-s.year())*12,s.clone().add(m.months,"M").isAfter(u)&&--m.months,m.milliseconds=+u-+s.clone().add(m.months,"M"),m}function OD(s,u){var m;return s.isValid()&&u.isValid()?(u=Rf(u,s),s.isBefore(u)?m=Mv(s,u):(m=Mv(u,s),m.milliseconds=-m.milliseconds,m.months=-m.months),m):{milliseconds:0,months:0}}function Lv(s,u){return function(m,p){var x,A;return p!==null&&!isNaN(+p)&&(te(u,"moment()."+u+"(period, number) is deprecated. Please use moment()."+u+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),A=m,m=p,p=A),x=Fr(m,p),Iv(this,x,s),this}}function Iv(s,u,m,p){var x=u._milliseconds,A=Af(u._days),L=Af(u._months);s.isValid()&&(p=p??!0,L&&vv(s,N(s,"Month")+L*m),A&&H(s,"Date",N(s,"Date")+A*m),x&&s._d.setTime(s._d.valueOf()+x*m),p&&n.updateOffset(s,A||L))}var PD=Lv(1,"add"),MD=Lv(-1,"subtract");function Nv(s){return typeof s=="string"||s instanceof String}function LD(s){return O(s)||v(s)||Nv(s)||g(s)||ND(s)||ID(s)||s===null||s===void 0}function ID(s){var u=a(s)&&!d(s),m=!1,p=["years","year","y","months","month","M","days","day","d","dates","date","D","hours","hour","h","minutes","minute","m","seconds","second","s","milliseconds","millisecond","ms"],x,A,L=p.length;for(x=0;xm.valueOf():m.valueOf()9999?Yr(m,u?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):G(Date.prototype.toISOString)?u?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace("Z",Yr(m,"Z")):Yr(m,u?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function qD(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var s="moment",u="",m,p,x,A;return this.isLocal()||(s=this.utcOffset()===0?"moment.utc":"moment.parseZone",u="Z"),m="["+s+'("]',p=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",x="-MM-DD[T]HH:mm:ss.SSS",A=u+'[")]',this.format(m+p+x+A)}function ZD(s){s||(s=this.isUtc()?n.defaultFormatUtc:n.defaultFormat);var u=Yr(this,s);return this.localeData().postformat(u)}function JD(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Fr({to:this,from:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function ej(s){return this.from($e(),s)}function tj(s,u){return this.isValid()&&(O(s)&&s.isValid()||$e(s).isValid())?Fr({from:this,to:s}).locale(this.locale()).humanize(!u):this.localeData().invalidDate()}function rj(s){return this.to($e(),s)}function zv(s){var u;return s===void 0?this._locale._abbr:(u=Pn(s),u!=null&&(this._locale=u),this)}var Yv=Y("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(s){return s===void 0?this.localeData():this.locale(s)});function Hv(){return this._locale}var ql=1e3,Oo=60*ql,Zl=60*Oo,Vv=(365*400+97)*24*Zl;function Po(s,u){return(s%u+u)%u}function Fv(s,u,m){return s<100&&s>=0?new Date(s+400,u,m)-Vv:new Date(s,u,m).valueOf()}function Uv(s,u,m){return s<100&&s>=0?Date.UTC(s+400,u,m)-Vv:Date.UTC(s,u,m)}function nj(s){var u,m;if(s=jt(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Fv,s){case"year":u=m(this.year(),0,1);break;case"quarter":u=m(this.year(),this.month()-this.month()%3,1);break;case"month":u=m(this.year(),this.month(),1);break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday());break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case"day":case"date":u=m(this.year(),this.month(),this.date());break;case"hour":u=this._d.valueOf(),u-=Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl);break;case"minute":u=this._d.valueOf(),u-=Po(u,Oo);break;case"second":u=this._d.valueOf(),u-=Po(u,ql);break}return this._d.setTime(u),n.updateOffset(this,!0),this}function ij(s){var u,m;if(s=jt(s),s===void 0||s==="millisecond"||!this.isValid())return this;switch(m=this._isUTC?Uv:Fv,s){case"year":u=m(this.year()+1,0,1)-1;break;case"quarter":u=m(this.year(),this.month()-this.month()%3+3,1)-1;break;case"month":u=m(this.year(),this.month()+1,1)-1;break;case"week":u=m(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case"isoWeek":u=m(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case"day":case"date":u=m(this.year(),this.month(),this.date()+1)-1;break;case"hour":u=this._d.valueOf(),u+=Zl-Po(u+(this._isUTC?0:this.utcOffset()*Oo),Zl)-1;break;case"minute":u=this._d.valueOf(),u+=Oo-Po(u,Oo)-1;break;case"second":u=this._d.valueOf(),u+=ql-Po(u,ql)-1;break}return this._d.setTime(u),n.updateOffset(this,!0),this}function oj(){return this._d.valueOf()-(this._offset||0)*6e4}function sj(){return Math.floor(this.valueOf()/1e3)}function aj(){return new Date(this.valueOf())}function lj(){var s=this;return[s.year(),s.month(),s.date(),s.hour(),s.minute(),s.second(),s.millisecond()]}function cj(){var s=this;return{years:s.year(),months:s.month(),date:s.date(),hours:s.hours(),minutes:s.minutes(),seconds:s.seconds(),milliseconds:s.milliseconds()}}function uj(){return this.isValid()?this.toISOString():null}function dj(){return w(this)}function fj(){return k({},j(this))}function hj(){return j(this).overflow}function mj(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}K("N",0,0,"eraAbbr"),K("NN",0,0,"eraAbbr"),K("NNN",0,0,"eraAbbr"),K("NNNN",0,0,"eraName"),K("NNNNN",0,0,"eraNarrow"),K("y",["y",1],"yo","eraYear"),K("y",["yy",2],0,"eraYear"),K("y",["yyy",3],0,"eraYear"),K("y",["yyyy",4],0,"eraYear"),X("N",Pf),X("NN",Pf),X("NNN",Pf),X("NNNN",Cj),X("NNNNN",Dj),me(["N","NN","NNN","NNNN","NNNNN"],function(s,u,m,p){var x=m._locale.erasParse(s,p,m._strict);x?j(m).era=x:j(m).invalidEra=s}),X("y",on),X("yy",on),X("yyy",on),X("yyyy",on),X("yo",jj),me(["y","yy","yyy","yyyy"],Et),me(["yo"],function(s,u,m,p){var x;m._locale._eraYearOrdinalRegex&&(x=s.match(m._locale._eraYearOrdinalRegex)),m._locale.eraYearOrdinalParse?u[Et]=m._locale.eraYearOrdinalParse(s,x):u[Et]=parseInt(s,10)});function pj(s,u){var m,p,x,A=this._eras||Pn("en")._eras;for(m=0,p=A.length;m=0)return A[p]}function vj(s,u){var m=s.since<=s.until?1:-1;return u===void 0?n(s.since).year():n(s.since).year()+(u-s.offset)*m}function yj(){var s,u,m,p=this.localeData().eras();for(s=0,u=p.length;sA&&(u=A),Mj.call(this,s,u,m,p,x))}function Mj(s,u,m,p,x){var A=_v(s,u,m,p,x),L=na(A.year,0,A.dayOfYear);return this.year(L.getUTCFullYear()),this.month(L.getUTCMonth()),this.date(L.getUTCDate()),this}K("Q",0,"Qo","quarter"),Dt("quarter","Q"),pt("quarter",7),X("Q",fe),me("Q",function(s,u){u[Tn]=(ge(s)-1)*3});function Lj(s){return s==null?Math.ceil((this.month()+1)/3):this.month((s-1)*3+this.month()%3)}K("D",["DD",2],"Do","date"),Dt("date","D"),pt("date",9),X("D",ae),X("DD",ae,ie),X("Do",function(s,u){return s?u._dayOfMonthOrdinalParse||u._ordinalParse:u._dayOfMonthOrdinalParseLenient}),me(["D","DD"],an),me("Do",function(s,u){u[an]=ge(s.match(ae)[0])});var Bv=M("Date",!0);K("DDD",["DDDD",3],"DDDo","dayOfYear"),Dt("dayOfYear","DDD"),pt("dayOfYear",4),X("DDD",tt),X("DDDD",ce),me(["DDD","DDDD"],function(s,u,m){m._dayOfYear=ge(s)});function Ij(s){var u=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return s==null?u:this.add(s-u,"d")}K("m",["mm",2],0,"minute"),Dt("minute","m"),pt("minute",14),X("m",ae),X("mm",ae,ie),me(["m","mm"],Vr);var Nj=M("Minutes",!1);K("s",["ss",2],0,"second"),Dt("second","s"),pt("second",15),X("s",ae),X("ss",ae,ie),me(["s","ss"],Rn);var zj=M("Seconds",!1);K("S",0,0,function(){return~~(this.millisecond()/100)}),K(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),K(0,["SSS",3],0,"millisecond"),K(0,["SSSS",4],0,function(){return this.millisecond()*10}),K(0,["SSSSS",5],0,function(){return this.millisecond()*100}),K(0,["SSSSSS",6],0,function(){return this.millisecond()*1e3}),K(0,["SSSSSSS",7],0,function(){return this.millisecond()*1e4}),K(0,["SSSSSSSS",8],0,function(){return this.millisecond()*1e5}),K(0,["SSSSSSSSS",9],0,function(){return this.millisecond()*1e6}),Dt("millisecond","ms"),pt("millisecond",16),X("S",tt,fe),X("SS",tt,ie),X("SSS",tt,ce);var mi,Wv;for(mi="SSSS";mi.length<=9;mi+="S")X(mi,on);function Yj(s,u){u[Qi]=ge(("0."+s)*1e3)}for(mi="S";mi.length<=9;mi+="S")me(mi,Yj);Wv=M("Milliseconds",!1),K("z",0,0,"zoneAbbr"),K("zz",0,0,"zoneName");function Hj(){return this._isUTC?"UTC":""}function Vj(){return this._isUTC?"Coordinated Universal Time":""}var F=P.prototype;F.add=PD,F.calendar=HD,F.clone=VD,F.diff=KD,F.endOf=ij,F.format=ZD,F.from=JD,F.fromNow=ej,F.to=tj,F.toNow=rj,F.get=J,F.invalidAt=hj,F.isAfter=FD,F.isBefore=UD,F.isBetween=$D,F.isSame=BD,F.isSameOrAfter=WD,F.isSameOrBefore=GD,F.isValid=dj,F.lang=Yv,F.locale=zv,F.localeData=Hv,F.max=dD,F.min=uD,F.parsingFlags=fj,F.set=re,F.startOf=nj,F.subtract=MD,F.toArray=lj,F.toObject=cj,F.toDate=aj,F.toISOString=QD,F.inspect=qD,typeof Symbol<"u"&&Symbol.for!=null&&(F[Symbol.for("nodejs.util.inspect.custom")]=function(){return"Moment<"+this.format()+">"}),F.toJSON=uj,F.toString=XD,F.unix=sj,F.valueOf=oj,F.creationData=mj,F.eraName=yj,F.eraNarrow=wj,F.eraAbbr=xj,F.eraYear=_j,F.year=xv,F.isLeapYear=cC,F.weekYear=Ej,F.isoWeekYear=Aj,F.quarter=F.quarters=Lj,F.month=yv,F.daysInMonth=sC,F.week=F.weeks=pC,F.isoWeek=F.isoWeeks=gC,F.weeksInYear=Oj,F.weeksInWeekYear=Pj,F.isoWeeksInYear=Tj,F.isoWeeksInISOWeekYear=Rj,F.date=Bv,F.day=F.days=AC,F.weekday=TC,F.isoWeekday=RC,F.dayOfYear=Ij,F.hour=F.hours=zC,F.minute=F.minutes=Nj,F.second=F.seconds=zj,F.millisecond=F.milliseconds=Wv,F.utcOffset=xD,F.utc=SD,F.local=bD,F.parseZone=kD,F.hasAlignedHourOffset=CD,F.isDST=DD,F.isLocal=ED,F.isUtcOffset=AD,F.isUtc=Pv,F.isUTC=Pv,F.zoneAbbr=Hj,F.zoneName=Vj,F.dates=Y("dates accessor is deprecated. Use date instead.",Bv),F.months=Y("months accessor is deprecated. Use month instead",yv),F.years=Y("years accessor is deprecated. Use year instead",xv),F.zone=Y("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",_D),F.isDSTShifted=Y("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",jD);function Fj(s){return $e(s*1e3)}function Uj(){return $e.apply(null,arguments).parseZone()}function Gv(s){return s}var Ae=ze.prototype;Ae.calendar=le,Ae.longDateFormat=Ki,Ae.invalidDate=pr,Ae.ordinal=Js,Ae.preparse=Gv,Ae.postformat=Gv,Ae.relativeTime=Vl,Ae.pastFuture=Fl,Ae.set=lt,Ae.eras=pj,Ae.erasParse=gj,Ae.erasConvertYear=vj,Ae.erasAbbrRegex=bj,Ae.erasNameRegex=Sj,Ae.erasNarrowRegex=kj,Ae.months=rC,Ae.monthsShort=nC,Ae.monthsParse=oC,Ae.monthsRegex=lC,Ae.monthsShortRegex=aC,Ae.week=dC,Ae.firstDayOfYear=mC,Ae.firstDayOfWeek=hC,Ae.weekdays=kC,Ae.weekdaysMin=DC,Ae.weekdaysShort=CC,Ae.weekdaysParse=EC,Ae.weekdaysRegex=OC,Ae.weekdaysShortRegex=PC,Ae.weekdaysMinRegex=MC,Ae.isPM=IC,Ae.meridiem=YC;function ec(s,u,m,p){var x=Pn(),A=C().set(p,u);return x[m](A,s)}function Kv(s,u,m){if(g(s)&&(u=s,s=void 0),s=s||"",u!=null)return ec(s,u,m,"month");var p,x=[];for(p=0;p<12;p++)x[p]=ec(s,p,m,"month");return x}function Lf(s,u,m,p){typeof s=="boolean"?(g(u)&&(m=u,u=void 0),u=u||""):(u=s,m=u,s=!1,g(u)&&(m=u,u=void 0),u=u||"");var x=Pn(),A=s?x._week.dow:0,L,oe=[];if(m!=null)return ec(u,(m+A)%7,p,"day");for(L=0;L<7;L++)oe[L]=ec(u,(L+A)%7,p,"day");return oe}function $j(s,u){return Kv(s,u,"months")}function Bj(s,u){return Kv(s,u,"monthsShort")}function Wj(s,u,m){return Lf(s,u,m,"weekdays")}function Gj(s,u,m){return Lf(s,u,m,"weekdaysShort")}function Kj(s,u,m){return Lf(s,u,m,"weekdaysMin")}hi("en",{eras:[{since:"0001-01-01",until:1/0,offset:1,name:"Anno Domini",narrow:"AD",abbr:"AD"},{since:"0000-12-31",until:-1/0,offset:1,name:"Before Christ",narrow:"BC",abbr:"BC"}],dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(s){var u=s%10,m=ge(s%100/10)===1?"th":u===1?"st":u===2?"nd":u===3?"rd":"th";return s+m}}),n.lang=Y("moment.lang is deprecated. Use moment.locale instead.",hi),n.langData=Y("moment.langData is deprecated. Use moment.localeData instead.",Pn);var Mn=Math.abs;function Xj(){var s=this._data;return this._milliseconds=Mn(this._milliseconds),this._days=Mn(this._days),this._months=Mn(this._months),s.milliseconds=Mn(s.milliseconds),s.seconds=Mn(s.seconds),s.minutes=Mn(s.minutes),s.hours=Mn(s.hours),s.months=Mn(s.months),s.years=Mn(s.years),this}function Xv(s,u,m,p){var x=Fr(u,m);return s._milliseconds+=p*x._milliseconds,s._days+=p*x._days,s._months+=p*x._months,s._bubble()}function Qj(s,u){return Xv(this,s,u,1)}function qj(s,u){return Xv(this,s,u,-1)}function Qv(s){return s<0?Math.floor(s):Math.ceil(s)}function Zj(){var s=this._milliseconds,u=this._days,m=this._months,p=this._data,x,A,L,oe,ve;return s>=0&&u>=0&&m>=0||s<=0&&u<=0&&m<=0||(s+=Qv(If(m)+u)*864e5,u=0,m=0),p.milliseconds=s%1e3,x=Kt(s/1e3),p.seconds=x%60,A=Kt(x/60),p.minutes=A%60,L=Kt(A/60),p.hours=L%24,u+=Kt(L/24),ve=Kt(qv(u)),m+=ve,u-=Qv(If(ve)),oe=Kt(m/12),m%=12,p.days=u,p.months=m,p.years=oe,this}function qv(s){return s*4800/146097}function If(s){return s*146097/4800}function Jj(s){if(!this.isValid())return NaN;var u,m,p=this._milliseconds;if(s=jt(s),s==="month"||s==="quarter"||s==="year")switch(u=this._days+p/864e5,m=this._months+qv(u),s){case"month":return m;case"quarter":return m/3;case"year":return m/12}else switch(u=this._days+Math.round(If(this._months)),s){case"week":return u/7+p/6048e5;case"day":return u+p/864e5;case"hour":return u*24+p/36e5;case"minute":return u*1440+p/6e4;case"second":return u*86400+p/1e3;case"millisecond":return Math.floor(u*864e5)+p;default:throw new Error("Unknown unit "+s)}}function eE(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+ge(this._months/12)*31536e6:NaN}function Ln(s){return function(){return this.as(s)}}var tE=Ln("ms"),rE=Ln("s"),nE=Ln("m"),iE=Ln("h"),oE=Ln("d"),sE=Ln("w"),aE=Ln("M"),lE=Ln("Q"),cE=Ln("y");function uE(){return Fr(this)}function dE(s){return s=jt(s),this.isValid()?this[s+"s"]():NaN}function Zi(s){return function(){return this.isValid()?this._data[s]:NaN}}var fE=Zi("milliseconds"),hE=Zi("seconds"),mE=Zi("minutes"),pE=Zi("hours"),gE=Zi("days"),vE=Zi("months"),yE=Zi("years");function wE(){return Kt(this.days()/7)}var In=Math.round,Mo={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function xE(s,u,m,p,x){return x.relativeTime(u||1,!!m,s,p)}function _E(s,u,m,p){var x=Fr(s).abs(),A=In(x.as("s")),L=In(x.as("m")),oe=In(x.as("h")),ve=In(x.as("d")),Ye=In(x.as("M")),Xt=In(x.as("w")),Nn=In(x.as("y")),pi=A<=m.ss&&["s",A]||A0,pi[4]=p,xE.apply(null,pi)}function SE(s){return s===void 0?In:typeof s=="function"?(In=s,!0):!1}function bE(s,u){return Mo[s]===void 0?!1:u===void 0?Mo[s]:(Mo[s]=u,s==="s"&&(Mo.ss=u-1),!0)}function kE(s,u){if(!this.isValid())return this.localeData().invalidDate();var m=!1,p=Mo,x,A;return typeof s=="object"&&(u=s,s=!1),typeof s=="boolean"&&(m=s),typeof u=="object"&&(p=Object.assign({},Mo,u),u.s!=null&&u.ss==null&&(p.ss=u.s-1)),x=this.localeData(),A=_E(this,!m,p,x),m&&(A=x.pastFuture(+this,A)),x.postformat(A)}var Nf=Math.abs;function Lo(s){return(s>0)-(s<0)||+s}function tc(){if(!this.isValid())return this.localeData().invalidDate();var s=Nf(this._milliseconds)/1e3,u=Nf(this._days),m=Nf(this._months),p,x,A,L,oe=this.asSeconds(),ve,Ye,Xt,Nn;return oe?(p=Kt(s/60),x=Kt(p/60),s%=60,p%=60,A=Kt(m/12),m%=12,L=s?s.toFixed(3).replace(/\.?0+$/,""):"",ve=oe<0?"-":"",Ye=Lo(this._months)!==Lo(oe)?"-":"",Xt=Lo(this._days)!==Lo(oe)?"-":"",Nn=Lo(this._milliseconds)!==Lo(oe)?"-":"",ve+"P"+(A?Ye+A+"Y":"")+(m?Ye+m+"M":"")+(u?Xt+u+"D":"")+(x||p||s?"T":"")+(x?Nn+x+"H":"")+(p?Nn+p+"M":"")+(s?Nn+L+"S":"")):"P0D"}var Ce=Kl.prototype;Ce.isValid=gD,Ce.abs=Xj,Ce.add=Qj,Ce.subtract=qj,Ce.as=Jj,Ce.asMilliseconds=tE,Ce.asSeconds=rE,Ce.asMinutes=nE,Ce.asHours=iE,Ce.asDays=oE,Ce.asWeeks=sE,Ce.asMonths=aE,Ce.asQuarters=lE,Ce.asYears=cE,Ce.valueOf=eE,Ce._bubble=Zj,Ce.clone=uE,Ce.get=dE,Ce.milliseconds=fE,Ce.seconds=hE,Ce.minutes=mE,Ce.hours=pE,Ce.days=gE,Ce.weeks=wE,Ce.months=vE,Ce.years=yE,Ce.humanize=kE,Ce.toISOString=tc,Ce.toString=tc,Ce.toJSON=tc,Ce.locale=zv,Ce.localeData=Hv,Ce.toIsoString=Y("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",tc),Ce.lang=Yv,K("X",0,0,"unix"),K("x",0,0,"valueOf"),X("x",Dn),X("X",ta),me("X",function(s,u,m){m._d=new Date(parseFloat(s)*1e3)}),me("x",function(s,u,m){m._d=new Date(ge(s))});//! moment.js +return n.version="2.29.4",i($e),n.fn=F,n.min=fD,n.max=hD,n.now=mD,n.utc=C,n.unix=Fj,n.months=$j,n.isDate=v,n.locale=hi,n.invalid=S,n.duration=Fr,n.isMoment=O,n.weekdays=Wj,n.parseZone=Uj,n.localeData=Pn,n.isDuration=Xl,n.monthsShort=Bj,n.weekdaysMin=Kj,n.defineLocale=kf,n.updateLocale=UC,n.locales=$C,n.weekdaysShort=Gj,n.normalizeUnits=jt,n.relativeTimeRounding=SE,n.relativeTimeThreshold=bE,n.calendarFormat=YD,n.prototype=F,n.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},n})}(pW)),Zu}(function(e,t){(function(r,n){n(typeof kk=="function"?gW():r.moment)})(Go,function(r){//! moment.js locale configuration +var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY/MM/DD",LL:"YYYY年M月D日",LLL:"YYYY年M月D日Ah点mm分",LLLL:"YYYY年M月D日ddddAh点mm分",l:"YYYY/M/D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(i,o){return i===12&&(i=0),o==="凌晨"||o==="早上"||o==="上午"?i:o==="下午"||o==="晚上"?i+12:i>=11?i:i+12},meridiem:function(i,o,a){var c=i*100+o;return c<600?"凌晨":c<900?"早上":c<1130?"上午":c<1230?"中午":c<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:function(i){return i.week()!==this.week()?"[下]dddLT":"[本]dddLT"},lastDay:"[昨天]LT",lastWeek:function(i){return this.week()!==i.week()?"[上]dddLT":"[本]dddLT"},sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(i,o){switch(o){case"d":case"D":case"DDD":return i+"日";case"M":return i+"月";case"w":case"W":return i+"周";default:return i}},relativeTime:{future:"%s后",past:"%s前",s:"几秒",ss:"%d 秒",m:"1 分钟",mm:"%d 分钟",h:"1 小时",hh:"%d 小时",d:"1 天",dd:"%d 天",w:"1 周",ww:"%d 周",M:"1 个月",MM:"%d 个月",y:"1 年",yy:"%d 年"},week:{dow:1,doy:4}});return n})})();const Ck="/zh-cn/assets/wechat-qrcode-8dca7947.png",Dk="/zh-cn/assets/logo-image-91f154f1.svg",jk="/zh-cn/assets/location-cf5a6f84.svg",Ek="/zh-cn/assets/clock-718648c0.svg",Ak="/zh-cn/assets/calendar-cd5a76f0.svg";B.locale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:vW,Paragraph:yW}=Pe,{CNTitleMedium:Tk,CNTitleSmall:wW}=vW,{CNBodySmall:Ao,CNMarkSmall:xW,CNBodyLarge:_W,CNMarkMedium:Rk}=yW,SW=f.div` background: #fafafa; -`,xW=f.div` +`,bW=f.div` display: flex; max-width: 1440px; margin-inline: auto; @@ -2349,7 +2361,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ @media screen and (max-width: 1024px) { flex-direction: column; } -`,_W=f.aside` +`,kW=f.aside` display: block; width: 250px; margin-right: 0.48rem; @@ -2359,12 +2371,12 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-right: 0; margin-bottom: 0.32rem; } -`,SW=f.main` +`,CW=f.main` flex-grow: 1; @media screen and (max-width: 1024px) { order: 3; } -`,bW=f.aside` +`,DW=f.aside` width: 200px; margin-left: 0.48rem; @media screen and (max-width: 1024px) { @@ -2373,7 +2385,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ margin-left: 0; margin-bottom: 0.32rem; } -`,kW=f.section` +`,jW=f.section` position: sticky; top: calc(0.84rem + 0.48rem); left: 0; @@ -2391,11 +2403,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,CW=f(Ok)` +`,EW=f(Ok)` position: sticky; top: calc(84px + 48px); left: 0; -`,Gw=f(gW)` +`,Gw=f(wW)` padding-bottom: 0.11rem; color: #7680dd; `,cn=f.div` @@ -2409,7 +2421,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,un=f.span` font-weight: 600; -`,DW=f(Ao)` +`,AW=f(Ao)` font-weight: 600; padding-bottom: 0.11rem; position: relative; @@ -2429,23 +2441,23 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-bottom: 0.12rem; `;f(Rk)` padding-bottom: 0.11rem; -`;const jW=f(Ao)` +`;const TW=f(Ao)` font-weight: 400; -`,EW=f.span` +`,RW=f.span` color: #7680dd; -`,AW=f.img` +`,OW=f.img` display: block; width: 0.8rem; margin-inline: auto; padding-top: 0.12rem; -`,TW=f(Tk)` +`,PW=f(Tk)` padding-bottom: 0.14rem; -`,RW=f(Tk)` +`,MW=f(Tk)` margin-bottom: 0.11rem; -`,OW=f.section` +`,LW=f.section` min-height: 200px; color: rgba(20, 20, 20, 0.7); -`,PW=f.div` +`,IW=f.div` display: flex; min-height: 200px; margin-bottom: 0.16rem; @@ -2457,19 +2469,19 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,MW=f.img` +`,NW=f.img` height: min-content; width: 0.625rem; margin-right: 0.22rem; -`,LW=f.div` +`,zW=f.div` flex-grow: 1; position: relative; -`,IW=f(vW)` +`,YW=f(xW)` color: #7767a0; -`,NW=f(yW)` +`,HW=f(_W)` margin-bottom: 0.07rem; color: #141414; -`,zW=f.div` +`,VW=f.div` display: flex; margin-bottom: 0.13rem; @media screen and (max-width: 1024px) { @@ -2497,13 +2509,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ background-image: url(${e=>e.icon}); background-size: cover; } -`,YW=f.div` +`,FW=f.div` padding-bottom: 0.24rem; -`,HW=f.ol` +`,UW=f.ol` padding-left: 0.24rem; -`,FW=f(Ao)``,VW=f(Ao)` +`,$W=f(Ao)``,BW=f(Ao)` color: #7680dd; -`,UW=f.div` +`,WW=f.div` width: 96%; display: flex; align-items: center; @@ -2522,9 +2534,9 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ &:checked { accent-color: ${e=>e.theme.secondary01}; } -`,$W=new Map([["fullTime","全职"],["internship","实习"]]),Zw=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],BW=()=>{const e=ht(),[t,r]=I.useState(Zw),[n,i]=I.useState({fullTime:!0,internship:!0});return I.useEffect(()=>{r(Zw.filter(o=>n[o.workType]===!0))},[n]),I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(wW,{children:l.jsxs(xW,{children:[l.jsx(_W,{children:l.jsxs(kW,{children:[l.jsx(TW,{children:"筛选"}),l.jsx(RW,{children:"工作类型"}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(SW,{children:l.jsx(OW,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:_}=o;return l.jsxs(PW,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(MW,{src:Dk}),l.jsxs(LW,{children:[l.jsx(IW,{children:d.join(", ")}),l.jsx(UW,{children:l.jsx(NW,{children:c})}),l.jsxs(zW,{children:[l.jsx(Qh,{icon:jk,children:h}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ek,children:$W.get(g)}),l.jsx(Xh,{children:"·"}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ak,children:B(v,"YYYY-MM-DD").fromNow()})]}),_.map(({title:b,body:k})=>l.jsxs(YW,{children:[l.jsx(VW,{as:"p",children:b}),l.jsx(HW,{children:k.map(D=>l.jsx(FW,{as:"li",children:D},D))})]},b))]})]},a)})})}),l.jsxs(bW,{children:[l.jsxs(Ok,{children:[l.jsx(Xw,{children:"面试流程"}),l.jsx(Gw,{children:"实习岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"}),"- 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Gw,{children:"校招 / 社招岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"})," - 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"技术 open talk 评审"})}),l.jsx(Xw,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(cn,{children:[l.jsx(un,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(CW,{children:[l.jsx(DW,{children:"投递简历"}),l.jsx(Kw,{children:"- 投递至邮箱:"}),l.jsx(jW,{style:{paddingTop:"0.04rem"},children:l.jsx(EW,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(Kw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(AW,{src:Ck})]})]})]})})};B.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:WW,Paragraph:GW}=Pe,{CNTitleSmall:KW,CNHead5S:XW,CNTitleLarge:QW}=WW,{CNBodySmall:Xs,CNMarkSmall:qW,CNBodyLarge:ZW,CNMarkMedium:Pk,CNBodyMedium:Mk}=GW,JW=f.div` +`,GW=new Map([["fullTime","全职"],["internship","实习"]]),Zw=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],KW=()=>{const e=ht(),[t,r]=I.useState(Zw),[n,i]=I.useState({fullTime:!0,internship:!0});return I.useEffect(()=>{r(Zw.filter(o=>n[o.workType]===!0))},[n]),I.useEffect(()=>{window.scrollTo(0,0)},[]),l.jsx(SW,{children:l.jsxs(bW,{children:[l.jsx(kW,{children:l.jsxs(jW,{children:[l.jsx(PW,{children:"筛选"}),l.jsx(MW,{children:"工作类型"}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"full-time",checked:n.fullTime,onChange:()=>{const o={...n};o.fullTime=!o.fullTime,i(o)}}),l.jsx("label",{htmlFor:"full-time",children:"全职"})]}),l.jsxs(Qw,{as:"div",children:[l.jsx(qw,{type:"checkbox",id:"internship",checked:n.internship,onChange:()=>{const o={...n};o.internship=!o.internship,i(o)}}),l.jsx("label",{htmlFor:"internship",children:"兼职"})]})]})}),l.jsx(CW,{children:l.jsx(LW,{children:t.map(o=>{const{id:a,label:c,tag:d,workNature:h,workType:g,releaseTime:v,content:_}=o;return l.jsxs(IW,{onClick:()=>{e(a.split(" ").join("-"))},children:[l.jsx(NW,{src:Dk}),l.jsxs(zW,{children:[l.jsx(YW,{children:d.join(", ")}),l.jsx(WW,{children:l.jsx(HW,{children:c})}),l.jsxs(VW,{children:[l.jsx(Qh,{icon:jk,children:h}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ek,children:GW.get(g)}),l.jsx(Xh,{children:"·"}),l.jsx(Xh,{children:"·"}),l.jsx(Qh,{icon:Ak,children:B(v,"YYYY-MM-DD").fromNow()})]}),_.map(({title:k,body:C})=>l.jsxs(FW,{children:[l.jsx(BW,{as:"p",children:k}),l.jsx(UW,{children:C.map(D=>l.jsx($W,{as:"li",children:D},D))})]},k))]})]},a)})})}),l.jsxs(DW,{children:[l.jsxs(Ok,{children:[l.jsx(Xw,{children:"面试流程"}),l.jsx(Gw,{children:"实习岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"}),"- 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Gw,{children:"校招 / 社招岗位:"}),l.jsxs(cn,{children:[l.jsx(un,{children:"项目笔试"})," - 两天"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"思路 review"})," - 交流指导"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"性能优化"})," - 不超过一周"]}),l.jsx(cn,{children:l.jsx(un,{children:"技术 open talk 评审"})}),l.jsx(Xw,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(cn,{children:[l.jsx(un,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(cn,{children:[l.jsx(un,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(EW,{children:[l.jsx(AW,{children:"投递简历"}),l.jsx(Kw,{children:"- 投递至邮箱:"}),l.jsx(TW,{style:{paddingTop:"0.04rem"},children:l.jsx(RW,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(Kw,{children:"- 添加达坦科技小助手微信:"}),l.jsx(OW,{src:Ck})]})]})]})})};B.updateLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_七月_八月_九月_十月_十一月_十二月".split("_"),monthsShort:"1月_2月_3月_4月_5月_6月_7月_8月_9月_10月_11月_12月".split("_"),weekdays:"星期日_星期一_星期二_星期三_星期四_星期五_星期六".split("_"),weekdaysShort:"周日_周一_周二_周三_周四_周五_周六".split("_"),weekdaysMin:"日_一_二_三_四_五_六".split("_"),longDateFormat:{LT:"HH:mm",LTS:"HH:mm:ss",L:"YYYY-MM-DD",LL:"YYYY年MM月DD日",LLL:"YYYY年MM月DD日Ah点mm分",LLLL:"YYYY年MM月DD日ddddAh点mm分",l:"YYYY-M-D",ll:"YYYY年M月D日",lll:"YYYY年M月D日 HH:mm",llll:"YYYY年M月D日dddd HH:mm"},meridiemParse:/凌晨|早上|上午|中午|下午|晚上/,meridiemHour:function(e,t){return e===12&&(e=0),t==="凌晨"||t==="早上"||t==="上午"?e:t==="下午"||t==="晚上"?e+12:e>=11?e:e+12},meridiem:function(e,t){const r=e*100+t;return r<600?"凌晨":r<900?"早上":r<1130?"上午":r<1230?"中午":r<1800?"下午":"晚上"},calendar:{sameDay:"[今天]LT",nextDay:"[明天]LT",nextWeek:"[下]ddddLT",lastDay:"[昨天]LT",lastWeek:"[上]ddddLT",sameElse:"L"},dayOfMonthOrdinalParse:/\d{1,2}(日|月|周)/,ordinal:function(e,t){switch(t){case"d":case"D":case"DDD":return e+"日";case"M":return e+"月";case"w":case"W":return e+"周";default:return e}},relativeTime:{future:"%s内",past:"%s前",s:"几秒",ss:"%d秒",m:"1分钟",mm:"%d分钟",h:"1小时",hh:"%d小时",d:"1天",dd:"%d天",M:"1个月",MM:"%d个月",y:"1年",yy:"%d年"},week:{dow:1,doy:4}});const{Heading:XW,Paragraph:QW}=Pe,{CNTitleSmall:qW,CNHead5S:ZW,CNTitleLarge:JW}=XW,{CNBodySmall:Xs,CNMarkSmall:eG,CNBodyLarge:tG,CNMarkMedium:Pk,CNBodyMedium:Mk}=QW,rG=f.div` background: #fafafa; -`,eG=f.div` +`,nG=f.div` display: flex; max-width: 1440px; margin-inline: auto; @@ -2533,12 +2545,12 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ @media screen and (max-width: 1024px) { flex-direction: column; } -`,tG=f.main` +`,iG=f.main` flex-grow: 1; @media screen and (max-width: 1024px) { order: 3; } -`,rG=f.aside` +`,oG=f.aside` width: 250px; margin-left: 0.48rem; @media screen and (max-width: 1024px) { @@ -2556,11 +2568,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,nG=f(Lk)` +`,sG=f(Lk)` position: sticky; top: calc(84px + 48px); left: 0; -`,Jw=f(KW)` +`,Jw=f(qW)` padding-bottom: 0.11rem; color: #7680dd; `,dn=f.div` @@ -2574,7 +2586,7 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ } `,fn=f.span` font-weight: 600; -`,iG=f(Xs)` +`,aG=f(Xs)` padding-bottom: 0.11rem; position: relative; padding-left: 0.24rem; @@ -2584,23 +2596,23 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ left: 0; content: '📨'; } -`,ex=f(Xs)` +`,e2=f(Xs)` font-weight: 600; padding-bottom: 0.24rem; -`,tx=f(Pk)` +`,t2=f(Pk)` font-weight: 600; `;f(Pk)` padding-bottom: 0.11rem; -`;const oG=f(Xs)` +`;const lG=f(Xs)` font-weight: 400; -`,sG=f.span` +`,cG=f.span` color: #7680dd; -`,aG=f.img` +`,uG=f.img` display: block; width: 0.8rem; padding-top: 0.12rem; margin-inline: auto; -`,lG=f.section` +`,dG=f.section` padding-bottom: 0.96rem; min-height: 200px; color: rgba(20, 20, 20, 0.7); @@ -2615,31 +2627,31 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ :last-child { margin-bottom: 0; } -`,cG=f(Ik)` +`,fG=f(Ik)` flex-direction: column; -`,uG=f.div` +`,hG=f.div` display: flex; justify-content: space-between; padding-bottom: 0.24rem; -`,dG=f.img` +`,mG=f.img` height: min-content; width: 0.625rem; margin-right: 0.22rem; `;f.img` display: block; width: 0.48rem; -`;const rx=f.div` +`;const r2=f.div` flex-grow: 1; position: relative; -`,fG=f(qW)` +`,pG=f(eG)` color: #7767a0; -`,hG=f(ZW)` +`,gG=f(tG)` margin-bottom: 0.07rem; color: #141414; -`,mG=f(QW)` +`,vG=f(JW)` padding-bottom: 0.08rem; color: ${e=>e.theme.gray007}; -`,pG=f.div` +`,yG=f.div` display: flex; margin-bottom: 0.13rem; @media screen and (max-width: 1024px) { @@ -2667,16 +2679,16 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ background-image: url(${e=>e.icon}); background-size: cover; } -`,nx=f.div` +`,n2=f.div` padding-bottom: 0.24rem; &:last-of-type { padding-bottom: 0; } -`,ix=f.ol` +`,i2=f.ol` padding-left: 0.24rem; -`,gG=f(Xs)``,vG=f(Mk)``,yG=f(Xs)` +`,wG=f(Xs)``,xG=f(Mk)``,_G=f(Xs)` color: #7680dd; -`,wG=f(Mk)``,xG=f.button` +`,SG=f(Mk)``,bG=f.button` padding-inline: 0.18rem; color: ${e=>e.theme.gray007}; font-size: 0.14rem; @@ -2686,18 +2698,18 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ border: 0.01rem solid #dae0e6; border-radius: 0.06rem; cursor: pointer; -`,ox=f.div` +`,o2=f.div` width: 96%; display: flex; align-items: center; justify-content: space-between; -`,_G=f.div``,SG=f(XW)``,bG=f.div` +`,kG=f.div``,CG=f(ZW)``,DG=f.div` padding-top: 0.5rem; display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(1, 1fr); grid-gap: 0.26rem; -`,kG=f.div` +`,jG=f.div` display: flex; justify-content: center; align-items: center; @@ -2705,24 +2717,24 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ height: 0.48rem; background: ${e=>e.theme.secondary02}; border-radius: 50%; -`,CG=f.img` +`,EG=f.img` width: 0.32rem; height: 0.32rem; -`,DG=new Map([["fullTime","全职"],["internship","实习"]]),sx=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],jG=()=>{const e=ht(),{key:t}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=sx.filter(({id:n})=>n!==t);return l.jsx(JW,{children:l.jsxs(eG,{children:[l.jsxs(tG,{children:[l.jsx(lG,{children:sx.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(Ik,{children:[l.jsx(dG,{src:Dk}),l.jsxs(rx,{children:[l.jsx(fG,{children:a.join(", ")}),l.jsx(ox,{children:l.jsx(hG,{children:o})}),l.jsxs(pG,{children:[l.jsx(Zh,{icon:jk,children:c}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ek,children:DG.get(d)}),l.jsx(qh,{children:"·"}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ak,children:B(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:_})=>l.jsxs(nx,{children:[l.jsx(yG,{as:"p",children:v}),l.jsx(ix,{children:_.map(b=>l.jsx(gG,{as:"li",children:b},b))})]},v))]})]},i):null})}),l.jsxs(_G,{children:[l.jsx(SG,{children:"相关岗位"}),l.jsx(bG,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(cG,{children:[l.jsxs(uG,{children:[l.jsx(kG,{children:l.jsx(CG,{src:Tb})}),l.jsx(xG,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(rx,{children:[l.jsx(ox,{children:l.jsx(mG,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(nx,{children:[l.jsx(wG,{as:"p",children:d}),l.jsx(ix,{children:h.map(v=>l.jsx(vG,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(rG,{children:[l.jsxs(Lk,{children:[l.jsx(tx,{children:"面试流程"}),l.jsx(Jw,{children:"实习岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"}),"- 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Jw,{children:"校招 / 社招岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"})," - 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"技术 open talk 评审"})}),l.jsx(tx,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(nG,{children:[l.jsx(iG,{children:"投递简历"}),l.jsx(ex,{children:"- 投递至邮箱:"}),l.jsx(oG,{style:{paddingTop:"0.04rem"},children:l.jsx(sG,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(ex,{children:"- 添加达坦科技小助手微信:"}),l.jsx(aG,{src:Ck})]})]})]})})},EG="/zh-cn/assets/cover-ab5b198b.png",AG="/zh-cn/assets/right-arrow-32ec3014.svg",TG="data:image/png;base64,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",RG="/zh-cn/assets/bg-bg-3abf4aa0.png",OG="data:image/png;base64,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",PG="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",MG="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAI0AAAAfCAYAAADa8E7tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAArbSURBVHgB5Vtdchu5EW5gKPshjpe5QDSzFJXap8gnEH0CKyewdAJJVclW3jR626o8WDpB6BNYPoHlE4j7tFXWD0c5wXjXW5VaiUC6MQMSwjRmhjS90ma/KokkBgQaQKN/PoACviDOz8cDIcUuCOgKLU56vdVj+A3i7GzcffpU7mqhB6Ahv/lF73/zTZLB7xTC/fCP9MMGvmz4lW7g55Oj9Fnulv09PR8I0LFf91/p+pBeLy/He1rIV+4zPVGH/X6SwpLwww/jOFqBgV8+uYHTtovapo2Lq+sxvsTO4/ynjyp59izJYUm4uBhvKYCuW6axn7+sJSfwwNDxPr5CRRgw9SqCC4gOuLp76ZlRMFSY3cp3IvkSX1JYEh49gi1fMQ1W1A7+H7ZoAlZWcJNI+W+/XDxSh/iSfrgYb8NdhSF0//BH2GrbRxsIlEF6SoMgpZxbacbjceyXJcnyLKO880mrxK9A2u5bGYJgLJKtWwodV54rfQ1LhGb6MLJpyKAlhODb0GUboefz9NEEnK+urioMzdf3MCc+fBhvTLQc+3/naPlhSbijNEKIVb+CAJHxX9Xdal1lBklaLYpd4j3XQ1gmpPgrV9zptF/QJsWT7DggQzd7CkvCzQ0vA45vbvcnVqrKZ8qXqORTpflnWjVpBSYf/ZIy9qlAgzNIDYd3nk3gcG0tGcISgcE1O0HzmGKtZcyWdwplkRKGqCSjaZ+oMFKo57BEhBZaK5XBnJAK2LVR0fKUZhrT3MJtLD1vRUBFGDFlXcG3l9k3mCkdodk9ucWdjJ2Mkv7ygkYHMdTI0AaoFKuaKV9PEjNuVECS+xmOZaP8PIIlgxZaMxOKrjGDOUHBNLc2P+dfQGm4TIigtc78sqa6FDxGkdzEARg1xNeXl+Nr+DFX+37GUWYve5iab6IrRN+uc7Qgo59+VPtPu9UgV92qa8rAKA6YaDYOMHHT5eX1gUmRQcS2zZtf1CGTVcXMUKZ1UG4TJKvZZ5hM1Pt1xmrSuKUQL3C1y92us4nShmboRPKFX39yo47X15NRaKGx05GdHynt93WmlH7t92/lxFhswDVFc0myE/x1IErhyVPYxvnfnMk+7et7zCSP3HlzlEbEXGc4CZlf1lRXRuIlJ3y3a1zWVFgcxAHWS7226d/Gk6/kBj6rmloh3tMLxQGywwqRX1xl79B6DCyjYNtceSy3MFB8TgtF5U2KR0ElyrBdEUHKP4GTOdHCdh7LN9XkQMSRFAOUZcSNBa3cWyDXp+UG8KZ7gDJTFtp125TY5sXlfzbXen/eccaxDTVwx4EKs2Pfl9TIAQDnIou+5GPYxU2YovcwIYd0K3CdSdylFQFABGKawge3iTVQiFe+wtwRF3jfbINDnPA48L1N/D8AHl3ZkW9oZ9GHpgA01Adq1dRFkcLgwr4Lygvhsdg4Q0T6K/Z7ka8w7kO9jeRpSm+D4+CR2TdmDQrKotv0JXSfqc3ApntVg1wVUPXuCuSbb9NLX3HYTpAEzIq22EnK7Bsy4yjEYilguWCUCmu+RtMExE+eGPlOm5Qi1Id2MhFSGIC5Fm0KG2fgJttYZCyW9wqOg8HUii6wBgItEm64YcdpLaFZYtCFNpo442jIVAaFJaB/PoDFkZf9xbAoZKE0NYpX24dNXwPEX1vkNq7QLeY3gNjIEx5HFaUVjSQeizCPMS69RtOYmfimii5tuKl74jiaeWD5nNuAKcY4h6j42onGHXyoMZ1FWU4gBFWkv6FUmVJiEOpvoNQOxxWVMIsUVLyGPmbpOK/8bWRAq57RK8VNEIBScNw4H1DQApFQiVJqh3uO87pPz+mvI9S2KWPWCZVv2O/Fcf/reKBraAVjaYijUdP8YFEUfI6Y4IJUM3ecAGUsjQC5xX2beJx+fzWl92itMKOQA5YlnfEnbKpMHIqNnS6uxgMseVlpo7QUpBSccbV9mFiDyYUpHS8XO/afWR7HyoBxQCxEVbkUiGI+iKPhLDPA2/W1VeM+aD4m/LwZOUtaIMcNCSyUGiW9WTxJjD3rDTB5QXlTpTFwv8E5WqkqDhKnI6M0IY5mHlg+pykOwMXe5J53Ompo39MknF9mH3GHVZRmfcaTxEwz+R1iD0+kuaxEzGSp5WgCsUZ9kCzg1JWBxs0qZknchTgarHAKDfCPGUJHHp8+zchJAsl3eXWdM5vSKHhE8pA6mMHrUz/Fl8U/EfCp+rUE9dz9w8JDtmbJ0dTFAaEzFjTVo8RjcTF95zIKs2Ctz2qajxniRfvAhWbdCnE40AKWuFPQTPu3PWYIKE3OncYrrVpeU8GUGw9Tz6+uz2zWWQbCegN4ouDku7R/6hZ8m54PgLFKUz6HForZnrRQIW4FffedowpKY+sWrI6jcT9S6s9ZElLQGo6mVR+hXe2fVcmAck2VIsDRaD1rJ2TVKscMFJd6A7axk49+L0kvLq+7WGEXWoBoAwyCyV2m5eqLmKvIcTRNdRc5DxKeReDutxSd1PMn/iTWpf5Nu3fR8yDtK5OoMsGmnnbiJgauSwmetHvHDNzc+xvSxVpvdY+CYxzUMbLm72sSh6L9IsUvLE2Io8HHmV8Sqvtf+FQXa2T0b2UF8gmfG3bPkWjCEb5FU7gZ4g/sgoXiJncSm1L/JsVb9DwIY4JdDEgpXsgjEeEk80cuVilCcZPrUpqyPKcewzqLVbLc7jGAPXIomiC9xteJGvbW4qEJkie4aZk7RhZGaQRzzYHwXVq1DqG6DkcTpOVrAjBajD0kD/bq+Aa7YG0mkVJ/1uE67kV/Rh+CMgwBL5kasZxOeHA0tRyN71KasjxCMCNCeZCAHF9cXYOxKmA27rZfD2UeIMOc4VsM3CWbIEw3XPk5aMYZMHWLzOm2gfo3HWv1GhZFS/7ESDQJEGYl2/v5HI25MlFrzkNo4mh8l0JZHlfPPbm+bUEy5rnJLvOA3DG6n3d0YYuODICXe2jkCd+jKXgVF013bpoWihBJOBJzXl+YNtOpjwPcSWy6kdekFE19GG5E85lkE6xSBOMmzCa9opipdseFdZrndFZfiFOYE7RmUVRcPZXE0fCV5NgvC9V1ORr2uZM+kosi8osCL76tcEDm8ifM41ZxgM1ampSiTR90Z4hYbG4TFGPgF8cqBRKaMfcc59F1O63ohaS4LZlBAK7LkzDZmWfj0iW0krA0cnVCHA1ORuV+apjPgVqT7181LDOpgfHD6NJUaaFWIhhhEBZrKd5U2nB23+fEAZaj0QoS/zlN5DyxBqHfMyx2ej4eD6wSyAhy9PunNxN5JBnOlJ6Z9sL3j11Lw865PZa5U4YLi+4lxXG88OV3XV65+MkFHVpKsYdHQCyfZTaw0hgg3727w8aKvwbMBegJ5Daqn/22yGROTOqojpGV3IMHCPp9l3tnuPi9V7SLq7/F1aeANFnirwM4kIUCZx7r+qO6bjxaurrcWhYf96Y0mEWdlSliXv7FdfV/jYleBGRhhDbXIwgZNNwKoEPBXrK6A79hdOCe4HAKtZNs6uJhZtJ/mL9o9PicuK4uxTl4FLNQ8PyQ8HmnlAui7jqAD/TFr+3p90OE0nLQph4pDBKHOw/RWs6Le1GaNjfNzCRr2F9fW92GB4xQFuaCAkoKUtce4E9sF8G9uKe6m2bm5hiIYSTVUe/rL/Kzl6WCy8IIpPQKMC0WOu0ny/th3UPAvQXCTMROCpKFIvaHDPpN1K0Tl3WKcWTwf4r/AYvOogspeHhsAAAAAElFTkSuQmCC",LG="/zh-cn/assets/hl-ill-ab994ba5.png",Yo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",IG="data:image/png;base64,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",NG="/zh-cn/assets/spy-bg1-ba75fb2e.png",zG="/zh-cn/assets/spy-bg2-d3211011.png",YG="/zh-cn/assets/spy-bg3-a41ded57.png",HG="/zh-cn/assets/spy-bg4-5446dcc4.png",FG="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",VG="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:UG,Paragraph:$G}=Pe,{CNHead1:BG,CNHead5:Nk,CNTitleLarge:zk}=UG,{CNBodyLarge:zl,CNBodyMedium:WG}=$G,GG=f.div` +`,AG=new Map([["fullTime","全职"],["internship","实习"]]),s2=[{id:"Rust Distributed Storage Development".split(" ").join("-").toLowerCase(),label:"Rust分布式存储开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:","分布式数据一致性协议;","高速网络传输接口、驱动;","分布式缓存、数据管理服务;","对象存储接口;","文件存储接口;","块存储接口。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker和K8S等容器相关工具;","熟悉Linux操作系统;","具有很强的学习能力,自我驱动以及团队合作意识。"]}]},{id:"Rust High Performance Web Systems Development".split(" ").join("-").toLowerCase(),label:"Rust高性能网络系统开发",tag:["实习"],workNature:"远程实习",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与研发高性能网络系统开发,涉及的工作包括但不限于:","网络硬件Linux驱动开发;","网络流量控制算法设计与实现;","网络仿真系统开发与测试。"]},{title:"【岗位要求】",body:["熟悉Rust和C语言;","熟悉多线程、高并发编程;","熟悉Docker、KVM等容器和虚拟化相关工具;","熟悉Linux操作系统网络管理相关功能;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["熟悉Rust异步编程、有tokio或async-std使用经验优先;","熟悉Linux内核IO相关功能,有eBPF、XDP相关开发经验优先;","有Linux内核网络模块相关开发经验优先;","有无损以太网流量控制相关的开发经验优先;","熟悉常见流量控制算法优先,诸如BBR、CUBIC、QCN等;","有DPDK或RDMA等高性能网络编程经验优先;","有P4、OpenFlow、NS3、SONiC等相关编程经验优先;","有K8S的CNI接口编程经验优先;","能长期实习优先。"]}]},{id:"AI platform development".split(" ").join("-").toLowerCase(),label:"AI平台研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。","负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。"]},{title:"【岗位要求】",body:["具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。","熟练使用Python语言,熟悉使用常用模块,完成过基于Python的中大型项目。","熟练使用MySQL、Redis、Nginx、Flask、MongoDB等。","熟悉Linux操作,了解Shell脚本,有Linux下的多线程编程经验,有性能调优经验。","有开源项目贡献经验者优先。","熟悉机器学习,能够使用PyTorch、TensorFlow等框架者优先。","熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。"]}]},{id:"FPGA Development".split(" ").join("-").toLowerCase(),label:"FPGA开发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["负责基于FPGA实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","实现常用外设接口IP的RTL设计、集成和验证;","3.参与SoC集成设计与验证;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉基于FPGA的设计流程,熟悉Xilinx的FPGA芯片架构,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog或VHDL语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识;"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉PCIe、DMA、NVMe、DDR3/4、SerDes等相关接口开发优先;","有DSP领域相关经验、熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉AXI、ACE、CHI等AMBA总线协议;","熟悉基于Python的仿真测试工具Cocotb优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先。","能长期实习(6个月以上)优先。"]}]},{id:"Joint research and development of hardware and software".split(" ").join("-").toLowerCase(),label:"软硬件联合研发",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责网络IO加速的RTL实现;","负责加密、压缩、编码等算法加速的设计与RTL实现;","负责SoC芯片的Linux驱动开发;","负责实现软硬件联合调试与自动化测试。"]},{title:"【岗位要求】",body:["熟悉IC设计流程,熟悉常用的仿真、综合等EDA工具;","熟悉Xilinx的FPGA设计流程,熟练掌握Xilinx的FPGA开发工具;","熟悉Bluespec、SpinalHDL、Chisel或Clash等新一代HDL语言;","熟练掌握Verilog、SystemVerilog和SystemC语言;","熟悉Linux开发内核模块、驱动;","熟悉基于QEMU的软硬件联合调试工具链;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有DSP领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","有Linux内核网络、文件、存储相关开发经验优先;","熟悉Rust for Linux开发内核模块、驱动开发经验优先;","能长期实习(6个月以上)优先。"]}]},{id:"Digital IC front-end design".split(" ").join("-").toLowerCase(),label:"数字IC前端设计",tag:["实习"],workNature:"远程办公",workType:"internship",releaseTime:"2024-2-19",content:[{title:"【岗位职责】",body:["参与高性能存储SoC芯片的软硬件开发:","负责实现网络IO加速,以及加密、压缩、编码等算法加速的设计与RTL实现;","负责实现SoC的集成、综合与原型验证;","负责实现常用外设接口IP的RTL设计、集成;","撰写相关设计文档。"]},{title:"【岗位要求】",body:["熟悉数字IC的开发工具链;","熟悉Bluespec、SpinalHDL或Chisel等新一代HDL语言;","熟练掌握Verilog、SystemVerilog、SystemC语言;","熟悉SystemVerilog Assertion的使用;","熟练掌握TCL脚本语言;","具有很强的学习能力,自我驱动以及团队合作意识。"]},{title:"【加分项】",body:["有网络或存储硬件系统开发经验优先;","熟悉TCP/IP或InfiniBand/RDMA网络协议栈优先;","熟悉CXL、PCIe、AXI、ACE、CHI、NVMe等协议接口开发优先;","有加密和编码领域相关经验,熟悉LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;","熟悉基于Python的仿真测试工具Cocotb优先;","有形式化验证相关经验优先;","能长期实习优先。"]}]}],TG=()=>{const e=ht(),{key:t}=Sn();I.useEffect(()=>{window.scrollTo(0,0)},[t]);const r=s2.filter(({id:n})=>n!==t);return l.jsx(rG,{children:l.jsxs(nG,{children:[l.jsxs(iG,{children:[l.jsx(dG,{children:s2.map(n=>{const{id:i,label:o,tag:a,workNature:c,workType:d,releaseTime:h,content:g}=n;return t===i?l.jsxs(Ik,{children:[l.jsx(mG,{src:Dk}),l.jsxs(r2,{children:[l.jsx(pG,{children:a.join(", ")}),l.jsx(o2,{children:l.jsx(gG,{children:o})}),l.jsxs(yG,{children:[l.jsx(Zh,{icon:jk,children:c}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ek,children:AG.get(d)}),l.jsx(qh,{children:"·"}),l.jsx(qh,{children:"·"}),l.jsx(Zh,{icon:Ak,children:B(h,"YYYY-MM-DD").fromNow()})]}),g.map(({title:v,body:_})=>l.jsxs(n2,{children:[l.jsx(_G,{as:"p",children:v}),l.jsx(i2,{children:_.map(k=>l.jsx(wG,{as:"li",children:k},k))})]},v))]})]},i):null})}),l.jsxs(kG,{children:[l.jsx(CG,{children:"相关岗位"}),l.jsx(DG,{children:r.map((n,i)=>{const{id:o,label:a,content:c}=n;return i<2?l.jsxs(fG,{children:[l.jsxs(hG,{children:[l.jsx(jG,{children:l.jsx(EG,{src:Tb})}),l.jsx(bG,{onClick:()=>e(`/job-description/${o}`),children:"岗位详情"})]}),l.jsxs(r2,{children:[l.jsx(o2,{children:l.jsx(vG,{children:a})}),c.map(({title:d,body:h},g)=>{if(g===0)return l.jsxs(n2,{children:[l.jsx(SG,{as:"p",children:d}),l.jsx(i2,{children:h.map(v=>l.jsx(xG,{as:"li",children:v},v))})]},d)})]})]},o):null})})]})]}),l.jsxs(oG,{children:[l.jsxs(Lk,{children:[l.jsx(t2,{children:"面试流程"}),l.jsx(Jw,{children:"实习岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"}),"- 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"交叉面试"})}),l.jsx("div",{style:{paddingBlock:"0.06rem"}}),l.jsx(Jw,{children:"校招 / 社招岗位:"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"项目笔试"})," - 两天"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"思路 review"})," - 交流指导"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"性能优化"})," - 不超过一周"]}),l.jsx(dn,{children:l.jsx(fn,{children:"技术 open talk 评审"})}),l.jsx(t2,{style:{marginTop:"0.2rem"},children:"薪资待遇"}),l.jsxs(dn,{children:[l.jsx(fn,{children:"实习生:"}),"入职初期为 300/天,如能力和产出优秀将予以薪资调增,最高 500/天。"]}),l.jsxs(dn,{children:[l.jsx(fn,{children:"正式员工:"}),"对标国内一线大厂的薪资+期权,待面试通过后根据能力情况而定。"]})]}),l.jsxs(sG,{children:[l.jsx(aG,{children:"投递简历"}),l.jsx(e2,{children:"- 投递至邮箱:"}),l.jsx(lG,{style:{paddingTop:"0.04rem"},children:l.jsx(cG,{children:"info@datenlord.com"})}),l.jsx("div",{style:{height:"0.24rem"}}),l.jsx(e2,{children:"- 添加达坦科技小助手微信:"}),l.jsx(uG,{src:Ck})]})]})]})})},RG="/zh-cn/assets/cover-ab5b198b.png",OG="/zh-cn/assets/right-arrow-32ec3014.svg",PG="data:image/png;base64,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",MG="/zh-cn/assets/bg-bg-3abf4aa0.png",LG="data:image/png;base64,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",IG="/zh-cn/assets/cont-del-ill-f7f1f3a0.png",NG="data:image/png;base64,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",zG="/zh-cn/assets/hl-ill-ab994ba5.png",Yo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC4AAAAuCAYAAABXuSs3AAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAVDSURBVHgB7Vm9bxxFFH9v9j7sKLEJJAVgSGRRQBpTUpqGliY9CEUCKUqUihICXSSkGEcUNBGU/AOpKUBJgcCRUChxYSJAoAQbiH13Oy/va/bD8Z1zt1e4uOcbz97u7OzvvfnN7z2vAWY2s5kdScNRF4lolbu3uS3uG0sj5iHYP2/Uzz9EsNFq4VcwBRsKnEF//Odfvav3f+/BYEDQyPz206fa8PLS3AYivImID6GBHQicQZ/d+Xfw650ftmES48gCg9N+//nlM/Nw5qXuJ91udhUaWBhyflUiPYklsDGSHhP3chxz0uOt+7uQD2gFGlpr2IX+GPR4IrICmheTFLld1yH8i0HDoE/PQENrwRRMaREFl0dZWxnxdE6BZwC7uzlCQ2sMPEW7BjoaVfhjFKkAD0zO3i413O0NgRegqWwxGljp85xKrnv0kbfVo/+PRMSpBlo4LIDz3KMeU9RJV0KW4eGD/gI0tGGqIjpJowHXj2OeAJPq/qAfoS+tF6EnbY+8z+HBH/1Xr125d+vapbtLMG3gdEhWTYCLaBMWkVbg3Pq91Az83h633Qj/MVXYzoWs8931Sz+fhwksQBMrNqJH3AEr6L61nkYeFLw4YVGPxQTM9o8mifzEwE2bybntNIkW7aoDrNlKG+vNGemTIeBCBtl7MKZNBLyqJpGokL6S41CCTg6kPaAUKvKRtgA0Nl0aRJxK+YslaAXOoc8H9XNJbWIu500OsdxHi+tj0mVs4NUNWUs4OTgo7ys1il7zpJS7RLLjBh6FLYH+hkdjVXSNNmc14lXNrmp4mf5Nx1MGTVPYT9w+BvNjafuEHKcaoAQyd64nkLGS+otCS+5H5A8WPOe4L3QJv1+/ePez9QtPR5kJI45FtG2D2iYtahQF61GmfamMtG4scgQGZTp7oY6cxw7dWn//x3OHIZiQ4yUS56uBLniP9T3gsmlIK45E95qgqo8L7Mw36xfuLE0VeOkAVWQR66UsVHiBVIu4hjoYTSTa6VJALDzjoxNZq3MFpgW8Gm1dcKhw3U6WtUK1YEAstc8P0x6t0sYfIlMLsLdgWsANgz0HFTqaC7h/RtRxijf1FU9CZrf5jOI6FstnU8oGXhhFl2a1Cj8hhBKkHAe0PxZq3/2cfuc+y3R8IppuzFhO6eAJOnlnqEQ2qMexeBIWwBwcRzQrd6ORwfmf8XUGrozz9aLgPohG6qxRb8be8d4WTBt4AoveJIqxZZptXLdViGjKY2wgaPG4VlulxUlhkPW4KlcYbl++8cb2VICndyVGjTLSWWZpXkApYH5vJdckg3I4C70XmDKm01EukRbxpuyke0YiIBOxhRg/HYVlLODpRU9yQmkRZfn5WjGTkVQd8rqFYqnp7RZCtxuSwgjBn/iLhR24/sGXK/dgWsCrb6dMMUQh6o8VPQ7BK8GM/IUQ+msKNOBzwdSTyCXFjKm9zbFYu/jFys3DsDTiuFBGc4lokzyeZ8uFQr5JrQRAz6zWd9oBjh0PO7wwO3z/CR7OPKbfmDm3ea6bl2+8vvU0z58IeMH1YMsckvi6LEYutyl4dRhTZvWItxFOv9D55cO111ahgY0NvEw2VnMINQSkltWJPgi1IoxcZQR8mzfm3FzzF2jDEtDmycXDJzegpi4YoEguWcu432oFbmitbe3Us23ozuMGNLRwMCD89sXnu18vn53Thw4D7WM9I2ItCakDmTvi7TkG/crysc12l9agoY18d8JL+y537xxwT5mYOeAxUuUWFmX5qv+FkMwTKMoO1THhJ+z3Pp8/Ob8JM5vZzGZ2pOwx917POGoSrr0AAAAASUVORK5CYII=",YG="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAM4AAAAfCAYAAACvffJOAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAA4PSURBVHgB7VxvUhTJEs+qnkHjrcrsBR49Ar7YT+IJdjyBeALhBGCE61eab/v0RYgnEE+weALGEzB+MkIYu9kLOOruF2GqXmZ311DdndV/BmRRyVic6eqqrL+Z+cvMmhVwSZd0Qent29CfuSo3tNY+aBEdfVGbv/zSjeACUKvs5Xqw1/HgXz0JXg9AzCal+qPQOvoijne2gl8i+IHo3UG4ki8TGqLFxW4fzpn298MeSFiSUt42ZUqpQ1DQ/yfGc9ZEQtO+Ive0hg6ucvxf+4rn46u7cAFIcIUkMC1xY01qWMfHjquxBt0/gqPVH0GA9sOwJ7TczZcLAdvz3blVOCci4fWkWNMglkqqRShEm7cWutuuCmEY+vmybvfra/O6/e4fHO4ICffy5Z8/qp/v3OmO4B8mmS/4LXi3NAM3QhSaAEqEhkiA6LVhZu/xZvgAvnMSY34tYi1/DrS3F3YO3ke7aGFeVAgNkU/1DoZ/vuBekhIYaxnm/ziLepbUpF8pYY7jcRGEhigjOOvBW1+AR1q1U5cBmqyO1mqL2sJ3TGhZfK4coUQE50DXZsnaiV6TNogjV/aH4Xqh2KEExFeeS5N+lYKCQiLrDheEMoIzAzONhMYQCU8b2uvwHZMGXnDEOQgOaWRc4yorw5IQcoOslV2mBc+r1fq6c2nSb8tTAc55Uo5uwWsJ6iFcEJoEBx4HB8vAHg4x0qBeCtAjgggIz+7xrATBte9WeLSWvmA8Qt2Crw4dEHZtcOV0mHBgfVJcKCD3HMLduX4devi5YwqEQzl+bR+nSb9YNqAPgnd4SKPz8L+a0ERwcNF7bKQAnf+nwX8mi/4o2McoG+MkW4syDA8L2Fodq0OM9gTmOXZyPflrvt6nkXpIOHZIEMOKGNnvr12DJYEOMqrTRINpPVBav+Kc4aZ8tNLPuagUYW4NRbqFG+yay3isXttjKhuLC7u/exfS2Px8OcGWha4/CUqg0x0oDF5oxjLpFGaafUF42WO6Gtn7xgU8aJ5SoOI06wU6GuN6qSMYUNg4X398pJ7futUdNO3XhKFNmUrGTmfoJbc3ZFFv3JBrWugerowf94WKXmiB+8m3yfcxGTPu2d+fYYf4KaGX0VB0DC87HG6Fo2lDi0dDwszAfv5fsNh/HAypjDW7uIGdsYaVwgshXmf4euKBYyFjc6wlbhDzHic0woOwnuPt44YuD4eHc/Pzc5v2Kyefjox0EgDJ8BFezCfI8wFem0f0jyfIzyvOGYWJPrbpH9ooLeSz/BITHClzeFFgfa4cN/ij/YwamZTNSxCyKDgaRiSA3BgtsudA45kIDo29dUX+UYSLwscIX09egQG2XWLG/gr7hab9tmZghWuDyuKV/ZwKzAadh2RZT1S/SELYS8KTKwfDw+3Pn7LKqXUVfK4PKbzOtVm9RgpIpPwMLwyP93At7pLwWIJDG1G0OQrULlqZVRKYSaEG3CCVmQTCuIg+j44wosNlh6TIHA6toMtAn5GZnOM9FIQm+y5AZ/jj4nx3y5ShpljiLEVBaEr4pMqgADPQOh2mvCIusK80/Gy+e21WSSAPtQlTEMK3BzjGyJ4rHtT+McOv7WG5hwKo6/FGWB6Z72k+hRCG767PK1ESWNHGdWvYrwvSET97XCTMuo7vJ2Dl+mw2ByQVLGkOYsVWxkm4Fh5Zx7v2EY9clQmaoZWJcJefU+LzSTC/5eLsXCitMpZLCFEIN9obxr2vQ6kzvE0C6DrwTflUKQPPg8GYm7PSk77JwnLWZr4k11LKO/Frnh28P9xAvjsESdDq9LF8wFVGmNUTEmoRRrQm1qxKaMror79g8NN1WG7crxS3uTNkBxF4C1hGukdQ00BnResH0xDyCcOlyZQQx+1UtPARBjzDyFv4W3Cwi/meFa4SSTLbnRV94pJgRGbhUlw/LXVos+gLHXiYnjrkA9EXF1wyyoAcVwHFIAH6T7Hwk3ZEM9YrtBfQhwqKnWIhyup1SKMiJNlFIQoRlryI+8t3JeqvBZ6FeF7oV5APULtdnkjpTNMvooTSIAKNa5ooo5TeSb5Ry+nP2BhOBCeFYrVgAyU+Md/zAq1QSAlT+12dsO2xo85k4dpuK4GWaAdh4n0UxE13nYT/afmgg9ez+TE0ERYtxMDFxgXTMLxaa709GK8KqBUq9kmI0EqE6KdlHN+WhC1PKIK/fEhXqfv0nv4Q2gVU5PJN4rHg2mGbVU5hJHWSvZyqX14oIvPFNS5UvM+1UHeRwXNgSfdMaF54ehb4uQ1obnheS0PfGQCCECxAa4Lak6IN2odqwjreLiY/75hrN3XCtnoMPme+sd2o9D1Bm+6/76ePOwfhn79ih718PcT/saZ34di6fHQK81zKAO39ibCo8Rs0Mb1cjbgdC9MwKlY3xEr10ErfxSw7QeR7ddqQn4bCAybIQcEDoAjWMCRTWKivPIgWrPFQGBjH7HO8JR5OM3b0s3yCtQV+KXpo2m8Kr4vzSf3J9JaBn39P63lrYW49fezvD6NlDu7/1InbDlw+NM7tvpkbnot73LkgI1CYydNgYVuCIKlFiUsc/jJKk5+TcKJLkm8lcfmkjnBapUHZ+4IjTYe1hFwHvsBHjw+hjA8qA7bcUgZK876FC6ZRaBUaEG3mws25ZdLycf6mBpHwFJKfjjWx9ycZoCOYAfDKFnjhmDcqi3Cafo8dEOyEn+xx7/PrKYTuc/XEcaIMHT72wJ6bHuuPHA/ad9Zt+z3oRk8257eeBDe7CCcwEqFflgkRQTe6GBp/1+w9qow5L7m+ktRz4E/UTk44lKmX3h9zHfi6fIwFdN2bymy64nlSaLXAFzdo2hvMC+jcLt70ezH80ephlRBdu5Ht37EmUaHE5QNo1YcalL/DV7ffqjuB0tPsXlAgIsuIDy7RoXf50ApEZsxl+x5DNfRV9iAXAkRL0v9vML/6e+L70B8gjFtBIXnBMbsKHWo/0sCGbd8UJsWYYzP52GoxGKudx9OO6Ivxp+ryQWh6mwtcWdrUZ15neFCiD53zIg8hH+TLKMkKNShOODK3BlQCJ2hsBN22KNiCyU9XaDazH1wi18CgzLgda2eHhONnypVAkfKWqHa/qFQd6YMoacNDrEIuTAufYRMf+hSGFvtQKsoV+QyLRJmmDyY7PfmjmwT5FgTjtNYsrCErVTca5rBKYOdwuPdH1iFwRqrgxKK4+rEpTkw64AGFgglz11IGkDqWRfJzdaKFihC0IZkEJ/z8n4EbhmJ4oZ3Qb1Q2nqQjMYKahIc2q2AZxUCUF7C6/U57J9CGpK7bFrhnsXUmH5rjgXOLzPeqfZfrQciaRur40eZww771/GhjuM7nV0RpNAzDsrdNiJRCidyATBQmmQBvZoVKNokWqT3jPWPr4MEkreKaONGxkmt1+NCBdIa02U1XpT4XkcJcGJySMPT8wlZS6a2ENb7DE2F2rQmiiNm8L+TuXD6w9xIcB93OuTTql1AEQ8aflEJ84N5fu5FYZuInW/IPrg6ese34U1QLZ9W+t7aC7uhx8B4fdGFi9JsczNsEcfIzmTif0YXkMLiiYdSOQqQIZUZauzBsdQ4HJ7yOPFbSXvmxpI6/M2nZkI8rocuY9RieIHRhNbAhDM/uQE0ieMLBEqCkdEvu0XpCYlF8rlJs3Sxfyr0mund9Vn4gqEm+U2zBSLOKokWn/EnVXhLZTnaTfimH47oTGLfQ6jV3rcjaU15541p8+pyuPflvXOTXspKu3J3Z9/iY0+1nKCcfnD83ENEReMmAVKXT7VxoEzUpy71YPJyLg/CqfxZ8DJxyJXRts25IyfL5NwlBxyQrE6Q0ft/1Mh89rLEmkwOvqwW8jFc0bb9Qciewxric/dBaGFfAFfm1AwxOq5Tueyw4HnhbdULPDJsRha7JatFTuw1sBr0OTSJhY/dBqCI7Bu868HX5mO+1cjgptaBccOomPA0t0hUaZzKvnHAdN/O+lD6q3JvI7rtm0rXYd87pr9tviV9xaI8L0UmVos+2z62Fw4ce2QGGqn2PBYcc+zh300B4NPo12OYOtTVllOyqwvAOB7oyh1MmkPE7NYk0xaTc1qSUj06SexM+dXI4hmj+ruAJOaaNrE1KC/OY1GsgPPEcMAe3uDgX5N9R5K9MGPIHnhRIxXqxe5nP4dTt15XDyfuTbU+tC6iXUuDWouqeZNKufN8nHgkJwBcUBMwLrOKjw8mlCVBk4vj+0+BmRmgMLc53A+4aC+Ub6FDGGJUbUIovS5KfD/OLL5Lw9yvc4DuoUbIm3JGHOE6uiRT4EIwiPovd6vwK1f975DgImr96YxzTaSgWHroeVJKzIYGldcc5dBfn57Zc9Sjrjx8vOYHIH3hSILQm+X5T4dzEsLjrGs2b0/RbeJ/LHZGCmr85dweYvTTjowvJHrMWVfcky8jed+GqRNG2q3BsHb5WxAmKi8jsGg3S5Bd8B2G0y4WZzf/dBPkuId9OK9mAKL3S8dX4NCGK6KCzSzkx3y6nzcWN7sIZkRk7fT/N+GmPwLLMZXtEB47uGJ7FejXptyY/39x/PK9fiwq4YLQ/jCLOlC7cnGs01uH7ww8MXh4hn5/hDAmTlFueJ2NnE7XwMnAQETVj3dzNJX0b1IILRq47RNCQHLmiCM6QKHSOmf01rd11RI3f3FzSt0c1f2J0PnQa/GlT3btIp6WqMCth4hTbX9J3RhdKcFy/06lyHvPkOtBc0vI0VBY6J0tjX7+/pO+LLhxUYyNHY/0KGhDdsNWyyEdC9S8uG/XDRACTcLTY9qTaOouAwyVdTLpwwYFvieiWrbE67eRiaXQpLD8G/R/mOJQNkHO42AAAAABJRU5ErkJggg==",HG="/zh-cn/assets/spy-bg1-ba75fb2e.png",VG="/zh-cn/assets/spy-bg2-d3211011.png",FG="/zh-cn/assets/spy-bg3-a41ded57.png",UG="/zh-cn/assets/spy-bg4-5446dcc4.png",$G="/zh-cn/assets/foot-reg-qr-03a7d7e1.png",BG="/zh-cn/assets/foot-ass-qr-e467649e.png",{Heading:WG,Paragraph:GG}=Pe,{CNHead1:KG,CNHead5:Nk,CNTitleLarge:zk}=WG,{CNBodyLarge:zl,CNBodyMedium:XG}=GG,QG=f.div` display: flex; flex-direction: column; align-items: center; margin-top: -0.72rem; padding-top: 0.72rem; - background-image: url(${EG}); + background-image: url(${RG}); background-size: cover; -`,KG=f(BG)` +`,qG=f(KG)` padding-top: 1.68rem; color: #fff; -`,XG=f(yn)` +`,ZG=f(yn)` margin-top: 0.46rem; color: #fff; -`,QG=f.div` +`,JG=f.div` display: flex; align-items: center; margin-top: 0.91rem; @@ -2732,13 +2744,13 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ border: 0.01rem solid #fff; border-radius: 0.12rem; cursor: pointer; -`,qG=f.div` +`,eK=f.div` padding-right: 0.12rem; font-size: 0.2rem; font-weight: 400; line-height: 1; color: #fff; -`,ZG=f.img` +`,tK=f.img` height: 0.2rem; width: 0.2rem; `,Yl=f.div` @@ -2757,11 +2769,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,wf=f.div` font-size: 0.4rem; font-weight: 600; -`,JG=f(Yl)``,eK=f(Hl)` +`,rK=f(Yl)``,nK=f(Hl)` padding-block: 0.7rem 1.17rem; -`,tK=f(yf)``,rK=f(wf)``,nK=f(zl)` +`,iK=f(yf)``,oK=f(wf)``,sK=f(zl)` padding-top: 0.61rem; -`,iK=f.div` +`,aK=f.div` display: flex; gap: 0.39rem; padding-top: 0.59rem; @@ -2779,46 +2791,46 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ color: #626262; font-size: 0.16rem; line-height: 0.2956rem; -`,oK=f(zl)` +`,lK=f(zl)` padding-top: 0.87rem; -`,sK=f.img` +`,cK=f.img` position: absolute; z-index: -100; top: 0; width: 100%; height: 100%; -`,aK=f(Yl)` +`,uK=f(Yl)` background: linear-gradient( 106deg, #e4f4ff -1.1%, #f9fcff 47.11%, #edf6fc 102.52% ); -`,lK=f(Hl)` +`,dK=f(Hl)` min-height: 6.4rem; padding-block: 0.7rem 1.49rem; -`,cK=f(yf)` +`,fK=f(yf)` height: 0.26rem; -`,uK=f(wf)``,dK=f.div` +`,hK=f(wf)``,mK=f.div` display: flex; margin-top: 0.8rem; background: #fff; border-radius: 0.16rem; -`,fK=f.div` +`,pK=f.div` padding: 0.49rem 0.38rem 0.82rem; -`,hK=f(Nk)` +`,gK=f(Nk)` color: #000; `,Nc=f(zl)` padding-top: 0.32rem; color: #565960; -`,mK=f.div` +`,vK=f.div` position: relative; display: flex; align-items: center; justify-content: space-between; gap: 0.21rem; padding-top: 0.48rem; -`,pK=f.div` +`,yK=f.div` position: absolute; bottom: 0.6rem; left: 0; @@ -2853,20 +2865,20 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-top: 0.23rem; color: #000; font-weight: 600; -`,gK=f.img` +`,wK=f.img` margin-top: -0.13rem; width: 4.2rem; border-radius: 0.16rem; -`,vK=f.div` +`,xK=f.div` margin-top: 0.8rem; padding-inline: 0.36rem; -`,yK=f(Nk)` +`,_K=f(Nk)` color: #000; -`,wK=f.div` +`,SK=f.div` margin-top: calc(1.12rem - 0.8rem); width: min-content; margin-inline: auto; -`,xK=f.div` +`,bK=f.div` display: flex; align-items: center; font-size: 0.2rem; @@ -2876,14 +2888,14 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-block: 0.14rem; border-radius: 0.08rem; margin-bottom: 0.38rem; -`,_K=f(Yk)` +`,kK=f(Yk)` margin-left: 0.8533rem; width: 2.24rem; text-align: center; -`,SK=f(Yk)` +`,CK=f(Yk)` margin-left: 0.96rem; padding-inline: 1.97rem; -`,bK=f.div` +`,DK=f.div` position: relative; `,am=f.div` display: flex; @@ -2928,45 +2940,45 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ padding-inline: 0.96rem; `,Yn=f.div` color: #222; -`,kK=f.div` +`,jK=f.div` padding-top: 0.11rem; `,zc=f.div` font-size: 0.16rem; color: #444; -`,CK=f.div` +`,EK=f.div` position: absolute; left: calc(2.24rem + 0.85rem); bottom: 2%; width: 0.01rem; height: 96%; background: #7680dd; -`,DK=f(Yl)` +`,AK=f(Yl)` background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,jK=f(Hl)` +`,TK=f(Hl)` padding-block: 0.7rem 1.45rem; -`,EK=f(yf)``,AK=f(wf)``,TK=f.div` +`,RK=f(yf)``,OK=f(wf)``,PK=f.div` display: flex; align-items: center; gap: 0.32rem; margin-top: 0.97rem; -`,RK=f.img` +`,MK=f.img` width: 5.2021rem; -`,OK=f.div``,Ho=f.div` +`,LK=f.div``,Ho=f.div` display: flex; align-items: center; padding-bottom: 0.22rem; &:last-child { padding-bottom: 0; } -`,Fo=f.img` +`,Vo=f.img` margin-right: 0.07rem; width: 0.44954rem; height: 0.44954rem; -`,Vo=f(zl)``,PK=f(Yl)` +`,Fo=f(zl)``,IK=f(Yl)` background: linear-gradient(180deg, #f9fffe 4.64%, #fff 168.71%); -`,MK=f(Hl)` +`,NK=f(Hl)` padding-block: 0.7rem 2.06rem; -`,LK=f(yf)``,IK=f(wf)``,NK=f.div` +`,zK=f(yf)``,YK=f(wf)``,HK=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-columns: repeat(2, 1fr); @@ -2975,11 +2987,11 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ `,Yc=f.img` width: 100%; cursor: pointer; -`,zK=f(Yl)` +`,VK=f(Yl)` background: #fafafa; -`,YK=f(Hl)` +`,FK=f(Hl)` padding-block: 0.44rem 0.56rem; -`,HK=f.div` +`,UK=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-template-rows: repeat(2, 1fr); @@ -2989,44 +3001,44 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ font-size: 0.2rem; line-height: 0.28rem; height: min-content; -`,fm=f(WG)` +`,fm=f(XG)` padding-top: 0.16rem; color: #666; font-size: 0.16rem; line-height: 0.22rem; -`,FK=f.div` +`,$K=f.div` display: grid; grid-template-columns: repeat(2, 1fr); grid-gap: 0.49rem; padding-top: 0.42rem; -`,ax=f.img` +`,a2=f.img` width: 2.17809rem; -`,VK=f(zk)` +`,BK=f(zk)` padding-top: 0.41rem; color: #333; cursor: pointer; -`,lx=()=>(I.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(Rt.Fragment,{children:[l.jsx(UK,{}),l.jsx($K,{}),l.jsx(BK,{}),l.jsx(KK,{}),l.jsx(XK,{}),l.jsx(QK,{})]})),UK=()=>{const e=ht();return l.jsxs(GG,{children:[l.jsx(KG,{children:"MIT体系结构公开课学习社区"}),l.jsx(XG,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(QG,{onClick:()=>e("rank"),children:[l.jsx(qG,{children:"点击查看荣誉榜单"}),l.jsx(ZG,{src:AG})]})]})},$K=()=>l.jsxs(JG,{children:[l.jsxs(eK,{children:[l.jsx(tK,{src:TG}),l.jsx(rK,{children:"项目背景"}),l.jsx(nK,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(iK,{children:[l.jsxs(Jh,{children:[l.jsx(em,{children:"01"}),l.jsx(tm,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"02"}),l.jsx(tm,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"03"}),l.jsx(tm,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(oK,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(sK,{src:RG})]}),BK=()=>l.jsx(aK,{children:l.jsxs(lK,{children:[l.jsx(cK,{src:OG}),l.jsx(uK,{children:"课程内容"}),l.jsx(WK,{}),l.jsx(GK,{})]})}),WK=()=>l.jsxs(dK,{children:[l.jsxs(fK,{children:[l.jsx(hK,{children:"详情说明"}),l.jsx(Nc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(Nc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(mK,{children:[l.jsx(pK,{}),l.jsxs(rm,{isActive:!0,children:[l.jsx(nm,{isActive:!0,children:"MIT6.004"}),l.jsx(im,{isActive:!0}),l.jsx(om,{isActive:!0}),l.jsx(sm,{children:"第一阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.375"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第二阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.175"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第三阶段"})]})]}),l.jsx(Nc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(Nc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(gK,{src:PG})]}),GK=()=>l.jsxs(vK,{children:[l.jsx(yK,{children:"培训内容"}),l.jsxs(wK,{children:[l.jsxs(xK,{children:[l.jsx(_K,{children:"序号"}),l.jsx(SK,{children:"实验内容"})]}),l.jsxs(bK,{children:[l.jsxs(am,{children:[l.jsx(lm,{children:"第一阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab0"}),l.jsx(ar,{children:"实验环境搭建"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab1"}),l.jsx(ar,{children:"多路复用器和加法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab2"}),l.jsx(ar,{children:"乘法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab3"}),l.jsx(ar,{children:"流水线"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab4"}),l.jsx(ar,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第二阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"专项1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项2"}),l.jsxs(ar,{children:[l.jsx(Yn,{children:"流式数据处理"}),l.jsxs(kK,{children:[l.jsx(zc,{children:"简单音频处理流水线"}),l.jsx(zc,{children:"音频处理扩展:FFT"}),l.jsx(zc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(zc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项3"}),l.jsx(ar,{children:l.jsx(Yn,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第三阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab5"}),l.jsx(ar,{children:l.jsx(Yn,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab6"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab7"}),l.jsx(ar,{children:l.jsx(Yn,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab8"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project2"}),l.jsx(ar,{children:l.jsx(Yn,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(CK,{})]})]})]}),KK=()=>l.jsx(DK,{children:l.jsxs(jK,{children:[l.jsx(EK,{src:MG}),l.jsx(AK,{children:"项目课程亮点"}),l.jsxs(TK,{children:[l.jsx(RK,{src:LG}),l.jsxs(OK,{children:[l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Ho,{children:[l.jsx(Fo,{src:Yo}),l.jsx(Vo,{children:"全开源、社区化"})]})]})]})]})}),XK=()=>l.jsx(PK,{id:"supply",children:l.jsxs(MK,{children:[l.jsx(LK,{src:IG}),l.jsx(IK,{children:"新手上路补给站"}),l.jsxs(NK,{children:[l.jsx(Yc,{src:NG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Yc,{src:zG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Yc,{src:YG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Yc,{src:HG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),QK=()=>l.jsx(zK,{children:l.jsxs(YK,{children:[l.jsxs(HK,{children:[l.jsxs(um,{style:{gridColumnStart:"span 2"},children:[l.jsx(dm,{children:"申明"}),l.jsx(fm,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"报名表"}),l.jsx(fm,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"咨询"}),l.jsx(fm,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs(FK,{children:[l.jsx(ax,{src:FG}),l.jsx(ax,{src:VG})]}),l.jsxs(VK,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),qK="/zh-cn/assets/title-6364f1d7.png",ZK="/zh-cn/assets/stage1-5eb61c6d.png",JK="/zh-cn/assets/stage2-586e5a56.png",eX="/zh-cn/assets/stage3-021de657.png",tX="/zh-cn/assets/github-6b99dc67.svg",rX=f.div` +`,l2=()=>(I.useEffect(()=>{window.scrollTo(0,0)}),l.jsxs(Rt.Fragment,{children:[l.jsx(WK,{}),l.jsx(GK,{}),l.jsx(KK,{}),l.jsx(qK,{}),l.jsx(ZK,{}),l.jsx(JK,{})]})),WK=()=>{const e=ht();return l.jsxs(QG,{children:[l.jsx(qG,{children:"MIT体系结构公开课学习社区"}),l.jsx(ZG,{onClick:()=>{const t=document.getElementById("supply");console.log(t),t&&t.scrollIntoView({behavior:"smooth"})},children:"立即报名"}),l.jsxs(JG,{onClick:()=>e("rank"),children:[l.jsx(eK,{children:"点击查看荣誉榜单"}),l.jsx(tK,{src:OG})]})]})},GK=()=>l.jsxs(rK,{children:[l.jsxs(nK,{children:[l.jsx(iK,{src:PG}),l.jsx(oK,{children:"项目背景"}),l.jsx(sK,{children:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距,例如:"}),l.jsxs(aK,{children:[l.jsxs(Jh,{children:[l.jsx(em,{children:"01"}),l.jsx(tm,{children:"教学内容局限在基础知识,而对于业界所需的诸多技术(例如异常处理、缓存技术、内存管理、多核一致性等)往往在教学中一笔带过。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"02"}),l.jsx(tm,{children:"实验、大作业、课程设计等实操环节过于简单,很少有系统级别的实验项目,学生在动手实践环节投入的精力有限,通常只需要编写HDL代码即可顺利完成相关考核,而对于前期开发环境搭建、后期验证调试、性能调优等基本不会涉及。"})]}),l.jsxs(Jh,{children:[l.jsx(em,{children:"03"}),l.jsx(tm,{children:"学科领域泾渭分明,软硬件结合部分训练缺失。软件相关专业课程对硬件相关知识经常快速略过,而硬件相关专业课程也较少涉及上层软件相关的知识。"})]})]}),l.jsx(lK,{children:"为了解决上述问题,我们很高兴看到已经有类似“一生一芯”这样的项目启动并取得了很好的成果,但“一生一芯”项目主要解决了上述的问题2和问题3,而对于工业界实际需要的技能,如多核处理器技术及多核下的数据一致性问题等,依旧存在覆盖上的缺失。"})]}),l.jsx(cK,{src:MG})]}),KK=()=>l.jsx(uK,{children:l.jsxs(dK,{children:[l.jsx(fK,{src:LG}),l.jsx(hK,{children:"课程内容"}),l.jsx(XK,{}),l.jsx(QK,{})]})}),XK=()=>l.jsxs(mK,{children:[l.jsxs(pK,{children:[l.jsx(gK,{children:"详情说明"}),l.jsx(Nc,{children:"为了进一步缩小学生能力与业界期望之间的差距,我们找到了MIT体系结构方面的3门公开课及其对应的课程实验,希望通过学习公开课并亲自动手完成实验的方式,进一步增加学生的动手实践能力以及解决实际问题的能力。对这些公开课的说明如下:"}),l.jsx(Nc,{children:"三门公开课难度级别分别对应本科必修课(6.004)、硕士必修课(6.175)以及实践选修课(6.375)"}),l.jsxs(vK,{children:[l.jsx(yK,{}),l.jsxs(rm,{isActive:!0,children:[l.jsx(nm,{isActive:!0,children:"MIT6.004"}),l.jsx(im,{isActive:!0}),l.jsx(om,{isActive:!0}),l.jsx(sm,{children:"第一阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.375"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第二阶段"})]}),l.jsxs(rm,{isActive:!1,children:[l.jsx(nm,{isActive:!1,children:"MIT6.175"}),l.jsx(im,{isActive:!1}),l.jsx(om,{isActive:!1}),l.jsx(sm,{children:"第三阶段"})]})]}),l.jsx(Nc,{children:"内容涵盖了组合逻辑、简单时序逻辑、流水线及流式数据处理、RISC-V指令集架构、RISC-V处理器实现、Cache、中断异常、Non-Blocking Cache、多核处理器、Cache Coherence等。该课程及实验的授课老师为MIT的Arvind教授,他也是新一代开源HDL语言Bluespec SystemVerilog的发明人,因此该课程的全部实验也采用Bluespec进行RTL的编写。"}),l.jsx(Nc,{children:"在学习三门公开课的同时,我们也自己加入了一些专项训练内容,例如AXI协议握手、流式编程在控制通路上的应用等,从而进一步提升参与者的能力,加深对硬件设计中并发性和流水线的理解。"})]}),l.jsx(wK,{src:IG})]}),QK=()=>l.jsxs(xK,{children:[l.jsx(_K,{children:"培训内容"}),l.jsxs(SK,{children:[l.jsxs(bK,{children:[l.jsx(kK,{children:"序号"}),l.jsx(CK,{children:"实验内容"})]}),l.jsxs(DK,{children:[l.jsxs(am,{children:[l.jsx(lm,{children:"第一阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab0"}),l.jsx(ar,{children:"实验环境搭建"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab1"}),l.jsx(ar,{children:"多路复用器和加法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab2"}),l.jsx(ar,{children:"乘法器"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab3"}),l.jsx(ar,{children:"流水线"})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab4"}),l.jsx(ar,{children:"FIFO(Bypass/Pass through/Concurrent)"})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第二阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"专项1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"AXI总线握手打拍与反压机制"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项2"}),l.jsxs(ar,{children:[l.jsx(Yn,{children:"流式数据处理"}),l.jsxs(jK,{children:[l.jsx(zc,{children:"简单音频处理流水线"}),l.jsx(zc,{children:"音频处理扩展:FFT"}),l.jsx(zc,{children:"音频处理扩展:Pitch Shifting"}),l.jsx(zc,{children:"流水线的软硬件联调仿真"})]})]})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"专项3"}),l.jsx(ar,{children:l.jsx(Yn,{children:"网络设备中的流式数据包处理"})})]})]})]}),l.jsxs(am,{children:[l.jsx(lm,{children:"第三阶段"}),l.jsxs(cm,{children:[l.jsxs(or,{children:[l.jsx(sr,{children:"Lab5"}),l.jsx(ar,{children:l.jsx(Yn,{children:"单周期及多周期RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab6"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持分支预测及6级流水的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab7"}),l.jsx(ar,{children:l.jsx(Yn,{children:"具备ICache和DCache的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Lab8"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持异常处理的RISC-V处理器"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project1"}),l.jsx(ar,{children:l.jsx(Yn,{children:"支持乱序执行的RISC-V处理器(Store Queue)"})})]}),l.jsxs(or,{children:[l.jsx(sr,{children:"Project2"}),l.jsx(ar,{children:l.jsx(Yn,{children:"多核处理器及缓存一致性(基于MSI协议)"})})]})]})]}),l.jsx(EK,{})]})]})]}),qK=()=>l.jsx(AK,{children:l.jsxs(TK,{children:[l.jsx(RK,{src:NG}),l.jsx(OK,{children:"项目课程亮点"}),l.jsxs(PK,{children:[l.jsx(MK,{src:zG}),l.jsxs(LK,{children:[l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"课程及实验安排由浅入深,并在最终到达相当的深度,既可作为“一生一芯”项目的补充课程,也可作为独立项目进行学习。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"采用Bluespec作为实验语言,具有更强的抽象表达能力,可以更高效的实现复杂功能,使得学生可以把精力更集中的放在架构设计上。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"注重软硬件联合开发,培养软硬通吃的复合型人才。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"课程时间安排紧凑,内容丰富,学生通常可以通过2~3个月的业余时间即可自学完成所有实验。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"主要课程资料均为英文,有助于锻炼国外文献阅读能力。"})]}),l.jsxs(Ho,{children:[l.jsx(Vo,{src:Yo}),l.jsx(Fo,{children:"全开源、社区化"})]})]})]})]})}),ZK=()=>l.jsx(IK,{id:"supply",children:l.jsxs(NK,{children:[l.jsx(zK,{src:YG}),l.jsx(YK,{children:"新手上路补给站"}),l.jsxs(HK,{children:[l.jsx(Yc,{src:HG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1u8411i7Qw/"}),l.jsx(Yc,{src:VG,onClick:()=>window.location.href="https://www.bilibili.com/video/BV1cs4y1r7T3/"}),l.jsx(Yc,{src:FG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/-MnRFCXHy5v-tt4MujfqtQ"}),l.jsx(Yc,{src:UG,onClick:()=>window.location.href="https://mp.weixin.qq.com/s/I5bPw_AUWTh2VgzAm4SHhg"})]})]})}),JK=()=>l.jsx(VK,{children:l.jsxs(FK,{children:[l.jsxs(UK,{children:[l.jsxs(um,{style:{gridColumnStart:"span 2"},children:[l.jsx(dm,{children:"申明"}),l.jsx(fm,{children:"MIT体系结构公开课学习社区项目以学习者自学开源的MIT三门公开课为主,社区内大家互相监督和交流,社区有助教在线答疑,帮助有志于从事数字芯片设计的同学强化体系结构基础知识,提升数字芯片设计的能力。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"报名表"}),l.jsx(fm,{children:"请扫描二维码,填写报名表,加入MIT体系结构公开课学习社区项目。报名成功后,将收到邮件确认。"})]}),l.jsxs(um,{children:[l.jsx(dm,{children:"咨询"}),l.jsx(fm,{children:"关于MIT体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord小助手微信咨询。"})]})]}),l.jsxs($K,{children:[l.jsx(a2,{src:$G}),l.jsx(a2,{src:BG})]}),l.jsxs(BK,{onClick:()=>window.location.href="https://datenlord.feishu.cn/wiki/CNwFwKXPaiy0cfkNYrqcLNdCnTf",children:["往届学员",">>"]})]})}),eX="/zh-cn/assets/title-6364f1d7.png",tX="/zh-cn/assets/stage1-5eb61c6d.png",rX="/zh-cn/assets/stage2-586e5a56.png",nX="/zh-cn/assets/stage3-021de657.png",iX="/zh-cn/assets/github-6b99dc67.svg",oX=f.div` display: flex; flex-direction: column; align-items: center; margin-top: -0.72rem; padding-block: calc(0.72rem + 0.53rem) 0.8rem; background: #1a1a1a; -`,nX=f.img` +`,sX=f.img` padding-top: 0.53rem; width: 4.6rem; -`,iX=f.div` +`,aX=f.div` padding-top: 0.41rem; color: #fff; font-size: 0.44rem; line-height: 0.56rem; -`,oX=f.div` +`,lX=f.div` color: #fff; font-size: 0.2rem; line-height: 0.56rem; -`,sX=f.main` +`,cX=f.main` background: #000; -`,aX=f.div` +`,uX=f.div` display: flex; flex-direction: column; gap: 0.46rem; @@ -3086,8 +3098,8 @@ var n=r.defineLocale("zh-cn",{months:"一月_二月_三月_四月_五月_六月_ display: inline-block; width: 0.18rem; height: 0.18rem; - background-image: url(${tX}); + background-image: url(${iX}); background-size: cover; margin-left: 0.06rem; } -`,Jp=[{avatar:"https://avatars.githubusercontent.com/u/11474381?v=4",name:"myrfy001",url:"https://github.com/myrfy001"},{avatar:"https://avatars.githubusercontent.com/u/32484423?v=4",name:"GTwhy",url:"https://github.com/GTwhy"},{avatar:"https://avatars.githubusercontent.com/u/78157415?v=4",name:"kazutoiris",url:"https://github.com/kazutoiris"},{avatar:"https://avatars.githubusercontent.com/u/55951109?v=4",name:"wengwz",url:"https://github.com/wengwz"},{avatar:"https://avatars.githubusercontent.com/u/111745697?v=4",name:"Huihaojia",url:"https://github.com/Huihaojia"},{avatar:"https://avatars.githubusercontent.com/u/108394891?v=4",name:"李琦彬",url:"https://github.com/androny1012"},{avatar:"https://avatars.githubusercontent.com/u/94814217?v=4",name:"李金东",url:"https://github.com/adamgallas"}],e0=Jp,cx=e0,lX=()=>l.jsxs(Rt.Fragment,{children:[l.jsxs(rX,{children:[l.jsx(nX,{src:qK}),l.jsx(iX,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(oX,{children:"(排名不分先后)"})]}),l.jsx(sX,{children:l.jsxs(aX,{children:[l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:ZK}),l.jsx(gm,{children:l.jsxs(vm,{children:[Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t)),Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:JK}),l.jsx(gm,{children:l.jsxs(vm,{children:[e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:eX}),l.jsx(gm,{children:l.jsxs(vm,{children:[cx.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),cx.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})})]})})]}),cX=dO([{path:"/",element:l.jsx(eM,{}),children:[{path:"",element:l.jsx(w6,{})},{path:"products",element:l.jsx(pw,{})},{path:"products/:sectionId",element:l.jsx(pw,{})},{path:"rdma",element:l.jsx(G6,{})},{path:"service",element:l.jsx(lN,{})},{path:"app",element:l.jsx(gN,{})},{path:"solutions",element:l.jsx(_w,{})},{path:"solutions/:sectionId",element:l.jsx(_w,{})},{path:"community",element:l.jsx(Sw,{})},{path:"community",element:l.jsx(Sw,{})},{path:"resources2",element:l.jsx(Tw,{})},{path:"resources2/:sectionId",element:l.jsx(Tw,{})},{path:"clients",element:l.jsx(Rw,{})},{path:"clients/:sectionId",element:l.jsx(Rw,{})},{path:"company1",element:l.jsx(Pw,{})},{path:"company1/:sectionId",element:l.jsx(Pw,{})},{path:"company2",element:l.jsx(Nw,{})},{path:"company2/:sectionId",element:l.jsx(Nw,{})},{path:"tech-talk",element:l.jsx(Mc,{})},{path:"oss-showcase",element:l.jsx(Mc,{})},{path:"rust-showcase",element:l.jsx(Mc,{})},{path:"hardware-acceleration",element:l.jsx(Mc,{})},{path:":title",element:l.jsx(q9,{})},{path:":section/:title",element:l.jsx(dW,{})},{path:"job-description",element:l.jsx(BW,{})},{path:"job-description/:key",element:l.jsx(jG,{})},{path:"MIT",element:l.jsx(lx,{})},{path:"community/mit",element:l.jsx(lx,{})},{path:"MIT/rank",element:l.jsx(lX,{})}]}]),uX={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Kr(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n3?t.i-4:t.i:Array.isArray(e)?1:lv(e)?2:cv(e)?3:0}function _s(e,t){return Qs(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function dX(e,t){return Qs(e)===2?e.get(t):e[t]}function Hk(e,t,r){var n=Qs(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Fk(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function lv(e){return vX&&e instanceof Map}function cv(e){return yX&&e instanceof Set}function ro(e){return e.o||e.t}function uv(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=Uk(e);delete t[Je];for(var r=Ss(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=fX),Object.freeze(e),t&&Co(e,function(r,n){return dv(n,!0)},!0)),e}function fX(){Kr(2)}function fv(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function wn(e){var t=i0[e];return t||Kr(18,e),t}function hX(e,t){i0[e]||(i0[e]=t)}function t0(){return _l}function ym(e,t){t&&(wn("Patches"),e.u=[],e.s=[],e.v=t)}function Ju(e){r0(e),e.p.forEach(mX),e.p=null}function r0(e){e===_l&&(_l=e.l)}function ux(e){return _l={p:[],l:_l,h:e,m:!0,_:0}}function mX(e){var t=e[Je];t.i===0||t.i===1?t.j():t.g=!0}function wm(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||wn("ES5").S(t,e,n),n?(r[Je].P&&(Ju(t),Kr(4)),ni(e)&&(e=ed(t,e),t.l||td(t,e)),t.u&&wn("Patches").M(r[Je].t,e,t.u,t.s)):e=ed(t,r,[]),Ju(t),t.u&&t.v(t.u,t.s),e!==Vk?e:void 0}function ed(e,t,r){if(fv(t))return t;var n=t[Je];if(!n)return Co(t,function(c,d){return dx(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return td(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=uv(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),Co(o,function(c,d){return dx(e,n,i,c,d,r,a)}),td(e,i,!1),r&&e.u&&wn("Patches").N(n,r,e.u,e.s)}return n.o}function dx(e,t,r,n,i,o,a){if($i(i)){var c=ed(e,i,o&&t&&t.i!==3&&!_s(t.R,n)?o.concat(n):void 0);if(Hk(r,n,c),!$i(c))return;e.m=!1}else a&&r.add(i);if(ni(i)&&!fv(i)){if(!e.h.D&&e._<1)return;ed(e,i),t&&t.A.l||td(e,i)}}function td(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&dv(t,r)}function xm(e,t){var r=e[Je];return(r?ro(r):e)[t]}function fx(e,t){if(t in e)for(var r=Object.getPrototypeOf(e);r;){var n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Object.getPrototypeOf(r)}}function bi(e){e.P||(e.P=!0,e.l&&bi(e.l))}function _m(e){e.o||(e.o=uv(e.t))}function n0(e,t,r){var n=lv(t)?wn("MapSet").F(t,r):cv(t)?wn("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:t0(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=Sl;a&&(d=[c],h=Ta);var g=Proxy.revocable(d,h),v=g.revoke,_=g.proxy;return c.k=_,c.j=v,_}(t,r):wn("ES5").J(t,r);return(r?r.A:t0()).p.push(n),n}function pX(e){return $i(e)||Kr(22,e),function t(r){if(!ni(r))return r;var n,i=r[Je],o=Qs(r);if(i){if(!i.P&&(i.i<4||!wn("ES5").K(i)))return i.t;i.I=!0,n=hx(r,o),i.I=!1}else n=hx(r,o);return Co(n,function(a,c){i&&dX(i.t,a)===c||Hk(n,a,t(c))}),o===3?new Set(n):n}(e)}function hx(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return uv(e)}function gX(){function e(o,a){var c=i[o];return c?c.enumerable=a:i[o]=c={configurable:!0,enumerable:a,get:function(){var d=this[Je];return Sl.get(d,o)},set:function(d){var h=this[Je];Sl.set(h,o,d)}},c}function t(o){for(var a=o.length-1;a>=0;a--){var c=o[a][Je];if(!c.P)switch(c.i){case 5:n(c)&&bi(c);break;case 4:r(c)&&bi(c)}}}function r(o){for(var a=o.t,c=o.k,d=Ss(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==Je){var v=a[g];if(v===void 0&&!_s(a,g))return!0;var _=c[g],b=_&&_[Je];if(b?b.t!==v:!Fk(_,v))return!0}}var k=!!a[Je];return d.length!==Ss(a).length+(k?0:1)}function n(o){var a=o.k;if(a.length!==o.t.length)return!0;var c=Object.getOwnPropertyDescriptor(a,a.length-1);if(c&&!c.get)return!0;for(var d=0;d1?y-1:0),S=1;S1?g-1:0),_=1;_=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=wn("Patches").$;return $i(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),_r=new xX,$k=_r.produce;_r.produceWithPatches.bind(_r);_r.setAutoFreeze.bind(_r);_r.setUseProxies.bind(_r);_r.applyPatches.bind(_r);_r.createDraft.bind(_r);_r.finishDraft.bind(_r);function bl(e){return bl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},bl(e)}function _X(e,t){if(bl(e)!=="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(bl(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function SX(e){var t=_X(e,"string");return bl(t)==="symbol"?t:String(t)}function bX(e,t,r){return t=SX(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function vx(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function yx(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Vt(1));return r(Bk)(e,t)}if(typeof e!="function")throw new Error(Vt(2));var i=e,o=t,a=[],c=a,d=!1;function h(){c===a&&(c=a.slice())}function g(){if(d)throw new Error(Vt(3));return o}function v(D){if(typeof D!="function")throw new Error(Vt(4));if(d)throw new Error(Vt(5));var j=!0;return h(),c.push(D),function(){if(j){if(d)throw new Error(Vt(6));j=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function _(D){if(!kX(D))throw new Error(Vt(7));if(typeof D.type>"u")throw new Error(Vt(8));if(d)throw new Error(Vt(9));try{d=!0,o=i(o,D)}finally{d=!1}for(var j=a=c,y=0;y"u")throw new Error(Vt(12));if(typeof r(void 0,{type:rd.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Vt(13))})}function DX(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Vt(14));v[b]=j,g=g||j!==D}return g=g||o.length!==Object.keys(d).length,g?v:d}}function nd(){for(var e=arguments.length,t=new Array(e),r=0;r0&&o[o.length-1])&&(h[0]===6||h[0]===2)){r=0;continue}if(h[0]===3&&(!o||h[1]>o[0]&&h[1]{e.value+=1},decrement:e=>{e.value-=1},incrementByAmount:(e,t)=>{e.value+=t.payload}}}),rQ=tQ.reducer,nQ=UX({reducer:{counter:rQ}});Cm.createRoot(document.getElementById("root")).render(l.jsx(i4,{store:nQ,children:l.jsxs(gP,{theme:uX,children:[l.jsx(o4,{}),l.jsx(rO,{router:cX})]})}))});export default iQ(); +`,Jp=[{avatar:"https://avatars.githubusercontent.com/u/11474381?v=4",name:"myrfy001",url:"https://github.com/myrfy001"},{avatar:"https://avatars.githubusercontent.com/u/32484423?v=4",name:"GTwhy",url:"https://github.com/GTwhy"},{avatar:"https://avatars.githubusercontent.com/u/78157415?v=4",name:"kazutoiris",url:"https://github.com/kazutoiris"},{avatar:"https://avatars.githubusercontent.com/u/55951109?v=4",name:"wengwz",url:"https://github.com/wengwz"},{avatar:"https://avatars.githubusercontent.com/u/111745697?v=4",name:"Huihaojia",url:"https://github.com/Huihaojia"},{avatar:"https://avatars.githubusercontent.com/u/108394891?v=4",name:"李琦彬",url:"https://github.com/androny1012"},{avatar:"https://avatars.githubusercontent.com/u/94814217?v=4",name:"李金东",url:"https://github.com/adamgallas"}],e0=Jp,c2=e0,dX=()=>l.jsxs(Rt.Fragment,{children:[l.jsxs(oX,{children:[l.jsx(sX,{src:eX}),l.jsx(aX,{children:"恭喜所有完成MIT体系结构公开课学习的同学!"}),l.jsx(lX,{children:"(排名不分先后)"})]}),l.jsx(cX,{children:l.jsxs(uX,{children:[l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:tX}),l.jsx(gm,{children:l.jsxs(vm,{children:[Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t)),Jp.map(({avatar:e,name:t,url:r})=>l.jsxs(Uo,{onClick:()=>window.open(r),children:[l.jsx($o,{src:e}),l.jsx(Bo,{children:t})]},t))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:rX}),l.jsx(gm,{children:l.jsxs(vm,{children:[e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),e0.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})}),l.jsx(hm,{children:l.jsxs(mm,{children:[l.jsx(pm,{src:nX}),l.jsx(gm,{children:l.jsxs(vm,{children:[c2.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name)),c2.map(e=>l.jsxs(Uo,{children:[l.jsx($o,{src:e.avatar}),l.jsx(Bo,{children:e.name})]},e.name))]})})]})})]})})]}),fX=dO([{path:"/",element:l.jsx(eM,{}),children:[{path:"",element:l.jsx(w6,{})},{path:"products",element:l.jsx(pw,{})},{path:"products/:sectionId",element:l.jsx(pw,{})},{path:"rdma",element:l.jsx(G6,{})},{path:"service",element:l.jsx(lN,{})},{path:"app",element:l.jsx(wN,{})},{path:"solutions",element:l.jsx(_w,{})},{path:"solutions/:sectionId",element:l.jsx(_w,{})},{path:"community",element:l.jsx(Sw,{})},{path:"community",element:l.jsx(Sw,{})},{path:"resources2",element:l.jsx(Tw,{})},{path:"resources2/:sectionId",element:l.jsx(Tw,{})},{path:"clients",element:l.jsx(Rw,{})},{path:"clients/:sectionId",element:l.jsx(Rw,{})},{path:"company1",element:l.jsx(Pw,{})},{path:"company1/:sectionId",element:l.jsx(Pw,{})},{path:"company2",element:l.jsx(Nw,{})},{path:"company2/:sectionId",element:l.jsx(Nw,{})},{path:"tech-talk",element:l.jsx(Mc,{})},{path:"oss-showcase",element:l.jsx(Mc,{})},{path:"rust-showcase",element:l.jsx(Mc,{})},{path:"hardware-acceleration",element:l.jsx(Mc,{})},{path:":title",element:l.jsx(eW,{})},{path:":section/:title",element:l.jsx(mW,{})},{path:"job-description",element:l.jsx(KW,{})},{path:"job-description/:key",element:l.jsx(TG,{})},{path:"MIT",element:l.jsx(l2,{})},{path:"community/mit",element:l.jsx(l2,{})},{path:"MIT/rank",element:l.jsx(dX,{})}]}]),hX={themeDark:"#0A061F",themeDark02:"#42424A",secondary01:"#7680DD",secondary02:"#D9DBEF",secondary07:"#F2994A",secondary08:"#FDCB6E",gray03:"#828282",gray04:"#4F4F4F",gray007:"#272D37",white00:"#fff"};function Kr(e){for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;n3?t.i-4:t.i:Array.isArray(e)?1:lv(e)?2:cv(e)?3:0}function _s(e,t){return Qs(e)===2?e.has(t):Object.prototype.hasOwnProperty.call(e,t)}function mX(e,t){return Qs(e)===2?e.get(t):e[t]}function Hk(e,t,r){var n=Qs(e);n===2?e.set(t,r):n===3?e.add(r):e[t]=r}function Vk(e,t){return e===t?e!==0||1/e==1/t:e!=e&&t!=t}function lv(e){return xX&&e instanceof Map}function cv(e){return _X&&e instanceof Set}function ro(e){return e.o||e.t}function uv(e){if(Array.isArray(e))return Array.prototype.slice.call(e);var t=Uk(e);delete t[Je];for(var r=Ss(t),n=0;n1&&(e.set=e.add=e.clear=e.delete=pX),Object.freeze(e),t&&Co(e,function(r,n){return dv(n,!0)},!0)),e}function pX(){Kr(2)}function fv(e){return e==null||typeof e!="object"||Object.isFrozen(e)}function wn(e){var t=i0[e];return t||Kr(18,e),t}function gX(e,t){i0[e]||(i0[e]=t)}function t0(){return _l}function ym(e,t){t&&(wn("Patches"),e.u=[],e.s=[],e.v=t)}function Ju(e){r0(e),e.p.forEach(vX),e.p=null}function r0(e){e===_l&&(_l=e.l)}function u2(e){return _l={p:[],l:_l,h:e,m:!0,_:0}}function vX(e){var t=e[Je];t.i===0||t.i===1?t.j():t.g=!0}function wm(e,t){t._=t.p.length;var r=t.p[0],n=e!==void 0&&e!==r;return t.h.O||wn("ES5").S(t,e,n),n?(r[Je].P&&(Ju(t),Kr(4)),ni(e)&&(e=ed(t,e),t.l||td(t,e)),t.u&&wn("Patches").M(r[Je].t,e,t.u,t.s)):e=ed(t,r,[]),Ju(t),t.u&&t.v(t.u,t.s),e!==Fk?e:void 0}function ed(e,t,r){if(fv(t))return t;var n=t[Je];if(!n)return Co(t,function(c,d){return d2(e,n,t,c,d,r)},!0),t;if(n.A!==e)return t;if(!n.P)return td(e,n.t,!0),n.t;if(!n.I){n.I=!0,n.A._--;var i=n.i===4||n.i===5?n.o=uv(n.k):n.o,o=i,a=!1;n.i===3&&(o=new Set(i),i.clear(),a=!0),Co(o,function(c,d){return d2(e,n,i,c,d,r,a)}),td(e,i,!1),r&&e.u&&wn("Patches").N(n,r,e.u,e.s)}return n.o}function d2(e,t,r,n,i,o,a){if($i(i)){var c=ed(e,i,o&&t&&t.i!==3&&!_s(t.R,n)?o.concat(n):void 0);if(Hk(r,n,c),!$i(c))return;e.m=!1}else a&&r.add(i);if(ni(i)&&!fv(i)){if(!e.h.D&&e._<1)return;ed(e,i),t&&t.A.l||td(e,i)}}function td(e,t,r){r===void 0&&(r=!1),!e.l&&e.h.D&&e.m&&dv(t,r)}function xm(e,t){var r=e[Je];return(r?ro(r):e)[t]}function f2(e,t){if(t in e)for(var r=Object.getPrototypeOf(e);r;){var n=Object.getOwnPropertyDescriptor(r,t);if(n)return n;r=Object.getPrototypeOf(r)}}function bi(e){e.P||(e.P=!0,e.l&&bi(e.l))}function _m(e){e.o||(e.o=uv(e.t))}function n0(e,t,r){var n=lv(t)?wn("MapSet").F(t,r):cv(t)?wn("MapSet").T(t,r):e.O?function(i,o){var a=Array.isArray(i),c={i:a?1:0,A:o?o.A:t0(),P:!1,I:!1,R:{},l:o,t:i,k:null,o:null,j:null,C:!1},d=c,h=Sl;a&&(d=[c],h=Ta);var g=Proxy.revocable(d,h),v=g.revoke,_=g.proxy;return c.k=_,c.j=v,_}(t,r):wn("ES5").J(t,r);return(r?r.A:t0()).p.push(n),n}function yX(e){return $i(e)||Kr(22,e),function t(r){if(!ni(r))return r;var n,i=r[Je],o=Qs(r);if(i){if(!i.P&&(i.i<4||!wn("ES5").K(i)))return i.t;i.I=!0,n=h2(r,o),i.I=!1}else n=h2(r,o);return Co(n,function(a,c){i&&mX(i.t,a)===c||Hk(n,a,t(c))}),o===3?new Set(n):n}(e)}function h2(e,t){switch(t){case 2:return new Map(e);case 3:return Array.from(e)}return uv(e)}function wX(){function e(o,a){var c=i[o];return c?c.enumerable=a:i[o]=c={configurable:!0,enumerable:a,get:function(){var d=this[Je];return Sl.get(d,o)},set:function(d){var h=this[Je];Sl.set(h,o,d)}},c}function t(o){for(var a=o.length-1;a>=0;a--){var c=o[a][Je];if(!c.P)switch(c.i){case 5:n(c)&&bi(c);break;case 4:r(c)&&bi(c)}}}function r(o){for(var a=o.t,c=o.k,d=Ss(c),h=d.length-1;h>=0;h--){var g=d[h];if(g!==Je){var v=a[g];if(v===void 0&&!_s(a,g))return!0;var _=c[g],k=_&&_[Je];if(k?k.t!==v:!Vk(_,v))return!0}}var C=!!a[Je];return d.length!==Ss(a).length+(C?0:1)}function n(o){var a=o.k;if(a.length!==o.t.length)return!0;var c=Object.getOwnPropertyDescriptor(a,a.length-1);if(c&&!c.get)return!0;for(var d=0;d1?y-1:0),S=1;S1?g-1:0),_=1;_=0;i--){var o=n[i];if(o.path.length===0&&o.op==="replace"){r=o.value;break}}i>-1&&(n=n.slice(i+1));var a=wn("Patches").$;return $i(r)?a(r,n):this.produce(r,function(c){return a(c,n)})},e}(),_r=new bX,$k=_r.produce;_r.produceWithPatches.bind(_r);_r.setAutoFreeze.bind(_r);_r.setUseProxies.bind(_r);_r.applyPatches.bind(_r);_r.createDraft.bind(_r);_r.finishDraft.bind(_r);function bl(e){return bl=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},bl(e)}function kX(e,t){if(bl(e)!=="object"||e===null)return e;var r=e[Symbol.toPrimitive];if(r!==void 0){var n=r.call(e,t||"default");if(bl(n)!=="object")return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return(t==="string"?String:Number)(e)}function CX(e){var t=kX(e,"string");return bl(t)==="symbol"?t:String(t)}function DX(e,t,r){return t=CX(t),t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function v2(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(i){return Object.getOwnPropertyDescriptor(e,i).enumerable})),r.push.apply(r,n)}return r}function y2(e){for(var t=1;t"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(Ft(1));return r(Bk)(e,t)}if(typeof e!="function")throw new Error(Ft(2));var i=e,o=t,a=[],c=a,d=!1;function h(){c===a&&(c=a.slice())}function g(){if(d)throw new Error(Ft(3));return o}function v(D){if(typeof D!="function")throw new Error(Ft(4));if(d)throw new Error(Ft(5));var j=!0;return h(),c.push(D),function(){if(j){if(d)throw new Error(Ft(6));j=!1,h();var w=c.indexOf(D);c.splice(w,1),a=null}}}function _(D){if(!jX(D))throw new Error(Ft(7));if(typeof D.type>"u")throw new Error(Ft(8));if(d)throw new Error(Ft(9));try{d=!0,o=i(o,D)}finally{d=!1}for(var j=a=c,y=0;y"u")throw new Error(Ft(12));if(typeof r(void 0,{type:rd.PROBE_UNKNOWN_ACTION()})>"u")throw new Error(Ft(13))})}function AX(e){for(var t=Object.keys(e),r={},n=0;n"u")throw h&&h.type,new Error(Ft(14));v[k]=j,g=g||j!==D}return g=g||o.length!==Object.keys(d).length,g?v:d}}function nd(){for(var e=arguments.length,t=new Array(e),r=0;r0&&o[o.length-1])&&(h[0]===6||h[0]===2)){r=0;continue}if(h[0]===3&&(!o||h[1]>o[0]&&h[1]{e.value+=1},decrement:e=>{e.value-=1},incrementByAmount:(e,t)=>{e.value+=t.payload}}}),oQ=iQ.reducer,sQ=WX({reducer:{counter:oQ}});Cm.createRoot(document.getElementById("root")).render(l.jsx(i4,{store:sQ,children:l.jsxs(gP,{theme:hX,children:[l.jsx(o4,{}),l.jsx(rO,{router:fX})]})}))});export default aQ(); diff --git a/zh-cn/assets/index-e0e6b52c.js b/zh-cn/assets/index-a5e56ae7.js similarity index 98% rename from zh-cn/assets/index-e0e6b52c.js rename to zh-cn/assets/index-a5e56ae7.js index f14ebba..ce92d29 100644 --- a/zh-cn/assets/index-e0e6b52c.js +++ b/zh-cn/assets/index-a5e56ae7.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",n="/zh-cn/assets/9d0ce540d5b4e7c3cb1a055c1413bdc9-a833a409.png",c="/zh-cn/assets/f7aae2cd2b075c3f567ff87285f738c2-476d6b84.png",t="/zh-cn/assets/bb02cb50b10cee5e7d575210aaeacd71-1661168b.png",l=[e,s,a,n,c,t],p={label:"Xline 源码解读(四)—— CURP 状态机引擎",description:"在上一篇源码解读的文章(Xline 源码解读(三) —— CURP Server 的实现)中,我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。",cover:"./e4031380f79f643b21d6bdfd37c46a1c.jpeg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-10-19",title:"Xline Source Code Interpretation (IV) CURP state machine engine"},r=[{label:"为什么我们需要冲突检测队列?",level:2},{label:"冲突检测队列是如何工作的?",level:2},{label:"状态机引擎的架构",level:2},{label:"状态是如何转换的",level:2},{label:"Summary",level:2}],o=`

    +const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn/assets/8108518a82f752ddea6832ce7bc15560-3d5249bd.png",a="/zh-cn/assets/cf12e52cb9d0fbb7359c08e1cfc674bc-9774dac8.png",n="/zh-cn/assets/9d0ce540d5b4e7c3cb1a055c1413bdc9-a833a409.png",c="/zh-cn/assets/f7aae2cd2b075c3f567ff87285f738c2-476d6b84.png",t="/zh-cn/assets/bb02cb50b10cee5e7d575210aaeacd71-1661168b.png",l=[e,s,a,n,c,t],r={label:"Xline 源码解读(四)—— CURP 状态机引擎",description:"在上一篇源码解读的文章(Xline 源码解读(三) —— CURP Server 的实现)中,我们简单阐述了Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。",cover:"./e4031380f79f643b21d6bdfd37c46a1c.jpeg",location:"中国香港",author:["赵佳炜"],tags:["Xline"],date:"2023-10-19",title:"Xline Source Code Interpretation (IV) CURP state machine engine"},p=[{label:"为什么我们需要冲突检测队列?",level:2},{label:"冲突检测队列是如何工作的?",level:2},{label:"状态机引擎的架构",level:2},{label:"状态是如何转换的",level:2},{label:"Summary",level:2}],o=`

    在上一篇源码解读的文章(
    Xline 源码解读(三) —— CURP Server 的实现

    )中,我们简单阐述了 Xline 的 Curp Server 是如何实现的。接下来,就让我们话接上回,继续深入地来了解 Curp Server 中的一些核心的数据结构,特别是 conflict_checked_channel 和 command worker,它们相互协作,共同推动着 CURP Server 内部状态机状态转换。

    @@ -144,4 +144,4 @@ const e="/zh-cn/assets/e4031380f79f643b21d6bdfd37c46a1c-95e167c8.jpeg",s="/zh-cn 来判断命令是否冲突是显然不够的。因为  spec_pool 
    只能判断新的命令是否与正在  execute 
    但还没有  after_sync
    -的命令冲突,但它不能起到动态维护命令冲突关系的作用。为了解决冲突关系的动态维护,我们引入了冲突检测队列,并通过冲突检测队列和 command worker 共同构造 Curp Server 的状态机引擎。通过 command worker 的执行,使得来自不同路径(fast path 和 slow path)的命令能够根据自身的状态,进行状态转移,并向用户返回相应的结果。

    `;export{l as assetURLs,o as default,p as metadata,r as toc}; +的命令冲突,但它不能起到动态维护命令冲突关系的作用。为了解决冲突关系的动态维护,我们引入了冲突检测队列,并通过冲突检测队列和 command worker 共同构造 Curp Server 的状态机引擎。通过 command worker 的执行,使得来自不同路径(fast path 和 slow path)的命令能够根据自身的状态,进行状态转移,并向用户返回相应的结果。

    `;export{l as assetURLs,o as default,r as metadata,p as toc}; diff --git a/zh-cn/assets/index-50ad21f0.js b/zh-cn/assets/index-b0b5bfda.js similarity index 96% rename from zh-cn/assets/index-50ad21f0.js rename to zh-cn/assets/index-b0b5bfda.js index b5a596d..54951bb 100644 --- a/zh-cn/assets/index-50ad21f0.js +++ b/zh-cn/assets/index-b0b5bfda.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png",i="/zh-cn/assets/image2-238eb6f5.jpg",l="/zh-cn/assets/image3-9644e0b1.png",s=[e,t,i,l],a={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},c=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],n=`

    封面

    +const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png",a="/zh-cn/assets/image2-238eb6f5.jpg",i="/zh-cn/assets/image3-9644e0b1.png",l=[e,t,a,i],s={label:"MIT体系结构公开课学习社区2.0版正式上线啦~",description:"随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。由此,在2023年伊始,达坦科技发起成立了MIT体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。",cover:"./cover.jpg",location:"中国香港",date:"2023-12-14",title:"MIT Architecture Open Course Learning Community Version 2.0 is officially launched~"},c=[{label:"为什么要发起设立 MIT 体系结构公开课学习社区?",level:2},{label:"学习社区运营十个月有什么成果?",level:2},{label:"为什么要升级 MIT 体系结构公开课学习社区 2.0 版?",level:2},{label:"MIT 体系结构公开课学习社区 2.0 版有什么改进?",level:2},{label:"欢迎报名",level:2}],n=`

    封面

    为什么要发起设立 MIT 体系结构公开课学习社区?

    随着芯片技术自主可控成为国家重要的战略发展规划,对芯片设计相关领域的人才需求也在快速增长。体系结构课程相对于硬件设计的重要性可以类比于设计模式相对于软件设计的重要性,扎实的体系结构基础是设计复杂硬件的基石。然而现实情况是,虽然国内大专院校计算机学科、电子工程学科、微电子等都有开设体系结构或组成原理等相关课程,但由于前些年对相关教学重视度不够,导致教学实践环节存在诸多缺失,毕业生掌握的技能与工业界的期望之间存在较大差距。

    由此,在 2023 年伊始,达坦科技发起成立了 MIT 体系结构公开课学习社区,邀请所有对硬件敏捷开发设计感兴趣的同学加入我们,组成拥有共同学习目标的互助自学小组,一起系统地学习计算机体系结构相关知识,并且通过动手项目来验证学习的成果。

    @@ -44,6 +44,6 @@ const e="/zh-cn/assets/cover-2326b9d3.jpg",t="/zh-cn/assets/image1-62ba36d5.png"

    欢迎报名

    请扫描二维码, 填写报名表,加入 MIT 体系结构公开课学习社区项目。

    报名成功后,将收到邮件确认及学号。

    -

    图片

    +

    图片

    关于 MIT 体系结构公开课学习社区项目有任何问题或疑问,可以邮件:ta@datenlord.com或添加DatenLord 小助手微信咨询。

    -

    图片

    `;export{s as assetURLs,n as default,a as metadata,c as toc}; +

    图片

    `;export{l as assetURLs,n as default,s as metadata,c as toc}; diff --git a/zh-cn/assets/index-b9598d44.js b/zh-cn/assets/index-b9598d44.js new file mode 100644 index 0000000..3ade3bc --- /dev/null +++ b/zh-cn/assets/index-b9598d44.js @@ -0,0 +1,59 @@ +const o="/zh-cn/assets/image1-ec71eac6.webp",e=[o],t={label:"一封来自 DatenLord 关于GSoC 2024的挑战书",description:"Google Summer of Code 是一项全球性的在线计划,致力于将新的contributor引入开源软件开发领域。GSoC 参与者在导师的指导下,与开源组织合作开展为期 12 周以上的编程项目。今年,达坦科技入选作为开源社区组织,携CNCF Sandbox项目Xline下众多有趣、创新且有挑战性的题目参与本次活动。",location:"中国香港",date:"2024-02-29",title:"A Challenge Letter from DatenLord on GSoC 2024"},l=[{label:"为什么要参加 GSoC?",level:2},{label:"期待开源爱好者参与的项目",level:2},{label:"参与指南",level:2},{label:"活动重要时间点",level:2},{label:"联系方式",level:2}],r=`

    Google Summer of Code 是一项全球性的在线计划,致力于将新的 contributor 引入开源软件开发领域。GSoC 参与者在导师的指导下,与开源组织合作开展为期 12 周以上的编程项目。今年,达坦科技入选作为开源社区组织,携 CNCF Sandbox 项目 Xline 下众多有趣、创新且有挑战性的题目参与本次活动。
    +https://summerofcode.withgoogle.com/programs/2024/organizations/datenlord-6z

    +

    期待志同道合的,敢于挑战自我的小伙伴积极加入我们~

    +

    为什么要参加 GSoC?

    +
      +
    • 参与 GSoC,短时间提升编程硬实力
    • +
    • 近距离接触资深导师,定制合适的项目实现路线
    • +
    • 结识志同道合的小伙伴,编程路上不再孤单
    • +
    • 根据项目开发成果获得 GSoC 官方提供项目补贴等
    • +
    +

    GSoC 提供项目补贴将根据两次评估结果进行支付,且具体金额根据地理位置进行计算(中国大陆地区 900 ~ 3600 美元)。您可以参考 https://developers.google.com/open-source/gsoc/help/student-stipends?hl=zh-cn 来获取更多信息。

    +

    期待开源爱好者参与的项目

    +

    您可以在 DatenLord GSoC Ideas Page
    +https://datenlord.github.io/xline-home/#/GSoC
    +中看到达坦科技为本届 GSoC 准备的 5 个项目,包括:

    +
      +
    • Integrating Xline to DatenLord
    • +
    • Improve Transaction Validation
    • +
    • Xline C Client
    • +
    • Joint Consensus Correctness Testing
    • +
    • Implementing Chaos Testing in Madsim
    • +
    +

    关于项目更多详细信息,如项目简介、难易程度、需要技能、mentor 等请参考 Ideas Page。

    +

    参与指南

    +

    正式报名链接将于 3 月 18 日 18:00UTC(即北京时间 3 月 19 日 2:00) 开启,截止至 4 月 2 日 18:00 UTC(北京时间 4 月 3 日 2:00) 届时您将需要登陆 GSoC 官网:https://summerofcode.withgoogle.com/ 进行报名。

    +

    请在您的申请表中提供以下信息:

    +
      +
    1. 您的简历,包括您的过往经历、联系方式等。
    2. +
    3. 对以下问题的回答: +
        +
      • 您认为我们的项目最吸引您的地方以及您选择我们的原因是什么?
      • +
      • 您目前的技能如何与我们项目的要求相匹配?
      • +
      • 您期望从该项目中获得什么,我们如何才能让您发挥最大的作用?
      • +
      • 您以前是否参加过 GSoC(或类似项目)?
      • +
      • 您关于该项目详细的 proposal (实施计划),包括每周的日程表、目标的细分等
      • +
      +
    4. +
    +

    活动重要时间点

    +

    3/18-4/2 UTC
    +参与者挑选项目、mentor 沟通并填写报名表在官网报名
    +5/1 18:00 UTC
    +申请者报名表审核结果公示
    +5/1-5/26 UTC
    +社区联系期 | GSoC 参与者认识导师,阅读文档,尽快开始项目工作
    +5/27 UTC
    +项目正式开始
    +5/28-8/26 UTC
    +项目开发
    +9/3UTC
    +GSoC 初步结果公示
    +(若有参与者特殊延期,则延长两个月项目开发时间)

    +

    如果您还有更多关于活动时间节点相关疑问,请参考 GSoC 官网:
    +https://developers.google.com/open-source/gsoc/timeline

    +

    联系方式

    +

    对于报名方式有任何疑问,或者对某一个项目非常感兴趣,并且想要深入了解的同学,欢迎加入 Xline Discord 进行提问或与项目导师进行进一步沟通:
    +https://discord.com/invite/hqDRtYkWzm

    +

    您也可以扫码添加小助手微信,或发邮件至info@datenlord.com 进行咨询。

    +

    图片

    `;export{e as assetURLs,r as default,t as metadata,l as toc}; diff --git a/zh-cn/assets/index-aaac1d05.js b/zh-cn/assets/index-b9cc4e07.js similarity index 94% rename from zh-cn/assets/index-aaac1d05.js rename to zh-cn/assets/index-b9cc4e07.js index cc6533e..3275f55 100644 --- a/zh-cn/assets/index-aaac1d05.js +++ b/zh-cn/assets/index-b9cc4e07.js @@ -1,4 +1,4 @@ -const s="/zh-cn/assets/cover-12543354.png",n="/zh-cn/assets/image1-0af64bb3.png",t="/zh-cn/assets/image2-f28c29ca.jpg",a=[s,n,t],e={label:"达坦科技邀请热爱挑战的你参加Rust China Hackathon 2022",description:"Rust China Hackathon 2022 即将来袭! 本届Hackathon的主题为「Rust For Fun」,分为「社区组」与「企业组」。",cover:"./cover.png",location:"中国香港",date:"2022-11-11",title:"Datan Technology invites you who love challenges to participate in Rust China Hackathon 2022"},o=[],r=`

    Rust China Hackathon 2022 即将来袭! 本届 Hackathon 的主题为「Rust For Fun」,分为「社区组」与「企业组」。

    +const t="/zh-cn/assets/cover-12543354.png",n="/zh-cn/assets/image1-0af64bb3.png",s="/zh-cn/assets/image2-f28c29ca.jpg",a=[t,n,s],e={label:"达坦科技邀请热爱挑战的你参加Rust China Hackathon 2022",description:"Rust China Hackathon 2022 即将来袭! 本届Hackathon的主题为「Rust For Fun」,分为「社区组」与「企业组」。",cover:"./cover.png",location:"中国香港",date:"2022-11-11",title:"Datan Technology invites you who love challenges to participate in Rust China Hackathon 2022"},o=[],r=`

    Rust China Hackathon 2022 即将来袭! 本届 Hackathon 的主题为「Rust For Fun」,分为「社区组」与「企业组」。

    达坦科技作为本届 Hackathon 的协办方,赞助参与本次企业组赛道,将基于 Xline 这个开源项目,就 Concurrent Indexing,邀请你一起进行思维碰撞。

    Rust China Hackathon 2022
    企业组:达坦科技(DatenLord)

    @@ -22,4 +22,4 @@ Xline 是达坦科技推出的分布式元数据 KV 存储器。在使用中, 你的实现应遵从上述 Trait 并满足上述要求。我们将使用一定基准测试来进行评估,并根据其结果评分。在基准测试中,我们将发送大量并发请求,因此你也可以创建自己的性能测试来帮助进行优化。

    图片

    为更全面地向广大 工程师推介 Rust China Hackathon 2022 企业组达坦科技的赛题,我们将于 2022 年 11 月 19 日(周六)下午 2 点整安排一场空中宣讲会。欲了解更多关于本次 Hackathon 的赛制、参赛规则、日程安排,以及达坦科技赛题的介绍、相关资源,欢迎预约报名。

    -

    图片

    `;export{a as assetURLs,r as default,e as metadata,o as toc}; +

    图片

    `;export{a as assetURLs,r as default,e as metadata,o as toc}; diff --git a/zh-cn/assets/index-c0527a8b.js b/zh-cn/assets/index-c0527a8b.js new file mode 100644 index 0000000..c27fe79 --- /dev/null +++ b/zh-cn/assets/index-c0527a8b.js @@ -0,0 +1,116 @@ +const e="/zh-cn/assets/cover-4e3a952e.webp",i=[e],n={label:"Xline Jepsen 测试分析",description:"在本篇文章中, 我们主要会介绍Jepsen在测试分布式KV存储Xline中的应用。 包括对混沌工程框架Jepsen的介绍, 对分布式系统一致性模型的讨论, 以及对有关测试结果的分析。。",cover:"./cover.webp",location:"新疆",author:["尹正皓"],date:"2024-02-01",title:"Xline Jepsen test analysis"},s=[{label:"摘要",level:2},{label:"背景介绍",level:2},{label:"Xline",level:3},{label:"Jepsen",level:3},{label:"Jepsen 测试设计",level:2},{label:"数据一致性",level:3},{label:"Jepsen etcd test",level:3},{label:"Jepsen Xline test",level:3},{label:"测试结果分析",level:2},{label:"测试结果",level:3},{label:"异步落盘",level:3},{label:"Revision 生成",level:3},{label:"References",level:2}],l=`

    封面

    +

    摘要

    +

    在本篇文章中, 我们主要会介绍 Jepsen 在测试分布式 KV 存储 Xline 中的应用。 包括对混沌工程框架 Jepsen 的介绍, 对分布式系统一致性模型的讨论, 以及对有关测试结果的分析。

    +

    背景介绍

    +

    首先我们先来了解一下 Xline 以及 Jepsen 测试框架的大致背景。

    +

    Xline

    +

    Xline 是一个分布式的 KV 存储, 现在是 CNCF 的 sandbox 项目。Xline 和 etcd 类似, 提供了一个一致性的的 kv 存储, 以及其他例如 watch, 分布式锁的功能。

    +

    Xline 提供了 etcd 兼容的 API, 但它和 etcd 最主要的区别是共识协议上的。Xline 使用了 CURP 作为共识协议, 这使它能够在多数情况下都能够仅在 1-RTT(Round Trip Time)内就达成共识, 而 RAFT 达成共识至少需要 2-RTT。 因此 Xline 在高延迟环境下能够达到更好的性能。

    +

    Jepsen

    +

    Jepsen 是一个用于分布式系统的验证的框架, 属于混沌工程的范畴。 它提供了一致性检查以及错误注入(fault injection)的功能。具体来说, Jepsen 进行的是一项黑盒测试, 在测试中它会模拟真实部署环境, 在这个环境下生成一系列对于数据库的操作, 在测试结束后使用一致性检查器对于操作的结果进行检查, 检验结果满足这个数据库的一致性保证。

    +

    Checkers

    +

    Jepsen 使用 checkers 来对执行结果进行一致性检查。Jepsen 目前有两种 checkers, 一个是 Knossos, 另外一个是 Elle。Knossos 用来检查结果是否是线性一致的(Linearizable), 而 Elle 是用来检查数据库事务的一致性的(Transactional Consistency)。注意这些 checker 并不能保证检测出所有不一致的情况, 因为判定结果是否是线性一致, 以及事务一致性中的可串行化检查(Serializability Checking)都是 NP 完全问题[1][2]。Jepsen 的 checkers 会限定计算的规模以在较短时间内完成测试。

    +

    Nemesis

    +

    Jepsen 中 fault injection 的组件叫做 nemesis。Jepsen 有一些内置的 nemesis:

    +
      +
    • kill, 可以 kill 掉某些节点上数据库的进程
    • +
    • pause, 可以 pause 某些节点上数据库的进程
    • +
    • partition, 制造网络分区, 可以是任意两个节点之间, 例如我们可以分区多数/少数节点
    • +
    • clock, 可以打乱某些节点上的时钟
    • +
    +

    这些组件可以模拟在分布式系统部署环境中常见的软硬件错误。 同时, Jepsen 作为一个非常灵活的框架, 它支持用户自定义自己的 nemesis, 例如, 对于 etcd 来说, 我们可以让集群成员变更也成为一个 nemesis, 达到在测试中定时地增加/删除节点的目的。因此 nemesis 不仅仅可以用作 fault injection, 它也可以用来触发系统中可能出现的一些事件。

    +

    Jepsen 测试设计

    +

    接下来我会对 etcd Jepsen 测试设计进行详细的分析, 以及介绍我们是如何在 Xline 上应用 Jepsen 的测试。

    +

    数据一致性

    +

    首先我先简单介绍一下三种一致性模型作为下面测试分析的背景, 它们分别是 Serializability, Linearizability 以及 Strict Serializability。 这些一致性模型在 Jepsen 官方网站中有更为详细的介绍[3]。

    +

    Serializability

    +

    Serializability 是一个事务模型, 它是多个对象而言的(例如在 etcd 中就是多个 keys), 并且每一个事务的操作都是原子的。同时它具有几个特性:

    +
      +
    • 内部一致性(Internal Consistency)即一个事务的一个读操作可以观测到前面所有写操作的结果
    • +
    • 外部一致性(External Consistency)即一个事务 T1 中的读观测到另外一个事务 T0 中的写, 我们称之为 T0 对于 T1 可见(Visible), 这样就构成一个可见关系
    • +
    • 全序可见性(Total visibility)即所有的可见关系构成一个全序关系, 这其实说明了有一些事务之间是没有这个关系的, 对于所有事务加上这个可见关系构成了一个偏序集
    • +
    +

    Linearizability

    +

    Linearizability 是对单个对象而言的, 并且每个操作也是 atomic 的。 它的所有操作形成一个实时的顺序(Real-Time Ordering)。这里的实时顺序就是指的是这些操作结果的顺序是反映出操作完成时的具体时间的。

    +

    Strict Serializability

    +

    Strict Serializability 则是最强的一致性保证。它可以是看作是 Serializability 和 Linearizability 的结合, 即在多个对象上的 Linearizablity。那么其实也就是说我们这时候不仅仅是保证全序可见性了, 而是所有的事务都排成了一个实时的顺序。

    +

    Jepsen etcd test

    +

    首先我来简单介绍一下 Jepsen 官方对于 etcd 的测试设计。etcd 使用的是严格可序列化模型(Strict Serializability Model). Jepsen 为 etcd 编写了以下测试:

    +

    Registers

    +

    Register 是 Knossos 为了检查线性一致性内建的模型, 因为线性一致性是对单个对象而言的, 所以它将单个对象具体化成为一个 register, 这个 register 支持 read/write/compare-and-set 这三种操作, Knossos 会检验对 regsiter 所有操作的结果是否是线性一致的。

    +

    Sets

    +

    Sets 测试用来检测 stale reads。etcd 支持设置允许 stale reads 来达到更好的读性能, 但默认情况下是不允许的。Sets 测试只有一个操作 compare-and-set, 它对单一的 key 进行多次操作, 最后检查结果是否是可串行化的, 即检查每个 CAS 操作都是原子地发生的。

    +

    Append

    +

    Append 测试用来检查严格可序列化, 它有两种操作 read/append。Append 的意思就是把存储中 key 的 value 作为一个 list。其中 append 操作是向这个 list 中 append 一个元素。实现 append 的方式就是先从 etcd 中读出一个 key 的值, 然后在一个事务中检查值是否有改变, 如果没有改变就写入 append 过后的新值。

    +

    在这个测试中, 不仅所有的事务都要按照原子地方式进行, 而且 Jepsen 会同时检查这些事务是否是按照真实时间顺序发生的。

    +

    WR

    +

    WR 测试使用事务向多个 key 进行 read/write, 它同样是检查严格可序列化。

    +

    Jepsen Xline test

    +

    Jepsen 测试框架主要分为四个部分: DB, Client, Checkers 和 Nemesis 每一个部分都是一个单独的接口可以供用户进行实现。由于 Xline 实现了 etcd 兼容的 API, 所以我们在编写测试的时候直接复用了 Jepsen 对于 etcd 的测试。在此测试的基础上, 我们实现了 Jepsen 中 Xline 的 DB 的接口。同时 Xline 也有自己使用 CURP 共识的 client SDK, 我们同样也对此也实现了 Jepsen 中 client 的接口。所以测试实际上是分为对 etcd client 的兼容测试, 以及 Xline native 的 client 的测试(目前还未完成此项测试)。

    +

    测试结果分析

    +

    接下来我会详细讲解 Xline Jepsen 测试结果以及我们找到的问题。

    +

    测试结果

    +

    在最初的测试中, 我们遇到的问题可以说是比较多的, 其中问题最多的是和 Xline 中对于事务操作的部分, 其中有一些问题是很细微的 bug, 另外一些则是设计上存在的漏洞。这些问题都花费了大量时间进行调试和识别。

    +

    其中我会详细解释两类主要的问题, 分别是异步落盘的问题和 revision 生成中的问题。

    +

    异步落盘

    +

    etcd 落盘都是同步的, 及当一个节点拿到 log 的时候, 它会同步地把 log 持久化到储存设备上, 然后再去执行 log 中的命令, 在执行完成后再把执行结果同步的持久化到储存设备, 这样做的好处就是集群可以容忍超过多数节点同时关闭/断电而不影响正确性。

    +

    有别于 etcd 的假设, Xline 的假设是集群始终存在大多数节点, 而不考虑所有节点都失效的情况, 这也和一些基于内存的 Raft 实现类似。这给了我们一些优化空间, Xline 初始的设计是所有落盘操作都是异步的。

    +

    但是这么做会有几个问题:

    +
      +
    • 执行的顺序更难推断
      +由于最后落盘执行结果是异步进行的, 所以我们并不能准确知道 logs 的执行顺序。在 Xline 的 Read State 实现中(在 follower 本地读, 用于减少 leader 负载), 一个 follower 受到一个只读操作后, 它会向 leader 要一些信息: +步骤一: 如果当前还有未执行完成的 commands, 那么拿到他们的 ids +步骤二: 如果所有 command 已经执行完了, 那么拿到当前已经执行完成后的 log index +接下来 follower 会在本地等待这些信息代表的系统状态达成后再进行这个读操作。
    • +
    • 这时, 我们之前所述的不确定的执行顺序就引入了不少的复杂性, 导致最开始的实现存在 bug: +
        +
      • 没有等待这个 index 之前的所有 index 代表的 log 都执行完就去执行了读操作。
      • +
      • 实际上步骤一中仅仅拿到 command id 还不够, 因为 log index 可能比 command id 代表的系统状态还要新, 因为我们 log 的执行是异步的, 没法推断出他们的顺序!
      • +
      +
    • +
    • 会出现 log 存储和 KV 存储不一致的情况
      +考虑这样的情况: 因为 log 持久化和 KV 持久化是异步进行的, 那么在某个节点上 KV 持久化可能比 log 持久化先完成, 那么这时候如果节点因为某种原因重启了, 它读出的是没有持久化之前的 log, 这会导致在恢复过程中, 同一条 log 被执行了两次, 而并不是所有的操作都是幂等的, 例如在同一条带有条件的事务(Predicate-Based Trasaction)执行两次是不幂等的. 这也说明了 KV 持久化必须是在 log 持久化之后才能进行的。
    • +
    +

    从以上问题可以得出结论, 异步持久化会带来很多额外的状态需要考虑, 使得系统状态难以推断和分析, 并且潜在的对性能带来一定影响。我们现在正在考虑使用同步的方案来代替异步落盘来简化系统实现, 尽管这可能会牺牲一部分性能, 但是性能始终应该是在正确性之后才需考虑的。

    +

    Revision 生成

    +

    在最开始的设计中, 我们希望 Xline 能够在兼容 etcd 的同时, 也能够保持 1-RTT 达到共识的性能。etcd 中有 revision 这一概念, 表示当前的系统修改的次数, 对于每个 kv 请求, 都需要返回一个 revision。因此我们最开始是(错误的)实现了 1-RTT 生成 revision 的方法。而最终事实证明, 在 1-RTT 中生成 revision 是不可行的。这一实现也导致 Jepsen 中涉及 revision 的测试(具体来说是 append)无法通过。

    +

    下面我来介绍我们旧的实现是怎么样的, 以及这个实现为什么是错误的, 最后讨论 1-RTT 生成 revision 为什么不可行。

    +

    背景

    +

    首先我们需要有一些 CURP 共识[4]的背景。CURP 实现 1-RTT 的原理是它在每个节点上有一个 witness, 在 command 执行前, client 需要把 command 记录到大多数 witness 上, 接下来直接在 leader 执行完不需要复制到 follower 上即可返回给 client, 因为 command 的信息以及记录在了 witness 上面, 及时集群少数节点崩溃也能够从 witness 上恢复出原来的 command。而 witness 上记录的 command 有两个特点:

    +
      +
    1. command 之间都是 commute 的
    2. +
    3. command 之间没有顺序
    4. +
    +

    这其实就是和 Generalized Paxos[5]的实现非常接近, 都是利用 commands 之间的 commutativity 来优化请求的时延。而 commutativity 这一特性也就决定了上述的 witness 中 command 的两个特点。因为 commutativity 的意思就是两个 commands 之间修改的 key 不能有交集, 不 commute 的 commands 必然是串行执行的。而 commute 的 commands 之间是可以并发执行的, 这就表示它们之间没有顺序。

    +

    旧的实现分析

    +

    旧的实现中, 每个节点都在本地给每个命令分配 revision, 这时候就要保证对于所有 commands, revision 分配的顺序必须相同。在每个节点的执行阶段前, 我们就会按照 log index 的顺序给每个节点分配 revision。这乍一看可能是正确的, 既然按照 log index 的顺序分配, 那么我们也不就在各个节点上分配 revision 的顺序也相同了吗? 但是, 我们忽略了一件事情, 在 witness 上可能还记录了 commands 的一些信息! 如果某个节点 crash 了从 witness 上恢复的时候, 它并不知道恢复的 commands 之间的顺序, 这样就会导致 revision 分配在不同节点上出现不同的顺序。

    +

    1-RTT 生成 revision 为什么不可行?

    +

    Revision 的想法对于 Raft 是很自然的, 就是将整个分布式系统抽象为一个状态机, revision 的数值就表示当前状态机所在的状态。这表明对于系统的所有的修改操作, 它们是有一个全局的顺序的。

    +

    对于 CURP 共识协议来说, 由于记录在 witness 上的 commands 是无序的(由于 client 的请求是并发的), 想要进行排序那么就必须额外地引入另外一个 RTT 来在各个 witness 上进行同步. 这样记录和排序的两步过程至少需要两个 RTT。

    +

    和 Generalized Paxos 相同, CURP 使用的 commutativity 就使得 commands 之间可能是没有顺序的, 那么所有 commands 形成的是一个偏序关系, 称为 command history[5]。在这种情况下, revision 的想法就不太适用了。

    +

    Generalized Consensus and Paxos 论文中, 作者其实也证明了在 Generalized Consensus 下想要确定任意两个命令之间的顺序是需要至少两个 message delays 的(Learning is impossible in fewer than 2 message delays), 下面是作者的证明[5]: +Suppose l learns a value proposed by p in one message delay. +Then it is possible that every message sent by p was lost except for ones +received by l. If all messages from p and l to other processes are lost, then +there is nothing to prevent another learner from learning a different value +proposed by another proposer, violating consistency.

    +

    iv.Xline 中的修复

    +
      +
    1. etcd 兼容性
    2. +
    3. 经过以上讨论, Xline 其实是没办法在兼容 etcd revision 的情况下依然保持 1-RTT 的高性能的. 所以在 etcd 的兼容层中, 我们需要等待每一个 command 都 commit 之后再给它分配 revison, 这样和 etcd 相同需要两个 RTT。
    4. +
    5. Append 测试
    6. +
    7. Append 测试中的事务测试使用了 Revision 来确保事务的原子性。Append 测试要求的是严格可系列化。在之前的讨论中, CURP 共识对于所有 commands 来说并没有一个全局的顺序, 所以这其实是违反了严格可序列化的要求的, CURP 的偏序关系事实上是只保证了可序列化。因此, 在 Xline 的测试中(非 etcd 兼容), 我们不能直接使用 Append 测试。或者说编写 Xline 的 Jepsen 测试应当将一致性模型更改为更弱的可序列化模型。
    8. +
    +

    References

    +

    [1]
    +P. B. Gibbons and E. Korach, “Testing shared memories,” Siam journal on computing, vol. 26, no. 4, pp. 1208–1244, 1997.
    +[2]
    +C. H. Papadimitriou, “The serializability of concurrent database updates,” Journal of the acm (jacm), vol. 26, no. 4, pp. 631–653, 1979.
    +[3]
    +“Jepsen consistency.” Available:
    +https://jepsen.io/consistency +[4]
    +S. J. Park and J. Ousterhout, “Exploiting commutativity for practical fast replication,” in 16th usenix symposium on networked systems design and implementation (nsdi 19), Boston, MA: USENIX Association, Feb. 2019, pp. 47–64. Available:
    +https://www.usenix.org/conference/nsdi19/presentation/park
    +[5]
    +L. Lamport, “Generalized consensus and paxos,” 2005.

    `;export{i as assetURLs,l as default,n as metadata,s as toc}; diff --git a/zh-cn/assets/index-07db2d14.js b/zh-cn/assets/index-c648bdf6.js similarity index 94% rename from zh-cn/assets/index-07db2d14.js rename to zh-cn/assets/index-c648bdf6.js index 61b1fc6..97a7805 100644 --- a/zh-cn/assets/index-07db2d14.js +++ b/zh-cn/assets/index-c648bdf6.js @@ -1,4 +1,4 @@ -const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",s="/zh-cn/assets/image4-034a33e9.png",t="/zh-cn/assets/image5-6a5e807d.png",o=[i,e,n,l,s,t],p={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},a=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],r=`

    自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

    +const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png",n="/zh-cn/assets/image2-b3df764b.png",l="/zh-cn/assets/image3-6b1d2584.png",t="/zh-cn/assets/image4-034a33e9.png",s="/zh-cn/assets/image5-6a5e807d.png",o=[i,e,n,l,t,s],p={label:"达坦科技2023开源毕业设计实习招募中",description:"自1984年Richard Stallman发起GMU和Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One的理念传播开后,之后的40年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了IT投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟",cover:"./cover.png",location:"海南",date:"2023-01-06",title:"Datan Technology 2023 Open Source Graduation Design Internship Recruitment"},r=[{label:"毕设项目的背景",level:2},{label:"细分方向",level:2},{label:"开源毕设导师组",level:2},{label:"开源毕设项目的流程",level:2},{label:"申请流程",level:2}],a=`

    自 1984 年 Richard Stallman 发起 GMU 和 Free Software Foundation,开源作为一种全新的软件开发和使用模式正式诞生。One for All, All for One 的理念传播开后,之后的 40 年里在开源软件社区被无数开发者实践和传承。开源软件因其节省费用(不需要购买许可证,大大降低了 IT 投入成本)、安全稳定(安全漏洞少)、技术成熟、个性化定制、自主知识产权等优势获得喜人的发展,由此我们也见证了无数开源软件项目的成长和成熟

    图片

    相比而言,硬件开源之路更为崎岖。因为对物理器件的依赖度更高,复杂度更高,修改难度大,硬件开源之路走得比较缓慢。虽然是一条少有人走的路,但其正确性毋庸置疑。开源芯片生态(Open Source Chip Ecosystem-OSCE)的优势,包括可以节约市场化时间,以及知识产权的成本,EDA 工具、设施和劳动力。硬件开发者也期盼硬件设计可以像软件设计一样简单。

    图片

    @@ -44,6 +44,6 @@ const i="/zh-cn/assets/cover-964a3e23.png",e="/zh-cn/assets/image1-c300ce2e.png"

    如果你对开源毕业设计感兴趣,对毕设的项目要求和细节解读有疑问,对毕设的申请及流程想咨询,欢迎大家参与 2023 年 1 月 8 日 20:00 的直播。

    欢迎您预约直播,或者登陆腾讯会议观看直播:

    -

    图片

    +

    图片

    对开源毕设感兴趣的朋友,欢迎添加小助手微信,加入达坦科技开源毕设群。

    -

    图片

    `;export{o as assetURLs,r as default,p as metadata,a as toc}; +

    图片

    `;export{o as assetURLs,a as default,p as metadata,r as toc}; diff --git a/zh-cn/assets/index-db271263.js b/zh-cn/assets/index-db271263.js new file mode 100644 index 0000000..a69977a --- /dev/null +++ b/zh-cn/assets/index-db271263.js @@ -0,0 +1,194 @@ +const l="/zh-cn/assets/cover-c8ddd07b.webp",i="/zh-cn/assets/image1-68a1977a.webp",o="/zh-cn/assets/image2-f875fe8b.webp",e=[l,i,o],t={label:"招聘不能停!达坦科技2024实习岗位等你来~",description:"达坦科技始终致力于打造高性能Al+ Cloud 基础设施平台DatenLord,积极推动AI应用的落地。DatenLord通过软硬件深度融合的方式,提供高性能存储和高性能网络。为AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对AI+Cloud 的需求。",cover:"./cover.webp",location:"中国香港",date:"2024-02-22",title:"Recruitment can't stop Dartan Technology 2024 internship positions waiting for you"},n=[{label:"01 我们是谁",level:2},{label:"02 我们是怎样的一群人",level:2},{label:"03 我们的公司文化是怎样的",level:2},{label:"04 达坦科技 2024 开放招募实习岗位",level:2},{label:"一、Rust 分布式存储开发(远程实习)",level:3},{label:"二、Rust 高性能网络系统开发 (远程实习)",level:3},{label:"三、AI 平台研发 (远程实习)",level:3},{label:"四、FPGA 开发(远程实习)",level:3},{label:"五、软硬件联合研发(远程实习)",level:3},{label:"六、数字 IC 前端设计(远程实习)",level:3},{label:"05 面试流程以及薪资待遇",level:2}],s=`

    封面

    +

    01 我们是谁

    +

    达坦科技始终致力于打造高性能 Al+ Cloud 基础设施平台 DatenLord,积极推动 AI 应用的落地。 DatenLord 通过软硬件深度融合的方式,提供高性能存储和高性能网络。为 AI 应用提供弹性、便利、经济的基础设施服务,以此满足不同行业客户对 AI+Cloud 的需求。

    +

    02 我们是怎样的一群人

    +

    达坦科技创始团队均来自谷歌、微软、阿里等知名科技公司,团队成员都是一群喜欢并勇于探索前沿技术的同学,大家因为对技术的热爱而聚到一起。

    +

    在这里我们不局限于工作职责本身,更鼓励大家能勤于思考学习,找到自己感兴趣的事情,创造更多价值。

    +

    03 我们的公司文化是怎样的

    +
      +
    • 持续学习 持之以恒的自驱学习,求真求致
    • +
    • 积极主动 遇到问题主动踏出第一步,做先行者而不是追随者
    • +
    • 精益求精 对自己高标准严要求,对创新有极致追求
    • +
    +

    与一群真正热爱自己所做的事情并追求挑战的人为伍!

    +

    04 达坦科技 2024 开放招募实习岗位

    +

    一、Rust 分布式存储开发(远程实习)

    +

    【岗位职责】参与高性能分布式存储系统研发,涉及的开发内容包括但不限于:

    +
      +
    1. 分布式数据一致性协议;
    2. +
    3. 高速网络传输接口、驱动;
    4. +
    5. 分布式缓存、数据管理服务;
    6. +
    7. 对象存储接口;
    8. +
    9. 文件存储接口;
    10. +
    11. 块存储接口。
    12. +
    +

    【岗位要求】

    +
      +
    1. 熟悉 Rust 和 C 语言;
    2. +
    3. 熟悉多线程、高并发编程;
    4. +
    5. 熟悉 Docker 和 K8S 等容器相关工具;
    6. +
    7. 熟悉 Linux 操作系统;
    8. +
    9. 具有很强的学习能力,自我驱动以及团队合作意识。
    10. +
    +

    【加分项】

    +
      +
    1. 熟悉 Rust 异步编程、有 tokio 或 async-std 使用经验优先;
    2. +
    3. 熟悉 Linux 内核 IO 相关功能,有 io_uring、ext4、FUSE、eBPF 相关开发经验优先;
    4. +
    5. 有 Linux 内核模块、驱动相关开发经验优先;
    6. +
    7. 有 lock-free 编程经验优先;
    8. +
    9. 熟悉分布式一致性协议 Paxos 或 Raft 优先;
    10. +
    11. 有 DPDK 或 RDMA 等高性能网络编程经验优先;
    12. +
    13. 有 SPDK、Ceph、Key-Value 等存储相关编程经验优先;
    14. +
    15. 有 K8S 的 CSI 接口编程经验优先;
    16. +
    17. 能长期实习优先。
    18. +
    +

    二、Rust 高性能网络系统开发 (远程实习)

    +

    【岗位职责】
    +参与研发高性能网络系统开发,涉及的工作包括但不限于:

    +
      +
    1. 网络硬件 Linux 驱动开发;
    2. +
    3. 网络流量控制算法设计与实现;
    4. +
    5. 网络仿真系统开发与测试。
    6. +
    +

    【岗位要求】

    +
      +
    1. 熟悉 Rust 和 C 语言;
    2. +
    3. 熟悉多线程、高并发编程;
    4. +
    5. 熟悉 Docker、KVM 等容器和虚拟化相关工具;
    6. +
    7. 熟悉 Liux 操作系统网络管理相关功能;
    8. +
    9. 具有很强的学习能力,自我驱动以及团队合作意识。
    10. +
    +

    【加分项】

    +
      +
    1. 熟悉 Rust 异步编程、有 tokio 或 async-std 使用经验优先;
    2. +
    3. 熟悉 Linux 内核 IO 相关功能,有 eBPF、XDP 相关开发经验优先;
    4. +
    5. 有 Linux 内核网络模块相关开发经验优先;
    6. +
    7. 有无损以太网流量控制相关的开发经验优先;
    8. +
    9. 熟悉常见流量控制算法优先,诸如 BBR、CUBIC、QCN 等;
    10. +
    11. 有 DPDK 或 RDMA 等高性能网络编程经验优先;
    12. +
    13. 有 P4、OpenFlow、NS3、SONiC 等相关编程经验优先;
    14. +
    15. 有 K8S 的 CNI 接口编程经验优先;
    16. +
    17. 能长期实习优先。
    18. +
    +

    三、AI 平台研发 (远程实习)

    +

    【岗位职责】

    +
      +
    1. 负责大模型平台后端的开发研发,根据产品和项目计划按时完成功能模块的架构设计、编码、测试的全流程工作。
    2. +
    3. 负责持续优化系统架构,提供高并发的数据请求分析的处理能力,提高系统的容灾容错能力,保证系统的可运维、高可用性、高可靠性。
    4. +
    +

    【岗位要求】

    +
      +
    1. 具备全面的软件知识结构,基础扎实,熟悉常用数据结构与算法。
    2. +
    3. 熟练使用 Python 语言,熟悉使用常用模块,完成过基于 Python 的中大型项目。
    4. +
    5. 熟练使用 MySQL、Redis、Nginx、Flask、MongoDB 等。
    6. +
    7. 熟悉 Linux 操作,了解 Shell 脚本,有 Linux 下的多线程编程经验,有性能调优经验。
    8. +
    9. 有开源项目贡献经验者优先。
    10. +
    11. 熟悉机器学习,能够使用 PyTorch、TensorFlow 等框架者优先。
    12. +
    13. 熟悉网络编程的基本模型和方法,有实际项目的开发经验者优先。
    14. +
    +

    四、FPGA 开发(远程实习)

    +

    【岗位职责】

    +
      +
    1. 负责基于 FPGA 实现网络 IO 加速,以及加密、压缩、编码等算法加速的设计与 RTL 实现;
    2. +
    3. 实现常用外设接口 IP 的 RTL 设计、集成和验证;
    4. +
    5. 参与 SoC 集成设计与验证;
    6. +
    7. 撰写相关设计文档。
    8. +
    +

    【岗位要求】

    +
      +
    1. 熟悉基于 FPGA 的设计流程,熟悉 Xilinx 的 FPGA 芯片架构,熟练掌握 Xilinx 的 FPGA 开发工具;
    2. +
    3. 熟悉 Bluespec、SpinalHDL、Chisel 或 Clash 等新一代 HDL 语言;
    4. +
    5. 熟练掌握 Verilog、SystemVerilog 或 VHDL 语言;
    6. +
    7. 熟悉 SystemVerilog Assertion 的使用;
    8. +
    9. 熟练掌握 TCL 脚本语言;
    10. +
    11. 具有很强的学习能力,自我驱动以及团队合作意识;
    12. +
    +

    【加分项】

    +
      +
    1. 有网络或存储硬件系统开发经验优先;
    2. +
    3. 熟悉 PCIe、DMA、NVMe、DDR3/4、SerDes 等相关接口开发优先;
    4. +
    5. 有 DSP 领域相关经验、熟悉 LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;
    6. +
    7. 熟悉 AXI、ACE、CHI 等 AMBA 总线协议;
    8. +
    9. 熟悉基于 Python 的仿真测试工具 Cocotb 优先;
    10. +
    11. 熟悉 TCP/IP 或 InfiniBand/RDMA 网络协议栈优先。
    12. +
    13. 能长期实习(6 个月以上)优先。
    14. +
    +

    五、软硬件联合研发(远程实习)

    +

    【岗位职责】
    +参与高性能存储 SoC 芯片的软硬件开发:

    +
      +
    1. 负责网络 IO 加速的 RTL 实现;
    2. +
    3. 负责加密、压缩、编码等算法加速的设计与 RTL 实现;
    4. +
    5. 负责 SoC 芯片的 Linux 驱动开发;
    6. +
    7. 负责实现软硬件联合调试与自动化测试。
    8. +
    +

    【岗位要求】

    +
      +
    1. 熟悉 IC 设计流程,熟悉常用的仿真、综合等 EDA 工具;
    2. +
    3. 熟悉 Xilinx 的 FPGA 设计流程,熟练掌握 Xilinx 的 FPGA 开发工具;
    4. +
    5. 熟悉 Bluespec、SpinalHDL 或 Chisel 等新一代 HDL 语言;
    6. +
    7. 熟练掌握 Verilog、SystemVerilog 和 SystemC 语言;
    8. +
    9. 熟悉 Linux 开发内核模块、驱动;
    10. +
    11. 熟悉基于 QEMU 的软硬件联合调试工具链;
    12. +
    13. 具有很强的学习能力,自我驱动以及团队合作意识。
    14. +
    +

    【加分项】

    +
      +
    1. 有网络或存储硬件系统开发经验优先;
    2. +
    3. 熟悉 TCP/IP 或 InfiniBand/RDMA 网络协议栈优先;
    4. +
    5. 熟悉 CXL、PCIe、AXI、ACE、CHI、NVMe 等协议接口开发优先;
    6. +
    7. 有 DSP 领域相关经验,熟悉 LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;
    8. +
    9. 有 Linux 内核网络、文件、存储相关开发经验优先;
    10. +
    11. 熟悉 Rust for Linux 开发内核模块、驱动开发经验优先;
    12. +
    13. 能长期实习(6 个月以上)优先。
    14. +
    +

    六、数字 IC 前端设计(远程实习)

    +

    【岗位职责】
    +参与高性能存储 SoC 芯片开发:

    +
      +
    1. 负责实现网络 IO 加速,以及加密、压缩、编码等算法加速的设计与 RTL 实现;
    2. +
    3. 负责实现 SoC 的集成、综合与原型验证;
    4. +
    5. 负责实现常用外设接口 IP 的 RTL 设计、集成;
    6. +
    7. 撰写相关设计文档。
    8. +
    +

    【岗位要求】

    +
      +
    1. 熟悉数字 IC 的开发工具链;
    2. +
    3. 熟悉 Bluespec、SpinalHDL 或 Chisel 等新一代 HDL 语言;
    4. +
    5. 熟练掌握 Verilog、SystemVerilog、SystemC 语言;
    6. +
    7. 熟悉 SystemVerilog Assertion 的使用;
    8. +
    9. 熟练掌握 TCL 脚本语言;
    10. +
    11. 具有很强的学习能力,自我驱动以及团队合作意识。
    12. +
    +

    【加分项】

    +
      +
    1. 有网络或存储硬件系统开发经验优先;
    2. +
    3. 熟悉 TCP/IP 或 InfiniBand/RDMA 网络协议栈优先;
    4. +
    5. 熟悉 CXL、PCIe、AXI、ACE、CHI、NVMe 等协议接口开发优先;
    6. +
    7. 有加密和编码领域相关经验,熟悉 LDPC、喷泉码、椭圆曲线加密算法和零知识证明算法优先;
    8. +
    9. 熟悉基于 Python 的仿真测试工具 Cocotb 优先;
    10. +
    11. 有形式化验证相关经验优先;
    12. +
    13. 能长期实习优先。
    14. +
    +

    05 面试流程以及薪资待遇

    +

    【如何申请】
    +有意向的同学可以发送简历至:
    +info@datenlord.com
    +或者添加达坦科技小助手微信:
    +DatenLord_Tech

    +

    【面试流程】
    +简历评估合格后,面试流程为:

    +

    图片

    +

    具体面试流程会根据候选人的情况略有调整。

    +

    【薪资待遇】
    +实习生: 入职初期为 300 元/天,如能力和产出优秀将予以薪资调增,最高 500 元/天。
    +正式员工: 对标国内一线大厂的薪资+期权,待面试通过后根据能力情况确定。

    +

    【更多官方信息】
    +【公众号】达坦科技 DatenLord
    +【知乎账号】
    +https://www.zhihu.com/org/da-tan-ke-ji
    +【B 站】
    +https://space.bilibili.com/2017027518

    +

    我们相信物以类聚、人以群分,希望找到同样富有激情的你,一起成长~

    +

    更多信息,可扫描下方二维码加微信咨询:

    +

    图片

    `;export{e as assetURLs,s as default,t as metadata,n as toc}; diff --git a/zh-cn/assets/index-8cb22688.js b/zh-cn/assets/index-dfd283a0.js similarity index 95% rename from zh-cn/assets/index-8cb22688.js rename to zh-cn/assets/index-dfd283a0.js index 067cc07..3bca56e 100644 --- a/zh-cn/assets/index-8cb22688.js +++ b/zh-cn/assets/index-dfd283a0.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应用前景探索线上研讨会----征集演讲嘉宾",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。",location:"中国香港",date:"2023-11-09",title:"Exploring the Future of SpinalHDL Applications in 2023 Online Workshop"},i=[{label:"SpinalHDL 是什么?",level:2},{label:"达坦科技是谁?",level:2},{label:"为什么达坦科技要推广 SpinalHDL?",level:2},{label:"Call For Presenter",level:2}],p=`

    SpinalHDL 是什么?

    +const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应用前景探索线上研讨会----征集演讲嘉宾",description:"SpinalHDL是一种开源的高级硬件描述语言,它可以作为VHDL或Verilog的替代,Charles Papon 在2014年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于Scala的DSL,能够借助现有的Scala语言特性和开发工具提供强大、易用、高效的硬件设计能力。",location:"中国香港",date:"2023-11-09",title:"Exploring the Future of SpinalHDL Applications in 2023 Online Workshop"},p=[{label:"SpinalHDL 是什么?",level:2},{label:"达坦科技是谁?",level:2},{label:"为什么达坦科技要推广 SpinalHDL?",level:2},{label:"Call For Presenter",level:2}],i=`

    SpinalHDL 是什么?

    SpinalHDL 是一种开源的高级硬件描述语言,它可以作为 VHDL 或 Verilog 的替代,Charles Papon 在 2014 年创建后,伴随着数年来开源硬件设计的蓬勃发展,在多方面显露出优势,譬如:它专注于高效的硬件描述,而不是事件驱动;作为一种基于 Scala 的 DSL,能够借助现有的 Scala 语言特性和开发工具提供强大、易用、高效的硬件设计能力。

    达坦科技是谁?

    达坦科技(DatenLord)致力于打造高性能跨云存储,其通过软硬件深度融合的方式打破云之间的壁垒,实现高性能跨云数据访问,提供海量异地、异构数据的统一存储访问机制,为云上应用提供高性能安全存储支持。

    @@ -18,4 +18,4 @@ const l="/zh-cn/assets/image1-50beaba8.png",a=[l],n={label:"2023年SpinalHDL应

    如您有意向社区,以及 SpinalHDL 的爱好者做分享,请于 2023 年 11 月 30 日之前,直接将姓名(或 GitHub 昵称)+ 议题摘要提交至以下 GitHub 链接:
    https://github.com/SpinalHDL/SpinalHDL/discussions/1235

    图片

    -

    对开源硬件感兴趣的朋友可以添加达坦科技小助手微信加入达坦科技硬件群。

    `;export{a as assetURLs,p as default,n as metadata,i as toc}; +

    对开源硬件感兴趣的朋友可以添加达坦科技小助手微信加入达坦科技硬件群。

    `;export{a as assetURLs,i as default,n as metadata,p as toc}; diff --git a/zh-cn/assets/index-405a2dbf.js b/zh-cn/assets/index-e57be735.js similarity index 97% rename from zh-cn/assets/index-405a2dbf.js rename to zh-cn/assets/index-e57be735.js index b354475..e604924 100644 --- a/zh-cn/assets/index-405a2dbf.js +++ b/zh-cn/assets/index-e57be735.js @@ -1,4 +1,4 @@ -const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg",e=[n,s],t={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},o=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],a=`

    封面

    +const n="/zh-cn/assets/cover-99998007.jpg",e="/zh-cn/assets/image1-6f9cec09.jpg",s=[n,e],t={label:"精彩回顾|硬件敏捷开发与验证方法学研讨",description:"8月27日,作为2022年第二届RISC-V中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代HDL在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。",cover:"./cover.jpg",location:"中国香港",date:"2022-09-08",title:"Discussion on Hardware Agile Development and Verification Methodology"},o=[{label:"芯片敏捷设计与验证之路",level:2},{label:"香山处理器敏捷开发与验证实践",level:2},{label:"通过 Chainsaw 实现硬件算子敏捷开发",level:2},{label:"Scala 在 IC 开发中的应用",level:2},{label:"NaxRiscv CPU: Introduction and Extension Demonstration",level:2},{label:"结束语",level:2}],a=`

    封面

    8 月 27 日,作为 2022 年第二届 RISC-V 中国峰会的同期活动,达坦科技成功举办硬件敏捷开发与验证方法学研讨。虽然是线上分享活动,但大家热情依旧,会后在“硬件敏捷开发和验证方法学讨论群”中积极互动提问。长达四小时的就新一代 HDL 在数字芯片设计方面的实践经验分享,究竟碰撞出了什么新的火花呢?下面我们一起来回顾研讨会的精彩内容。

    芯片敏捷设计与验证之路

    华南理工大学计算机科学与工程学院赖晓铮副教授首先分享了 “让硬件设计像软件设计一样简单”的愿景,即开发人员编写的代码只占工作量的 10%,剩下 90%由开源芯片生态系统提供。

    @@ -23,4 +23,4 @@ const n="/zh-cn/assets/cover-99998007.jpg",s="/zh-cn/assets/image1-6f9cec09.jpg"

    请点击如下链接:
    https://t.elecfans.com/live/2113.html收看本次研讨会的回放。
    也欢迎添加小助手微信,加入“硬件敏捷开发和验证方法学讨论群”,进行延伸讨论与互动,并第一时间获得后续相关活动的讯息。

    -

    图片

    `;export{e as assetURLs,a as default,t as metadata,o as toc}; +

    图片

    `;export{s as assetURLs,a as default,t as metadata,o as toc}; diff --git a/zh-cn/assets/index-4b4d6acc.js b/zh-cn/assets/index-f42f30bc.js similarity index 98% rename from zh-cn/assets/index-4b4d6acc.js rename to zh-cn/assets/index-f42f30bc.js index abb2b0a..26fcd30 100644 --- a/zh-cn/assets/index-4b4d6acc.js +++ b/zh-cn/assets/index-f42f30bc.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",h="/zh-cn/assets/image11-c5d501bb.png",d="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",S="/zh-cn/assets/image19-fb1e5167.png",y="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,h,d,m,u,b,g,f,R,S,y],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},M=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],F=`

    图片

    +const e="/zh-cn/assets/cover-1329fc54.png",l="/zh-cn/assets/image1-03c3323d.png",s="/zh-cn/assets/image2-19f32eff.png",i="/zh-cn/assets/image3-7a5e2db9.png",a="/zh-cn/assets/image4-a055bd84.png",t="/zh-cn/assets/image5-b8622f96.png",p="/zh-cn/assets/image6-5093ee75.png",n="/zh-cn/assets/image7-9fa09d91.png",o="/zh-cn/assets/image8-84dd6aec.png",c="/zh-cn/assets/image9-2f762488.png",r="/zh-cn/assets/image10-f2b55246.png",d="/zh-cn/assets/image11-c5d501bb.png",h="/zh-cn/assets/image12-56434254.png",m="/zh-cn/assets/image13-1c12a6c5.png",u="/zh-cn/assets/image14-69943dbe.png",b="/zh-cn/assets/image15-45a7b638.png",g="/zh-cn/assets/image16-5b765721.jpg",f="/zh-cn/assets/image17-8fb19d7c.jpg",R="/zh-cn/assets/image18-c8c4d5a1.jpg",y="/zh-cn/assets/image19-fb1e5167.png",S="/zh-cn/assets/image20-a391e7d8.jpg",_=[e,l,s,i,a,t,p,n,o,c,r,d,h,m,u,b,g,f,R,y,S],v={label:"计算机体系结构|MIT6.175和MIT6.375学习笔记",description:"在2023年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了MIT6.175和MIT6.375的关键内容以及Lab实践的学习笔记。",cover:"./cover.png",location:"中国香港",author:["kazutoiris"],tags:["硬件加速"],date:"2023-05-17",title:"Computer Architecture|MIT6.175 and MIT6.375 Study Notes"},M=[{label:"MIT 6.175",level:2},{label:"环境搭建",level:3},{label:"四种 FIFO (Lab 4)",level:3},{label:"Ready 和 Valid 握手",level:3},{label:"EHR 寄存器 (Lab4)",level:3},{label:"RISC-V (Lab5)",level:3},{label:"Branch Prediction (Lab6)",level:3},{label:"DDR3 Memory (Lab7)",level:3},{label:"Cache Coherence (Project)",level:3},{label:"MIT 6.375",level:2},{label:"Bluespec 中的一些特性",level:3},{label:"CORDIC 算法",level:3},{label:"一些常用的概念",level:2},{label:"Setup Time 、Hold Time 和 Clock-to-Q Time",level:3},{label:"SRAM",level:3},{label:"DRAM",level:3},{label:"References",level:2}],F=`

    图片

    在 2023 年初,达坦科技发起成立硬件设计学习社区,邀请所有有志于从事数字芯片设计的同学加入我们的学习互助自学小组,以理解数字芯片设计的精髓,强化理论知识的同时提升实操技能,继而整体提升设计能力。现在,完成第一期学习的同学整理了 MIT6.175 和 MIT6.375 的关键内容以及 Lab 实践的学习笔记

    6.175 和 6.375 的课程和 Lab 学习都有一定的难度,要求采用 Bluespec 语言实现 RISC-V 处理器,并支持多级流水、分支预测、缓存、异常处理、缓存一致性等功能。此外,Lab 环节还涉及软硬件联合开发,要求基于所实现的 RISC-V 处理器运行真实的 RISC-V 程序,并给出性能评估。希望第一期学员(GitHub:kazutoiris )的学习笔记对想从事数字芯片设计的工程师有所帮助。

    MIT 6.175

    @@ -223,12 +223,12 @@ case class Delay3() extends C
    1. MESI
    -

    图片

    +

    图片

    MESI 协议将“Exclusive”状态添加到 MSI 状态机中,可以减少只在单个缓存中存在的缓存行的回写次数。

    1. MOSI
    -

    图片

    +

    图片

    MOSI 协议将“Owner”状态添加到 MSI,可以减少由从其他处理器读取而触发的写回操作。

    1. MOESI
    2. @@ -346,7 +346,7 @@ Memory Consistency → 内存连贯性

      具有两套完整的读写字线和读写位线。
      All the images in this section are cited from [宇芯电子].

      DRAM

      -

      图片

      +

      图片

      1. DRAM 写
      @@ -380,4 +380,4 @@ All the images in this section are cited from [宇芯电子].


    达坦科技硬件设计学习社区持续开放,点击原文了解社区学习详情。若想询问加入细节,请添加下方小助手微信号或info@datenlord.com

    -

    图片

    `;export{_ as assetURLs,F as default,v as metadata,M as toc}; +

    图片

    `;export{_ as assetURLs,F as default,v as metadata,M as toc}; diff --git a/zh-cn/assets/index-c719bd5c.js b/zh-cn/assets/index-f6eeef5e.js similarity index 97% rename from zh-cn/assets/index-c719bd5c.js rename to zh-cn/assets/index-f6eeef5e.js index 2516e15..77dbcfc 100644 --- a/zh-cn/assets/index-c719bd5c.js +++ b/zh-cn/assets/index-f6eeef5e.js @@ -1,4 +1,4 @@ -const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],r={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},s=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

    共识简介

    +const e="/zh-cn/assets/image1-86fdf634.png",t="/zh-cn/assets/image2-639b53e5.png",a="/zh-cn/assets/image3-c2c092f7.jpg",p=[e,t,a],s={label:"Curp 共识协议的重新思考",description:"共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如Multi-Paxos 和Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。",location:"中国香港",tags:["Xline"],date:"2022-07-07",title:"Rethinking of the Curp Consensus Protocol"},r=[{label:"共识简介",level:2},{label:"Curp 共识协议",level:2},{label:"Curp 协议总结和讨论",level:2}],l=`

    共识简介

    共识协议是一种让分布式系统中多个节点保持信息一致的通信协议,即使少数节点发生故障也依然能够保证信息的准确和一致。而每当我们在讨论共识协议的时候往往会想到 classic paxos 或者 raft 协议,这两个协议是很多其他协议的基础,后续的很多协议都可以看成是它们的变种,例如 Multi-Paxos 和 Fast-Paxos 等等。我们今天先从这两个协议入手,先来回顾一下这两个协议是如何工作的。

    首先来看 classic paxos 协议,如下图所示。Paxos 分为两个阶段(Phase),第一个阶段是 Prepare,主要任务是在 Log 上占一个 Slot,第二个阶段为 Accept,主要是确定这个 Slot 已经明确被占用了,且在两个阶段间没有被其他人抢占。当 Client 收到绝大多数人的 Accept Ok 回复之后,说明该条记录已经被提交,在整个系统达成了共识。这里 Client 和 Proposer 可以视为一个整体,整个过程在两个阶段分别有一次消息传递,总共发生两次消息传递。

    图片

    @@ -38,4 +38,4 @@ A5:首先恢复流程需要选举一个新的 Master(Leader),该流程和 Ra

    Curp 协议总结和讨论

    通过上一个章节的论述,我们不难发现 Curp 协议和 Raft 协议非常像,其中的不同点就在于“等待池子”,这个池子的目的在于给冲突的请求排序,多个冲突请求一定不能被所有节点的“池子”同时接受,此时最多只有一个请求被 commit,也有可能所有请求都需要等待 master 的同步。也就是这个改动,让协议在某些情况下有更优秀的性能表现。

    所以总结一下, Curp 协议在乐观情况下一个消息传递就能达到共识,悲观情况下会退化成 Raft 协议,需要两个消息传递才能达成共识。

    -

    关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

    `;export{p as assetURLs,l as default,r as metadata,s as toc}; +

    关于 Curp 协议的更多细节请参考原始论文:https://www.usenix.org/system/files/nsdi19-park.pdf

    `;export{p as assetURLs,l as default,s as metadata,r as toc}; diff --git a/zh-cn/assets/index-9d285d88.js b/zh-cn/assets/index-fe9ae8f0.js similarity index 98% rename from zh-cn/assets/index-9d285d88.js rename to zh-cn/assets/index-fe9ae8f0.js index 4f0b969..9b7e61a 100644 --- a/zh-cn/assets/index-9d285d88.js +++ b/zh-cn/assets/index-fe9ae8f0.js @@ -1,4 +1,4 @@ -const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

    无锁数据结构内存管理

    +const l="/zh-cn/assets/image1-130a4039.jpg",o=[l],a={label:"Rust语言无锁数据结构的内存管理",description:"正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。",location:"河南",author:["施继成"],tags:["Rust"],date:"2022-05-27",title:"Memory Management for Lock Free Data Structures in the Rust Language"},s=[{label:"无锁数据结构内存管理",level:2},{label:"Epoch-Based Reclamation",level:2},{label:"Rust 语言实现 EBR",level:2},{label:"总结",level:2}],p=`

    无锁数据结构内存管理

    正如大家所熟知的,无锁数据结构在并发访问中往往具有更好的访问效率和并发度。无锁数据结构的性能优势主要来自于以下两点:

    1. 数据结构的锁设计往往比较粗粒度,在很多可以并发访问的情况下,访问者被锁阻塞,无法实现并发访问。
    2. @@ -44,4 +44,4 @@ const l="/zh-cn/assets/image1-130a4039.jpg",a=[l],o={label:"Rust语言无锁数

    第一行和前面的例子类似,第二行的语义为从 map 中寻找 key 对应的 value,获取 value 的引用,其生命周期不超过 guard 的生命周期。通过生命周期的方法,我们限定了 value 引用的使用范围为 guard 的存活范围。

    总结

    -

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

    `;export{a as assetURLs,p as default,o as metadata,s as toc}; +

    本文简单介绍了 Epoch-Based Reclamation 内存管理方法,并且从接口层面介绍了 Rust 的实现和使用。同时本文也分析了 EBR 在性能上的优越性,以及 Rust 语言从语言实现的优势。之后我们还会从 crossbeam epoch 的实现细节给大家带来深入的 Rust EBR 实现的分析。

    `;export{o as assetURLs,p as default,a as metadata,s as toc}; diff --git a/zh-cn/index.html b/zh-cn/index.html index d7348d3..933eb05 100644 --- a/zh-cn/index.html +++ b/zh-cn/index.html @@ -5,7 +5,7 @@ 达坦科技 - +